解锁前端Vue3宝藏级资料 第三章 Vue Router路由器的使用

news2024/10/2 14:27:24

  Vue Router 是 Vue.js 的官方路由器。通过使用 Vue Router,你可以构建一个包含多个页面的应用程序。它可以样多个页面之间流畅地跳转,而无需每次移动到另一个页面时都要重新加载整个页面。Vue Router 路由是使用 Vue.js 构建单页应用项目的必备库。官网地址https://router.vuejs.org/zh/introduction.html

由一个 HTML 页面组成的应用程序称为单页应用程序 (SPA)。在由多个 HTML 文件组成的应用程序的情况下,使用浏览器功能移动页面,但在 SPA 中,通过使用 JavaScript 技术仅更新页面中的一部分内容来实现页面移动。

在vue项目中使用路由功能都需要先导入vue-router组件。

npm install vue-router@4

导入成功后会在项目package.json 文件中看到 “vue-router”: "^4.1.6"内容。

  "dependencies": {
    "vue": "^3.2.41",
    "vue-router": "^4.1.6"
  },

SPA 是单页应用程序的缩写。

通常在一个页面内搜索或导航到另一个页面时,屏幕会同步刷新。

第一章 Vue3项目创建 1 Vue CLI 创建vue项目
第一章 Vue3项目创建 2 使用 Webpack 5 搭建 vue项目
第一章 Vue3项目创建 3 Vite 创建 vue项目
第二章 Vue3 基础语法指令
第三章 Vue Router路由器的使用

3.1 创建路由

创建一个简单的路由项目,需要以下五项基本设置。

  • 创建路由配置文件(router.js)
  • 创建跳转页面组件(zht.vue)
  • 在 Vue 实例 (main.js) 中将路由注册到实例中。
  • 在路由控制页面中加入 RouterView 组件,用于显示加载路由中的页面。
  • 在路由控制页面中加入 RouterLink 组件中设置跳转其他页面的链接功能。

项目结构

zht-vite-vue
   |---node_modules
   |---index.html        //运行html
   |---src               //代码源文件
   |    |--zht           //组件目录
   |    |   |---zht.vue  //模块代码
   |    |--main.js       //入口文件
   |    |--App.vue       //模板代码
   |    |--router.js     //路由控制器   
   |----package.json     //配置文件

1 创建路由配置文件router.js

import { createRouter, createWebHistory } from 'vue-router'
import Home from './zht/zht.vue'
const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL),
    routes: [
      {
        path: '/zht',
        name: 'zht',
        component:Home
      },
      {
        path: '/about',
        name: 'about',
        component: () => import('../src/zht/zht.vue')
      }
    ]
  })
  export default router

2 zht.vue页面

在zht目录中创建一个被访问页面zht.vue。

<script setup>
</script>
<template>
  <h1>路由访问到我了zht页面</h1>
</template>

3 将路由注册到实例中(main.js)

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
const app = createApp(App)
app.use(router)
app.mount('#app')

4 页面router-view 与 router-link 使用(App.vue)

<script setup>
</script>
<template>
  <h1>Vue 3 路由</h1>
  //路由跳转连接
  <router-link to="/zht">zht</router-link>
  <br>
  <router-link to="/about">about</router-link>
  //路由内容显示地址  将路由中的组件注册到App 组件
  <RouterView />
</template>
  • router-link 标签用于创建移动页面的链接。
  • router-view 标签用于显示链接后的页面内容。
    在这里插入图片描述
    出了使用router-link 标签外,也可以使用a标签的连接器来访问路由中的页面。
  <header>
    <nav>
      <a href="/zht">Home</a>
      <a href="/about">About</a>
    </nav>
  </header>

Vue路由Router示意图

在这里插入图片描述

3.2 延迟加载

  路由在加载页面的时候会分为两种模式,一种是正常模式,一种是延迟加载,开发者可以根据自己项目需要来选择适合自己项目的模式。两种模式主要的区别就在有在路由类中引入的方法上。

  • 普通 import导入组件。
  • 延迟 使用加载component:()=>import(‘’)组件。

1 普通加载

  通过import 导入的vue组件,在将导入组件的引用以参数的方式设置给路由类中对应的路径对象中的component属性。这种方式称谓普通加载。

import { createRouter, createWebHistory } from 'vue-router'
import zht1 from './zht/zht.vue'
import zht2 from './zht/zht.vue'
const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL),
    routes: [
      {
        path: '/zht1',
        name: 'zht1',
        component:zht1
      },
      {
        path: '/zht2',
        name: 'zht2',
        component:zht2
      }
    ]
  })
  export default router

  项目启动后,使用浏览器开发人员工具的网络选项卡中可以看到zht.vue页面已经和路由组件一起加载到浏览器内存中。我们看到了当浏览器进入路由控制页面时候,那些路由器类中被设置成普通加载的页面,都会同时被加载到浏览器内存中。
在这里插入图片描述

  由于已经在浏览器内存中下载了 zht.vue 文件,因此页面上路由路径跳转到 /zht页面时无需额外下载,直接使用到zht.vue模板内容。

  运行 npm run build 命令后,我们来查看生产环境中的构建出来的代码是否有什么变化。运行构建后可以看到在 dist/assets 文件夹下打包了一个 index.XXX.js 文件。稍后我们与延迟加载后的构建文件进行比较,大家就能看到区别了。

2 延迟加载

通过component: () => 的加载vue组件的方式为延迟加载方式。

import { createRouter, createWebHistory } from 'vue-router'
import zht1 from './zht/zht.vue'
const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL),
    routes: [
      {
        path: '/zht1',
        name: 'zht1',
        component:zht1
      },
      {
        path: '/zht2',
        name: 'zht2',
        //延迟加载lazy-loaded
        component:()=>import('./zht/zht2.vue'),
      }
    ]
  })
  export default router

浏览器开发人员工具中的网络选项卡中我们没有看到zht2.vue模板被加载进入浏览器缓存中。
在这里插入图片描述

当我们在页面中点击路由连接,进入zht2.vue页面中,这个时候浏览器才加载zht2.vue模板页面到浏览器缓存中。
在这里插入图片描述

  当执行npm run build 命令创建生产环境的构建文件时,在 dist/assets 文件夹可以看到zht2.XXX.js 与index.XXX.js 文件是分开创建的,这与之前的普通加载不同,之前普通加载模式都是将打包代码创建在一个构建文件中。

  这样创建多个构建文件称为代码拆分。通过将其分成多个 JavaScript 文件而不是单个 JavaScript 文件,我们可以减少首次访问时的下载构建文件大小。由于只有在有访问权限的情况下才会下载相关的JavaScript文件,所以不需要下载那些我们没有使用到的JavaScript文件。

3.3 配置动态路由

  静态路由是url静态路径例如:/(route) 或/about不能传参数值,这样的路径在开发和使用的时候就很多问题无法解决,没有办法进行页面之间的参数传递。这个时候需要使用到能在url路径中传递参数的功能,我们将有这种的路由称为动态路由。

1 创建一个列表集合

​  在App.vue文件中将写入下面的代码内容,将反应函数中的集合属性映射到路由路径中作为参数,将它传递到接收页面中去。在这里我们将users列表中的id属性赋值到路由路径中去,在接收页面中获得到这个id信息。

<script setup>
import { ref, onMounted } from 'vue';
const users = ref([
  { id: 1, name: 'zht', email: 'zht114001@163.com', admin: true },
  { id: 2, name: 'kaimi', email: 'jane@163.com', admin: false },
  { id: 3, name: 'fun', email: 'fun@163.com', admin: false },
]);
</script>
<template>
  <h1>Vue 3 路由</h1>
  <h2>Users列表</h2>
  <ul>
    <li v-for="user in users" :kye="user.id">
      <RouterLink :to="`/zht2/${user.id}`">{{ user.name }}</RouterLink> 
    </li>
  </ul>
  <RouterView />
</template>

2 配置动态路由(router.js)

import { createRouter, createWebHistory } from 'vue-router'
import zht1 from './zht/zht.vue'
const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL),
    routes: [
      {
        path: '/zht1',
        name: 'zht1',
        component:zht1
      },
      {
        path: '/zht2/:id',--------------------------------------------name: 'zht2',
        component:()=>import('./zht/zht2.vue'),
      }
    ]
  })
  export default router

  在动态变化的 id 前设置一个 :(冒号),动态路由参数都是在url后加冒号加参数(/zht2/:id)表示动态传递参数给路由。

3 业务页面

在项目中的zht目录下创建zht2.vue文件,在文件中写入下面的代码。

<script setup>
import { useRoute } from 'vue-router';
const route = useRoute();
alert(route.params);
</script>
<template>
  <h2>User内容</h2>
  <p>User Id: {{ $route.params.id }}</p>
</template>

我们如何获得url中包含的id值,这就需要使用到useRoute 路由的全局变量这个类。通过路由的 useRoute对象的params中来获得id值。

userRoute对象需要在vue-router包中引入

const route = useRoute(); 获得路由器引用对象

route.params 获得路由中的参数集合

route.params .参数名称 获得路径中的参数

在模板中可以使用 $route 对象直接访问到 params 获得路由中的参数集合。例如 $route 对象的 params.id。
在这里插入图片描述

假设我们要更换一个路径中的参数名称,需要在路由类中找到它对应的路径配置对象,在这个对象中将参数名称修改为要更改的参数名称。我们将参数名称id改为userId,在路由获得时候对应的名称也需要改变。

import { createRouter, createWebHistory } from 'vue-router'
import zht1 from './zht/zht.vue'
const router = createRouter({
      {
        path: '/zht2/:userId',---|
        name: 'zht2',            |
      }                          |
    ]                            |
  })                             |
// 迁移页面zht2.vue中获得这个值      |
const route = useRoute();        |
const user = ref([]);            |
const id = parseInt(route.params.userId);

3.4 监听动态参数变化

我修改一下路由业务页面加入信息查询显示功能。

<script setup>
import { ref,onMounted  } from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
const user = ref([]);
const id = parseInt(route.params.id);
const users = [
  { id: 1, name: 'zht', email: 'zht114001@163.com', admin: true },
  { id: 2, name: 'kaimi', email: 'jane@163.com', admin: false },
  { id: 3, name: 'fun', email: 'fun@163.com', admin: false },
];

onMounted(async () => {
    user.value=users[id-1];
});
</script>

<template>
<RouterLink to="/zht2">返回</RouterLink>
  <h2>User信息 获得id:{{id}}</h2>
  <ul>
    <li>User Id: {{ user.id }}</li>
    <li>User Name: {{ user.name }}</li>
    <li>User Email: {{ user.email }}</li>
  </ul>
</template>

  加入返回功能按钮。单击后退链接返回到用户列表,并确认单击不同的用户名会将您带到所单击用户的详细信息页面。动态路由配置现已完成。

  这个时候在使用的时候大家会发现问题,当第一次访问页面的时候页面内容会出变化,当再次访问页面的时候页面中的内容就不会在发生任何变化了。只有点击一次返回将路由内容清空,在点击列表中的内容,路由页面中的元素才会在发生变化。
在这里插入图片描述
为什么页面内容不更新呢?

  这是因为每次介入新的页面中都会重用了UserView组件,但是程序又没有执行该组件的卸载过程,同时也没有执行框架生命周期钩子的挂载过程(onMounted)。

  为了能使/zht2/1和/zht2/2都会更新页面,我们需要监听id值的变化,以便在params的id值更新时进行数据获取过程,需要做吧。使用watch函数可以监控id值的更新。

import { ref,onMounted,watch  } from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
onMounted(async () => {
    watch(route, () => {
    const id = parseInt(route.params.id);
    user.value=users[id-1];
  });
});

通过将路由对象指定监听的参数,当点击 第一个链接将在控制台中显示 {id:‘1’} ,点击 第二 链接将显示 {id:‘2’} 。可以看到 watch 检测到 id 更新。

<script setup>
import { ref,onMounted,watch  } from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
const user = ref([]);
const users = [
  { id: 1, name: 'zht', email: 'zht114001@163.com', admin: true },
  { id: 2, name: 'kaimi', email: 'jane@163.com', admin: false },
  { id: 3, name: 'fun', email: 'fun@163.com', admin: false },
];
//监听路由值变化
onMounted(async () => {
    watch(route, () => {
    const id = parseInt(route.params.id);
    user.value=users[id-1];
  });
});
</script>
<template>
<RouterLink to="/zht2">返回</RouterLink>
  <h2>User信息 获得id:{{id}}</h2>
  <ul>
    <li>User Id: {{ user.id }}</li>
    <li>User Name: {{ user.name }}</li>
    <li>User Email: {{ user.email }}</li>
  </ul>
</template>

RouterLink 设置

  还有一种方法是在 RouterLink 组件上设置监听键值,来达到和上边一样的效果。

<script setup>
import { ref, onMounted } from 'vue';
const users = ref([
  { id: 1, name: 'zht', email: 'zht114001@163.com', admin: true },
  { id: 2, name: 'kaimi', email: 'jane@163.com', admin: false },
  { id: 3, name: 'fun', email: 'fun@163.com', admin: false },
]);
</script>
<template>
  <h1>Vue 3 路由</h1>
  <router-link to="/zht1">zht</router-link>
  <br>
  <router-link to="/zht2">about</router-link>
  <h2>Users列表</h2>
  <ul>
    <li v-for="user in users" :kye="user.id">
      <RouterLink :to="`/zht2/${user.id}`">{{ user.name }}</RouterLink> 
    </li>
  </ul>
   //监听路由参数
  <RouterView :key="$route.params.id" />
</template>

zht2.vue

<script setup>
import { ref} from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
const user = ref([]);
const users = [
  { id: 1, name: 'zht', email: 'zht114001@163.com', admin: true },
  { id: 2, name: 'kaimi', email: 'jane@163.com', admin: false },
  { id: 3, name: 'fun', email: 'fun@163.com', admin: false },
];
const id = parseInt(route.params.id);
    user.value=users[id-1];
</script>
<template>
<RouterLink to="/zht2">返回</RouterLink>
  <h2>User信息 获得id:{{id}}</h2>
  <ul>
    <li>User Id: {{ user.id }}</li>
    <li>User Name: {{ user.name }}</li>
    <li>User Email: {{ user.email }}</li>
  </ul>
</template>

通过路由名字获得路由

  除了 path 之外,你还可以为任何路由提供 name。URL 是在 RouterLink 组件的 to 属性中设置的,但是您可以使用路由中设置的 name 值来代替 URL。除了path和component之外,每条路由还有一个name属性,所以使用这个值来设置链接。

  运行动态路由设置的 /user/:id 页面的链接时,通过设置 params 属性来设定路由动态参数。

  <RouterLink :to="{ name: 'zht1' }">zht页面</RouterLink>
  <RouterLink :to="{ name: 'zht2', params: { id: 1 } }">User1</RouterLink>
  <RouterView  />

3.5 props 组件

  props 是一个特殊的关键字,它是路由属性中一种注册组件。路由中只能使用动态得url传递参数,满足不了一些复杂的业务参数传递。这个时候我们可以使用props 组件来完成一些复杂的参数传递功能。

  例如 在动态路由中,URL中包含的动态值(id)需要使用useRouter和route对象获取的id的值,但是我们要使用props来获取id值。当 props 设置为 true 时,route.params 将被设置为props组件。

{
    path: '/zht2/:id',
    name: 'zht2',
    component:()=>import('./zht/zht2.vue'),
    // route.params设置成props组件可以使用
    props: true,
}

  UserView 组件使用 defineProps 来接收props中的参数内容。接收到的 props中参数变量被转化成为一个对象,因此可以通过这个转化对象 props.id 获取动态路由中的id值。

<script setup>
import { ref,onMounted} from 'vue';
import { useRoute } from 'vue-router';

const route = useRoute();
const user = ref([]);
//props 参数转换
const props = defineProps({
  id: String,
});
onMounted(() => {
    const id = parseInt(props.id);
    user.value=users[id-1];
});
const users = [
  { id: 1, name: 'zht', email: 'zht114001@163.com', admin: true },
  { id: 2, name: 'kaimi', email: 'jane@163.com', admin: false },
  { id: 3, name: 'fun', email: 'fun@163.com', admin: false },
]; 
</script>

<template>
<RouterLink to="/zht2">返回</RouterLink>
  <h2>User信息 获得id:{{id}}</h2>
  <ul>
    <li>User Id: {{ user.id }}</li>
    <li>User Name: {{ user.name }}</li>
    <li>User Email: {{ user.email }}</li>
  </ul>
</template>

函数模式与路由参数绑定

  在router.js中设置props传递的参数可以被定义成json对象。其中属性(id) 可以与路由动态参数进行绑定,也可以定义成固定参数。

     {
        path: '/zht2/:id', <--------------------|
        name: 'zht2',                           |
        component:()=>import('./zht/zht2.vue'), |
        props: (route) => ({                    |
            id: route.params.id, <--------------|
            name: 'zht'
          }),
      }

在UserView 组将中使用defineProps转化参数对象。

const props = defineProps({

name: String,

id: String,

});

<script setup>
import { ref,onMounted} from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
const user = ref([]);
//转化props 参数对象  id:{{props.id}} 名字:{{props.name}}
const props = defineProps({
    name: String,
    id: String,
});

onMounted(() => {
    const id = parseInt(props.id);
    user.value=users[id-1];
});
const users = [
  { id: 1, name: 'zht', email: 'zht114001@163.com', admin: true },
  { id: 2, name: 'kaimi', email: 'jane@163.com', admin: false },
  { id: 3, name: 'fun', email: 'fun@163.com', admin: false },
];
</script>

<template>
<RouterLink to="/zht2">返回</RouterLink>
  <h2>User信息 获得id:{{props.id}} 名字:{{props.name}}</h2>
  <ul>
    <li>User Id: {{ user.id }}</li>
    <li>User Name: {{ user.name }}</li>
    <li>User Email: {{ user.email }}</li>
  </ul>
</template>

3.6 嵌套路由设置

  很多时候页面的UI是由多层组件嵌套组成的。我们可以使用路由的嵌套功能,通过嵌套使UserView组件相互组合在一起。嵌套时,在路由设置中使用“children”,这样可以确定路由组件的父子关系,以便创建它们的层次结构。

 {
        path: '/zht2/:id',
        name: 'zht2',
        component:()=>import('./zht/zht2.vue'),
        props: (route) => ({
            id: route.params.id,
            name: 'zht'
          }),
          //子路由组件
          children: [
            {
              path: 'zht3',
              component:()=>import('./zht/zht3.vue'),
            },
          ],         
      }

创建zht3.vue文件,写入以下内容。

<script setup>
</script>
<template>
  <h1>Zht3页面</h1>
</template>

设置URL /zht2/:id/zht3来访问页面。在浏览中可以看到显示父子页面。

  • url /父地址/参数/子地址
<template>
  <h1>Vue 3 路由</h1>
  <router-link to="/zht1">zht</router-link>
  <br>
  <router-link to="/zht2">about</router-link>
  <h2>Users列表</h2>
  <ul>
    <li v-for="user in users" :kye="user.id">
      //路由访问方式
      <RouterLink :to="`/zht2/${user.id}/zht3`">{{ user.name }}</RouterLink> 
    </li>
  </ul>
  <RouterView :key="$route.params.id" />
</template>

zht2.vue中加入RouterView 组件,用于显示子页面内容。

<template>
<RouterLink to="/zht2">返回</RouterLink>
  <h2>User信息 获得id:{{props.id}} 名字:{{props.name}}</h2>
  <ul>
    <li>User Id: {{ user.id }}</li>
    <li>User Name: {{ user.name }}</li>
    <li>User Email: {{ user.email }}</li>
  </ul>
  <RouterView />
</template>

浏览器中可以看到嵌套页面内容。
在这里插入图片描述

3.7 路由中的方法使用

  除了使用 <router-link> 创建 a 标签来定义导航链接。还可以使用 router 的实例方法,通过编写代码来实现路由器组件的页面移动功能。

  在代码中使用router对象的push方法,通过设置其中的 path 属性来找到要移动的页面组件。通过事件来触发页面有移动功能。

<script setup>
import { useRouter } from 'vue-router'
const router = useRouter()
const onpage=()=>{
  router.push({ path: '/zht1',
      query: {
      name: 'zht',
      id: 18
    } })
}
</script>
<template>
  <h1>Vue 3 路由</h1>
  <button @click="onpage">zht页面</button>
  <button @click="$router.push({ path: '/zht1' })">事件</button>
  <RouterView  />
</template>

除了push方法,还有back方法和go方法。back 方法允许您返回到您来到该页面之前查看过的页面。go方法可以设置一个数字作为参数,-1表示上一页,-2表示后退两页。go 方法可以前进也可以后退。如果返回一次页面后想返回原页面,可以通过设置go(1)返回原页面。

<button @click="$router.back()">返回</button>
<button @click="$router.go(-1)">返回</button>
<button @click="$router.go(1)">前进</button>

访问不存在的页面

当路由出现错误的时候,所有页面跳转到错误页面。

import { createRouter, createWebHistory } from 'vue-router'
import zht1 from './zht/zht.vue'
import errer from './zht/errer.vue'
const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL),
    routes: [
      {
        path: '/zht1',
        name: 'zht1',
        component:zht1
      },
      { path: '/:pathMatch(.*)*', name: 'NotFound', component: errer }
    ]
  })
  export default router

创建一个错误信息页面

<script setup>
</script>
<template>
  <h1>我的错误信息</h1>
</template>

  在页面转发方法中给一个没有的路由路径zht5,我们在浏览中点击按钮,看到浏览器转发到错误页面。

<script setup>
import { useRouter } from 'vue-router'
const router = useRouter()
function onpage(){
  router.push({ path: '/zht5',
      query: {
      name: 'zht',
      id: 18
    } })
}
const id=1;
</script>
<template>
  <h1>Vue 3 路由</h1>
  <button @click="onpage()">zht页面错误页面</button>
  <RouterView  />
</template>

重定向redirect方法

  在路由中设置redirect属性将路由中的路径设置为重定向。

import { createRouter, createWebHistory } from 'vue-router'
import zht1 from './zht/zht.vue'
import errer from './zht/errer.vue'
const router = createRouter({
    history: createWebHistory(import.meta.env.BASE_URL),
    routes: [
      {
        path: '/zht1',
        name: 'zht1',
        component:zht1
      },
      {
        path: '/home',
        redirect: '/zht1',
      }
    ]
  })
  export default router

也可以使用redirect 名字的方法来重定向到/zht1路由组件上。

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
      {
        path: '/zht1',
        name: 'zht1',
        component:zht1
      },
    {
      path: '/home',
      redirect: { name: 'zht1' },
    },

3.8 导航守卫设置

  Navigation Guard是一个功能,主要用于根据是否完成认证来限制可访问的路由。
  导航守卫有几种类型,例如为整个路由配置的 Global Guards,为单个路由配置的 Per-Route Guards,以及为每个组件配置的 In-Component Guards。基本用法是一样的,只是设置位置不同。对于那些第一次学习路由的人来说,Navigation guards 乍一看可能会让人望而生畏,所以让我们用一个简单的例子来看看它是什么样子的。
Global Before Guards,顾名思义,就是应用于整个路由的导航守卫。
使用由 createRouter 函数创建的路由器实例的 beforeEach 方法 (router.beforeEach) 进行设置。
beforeEach 有两个参数,一个是to,一个是from。由于to和from也是任何navigation guard中都会用到的对象,所以我们检查to和from各自有什么值下面的代码只是将to和from的值输出到控制台,对导航没有影响。

  • to: 即将要进入的目标
  • from: 当前导航正要离开的路由
const router = createRouter({ ... })

router.beforeEach((to, from) => {
  console.log('to:', to);
    console.log('from:', from);
    return true;
})
  • false: 取消当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IMAU鸿蒙北向开发-2023年9月6日学习日志

1. TextArea 基本使用 //TextArea 基本使用 Entry Component struct Index {State message: string Hello Worldbuild() {Column() {TextArea({placeholder: "请输入个人介绍",text: "个人介绍控制在200字以内。"}).margin({top: 100}).caretColor(Color…

【正版软件】Air Explorer - 一个程序访问您的所有云服务

前言&#xff1a;Air Explorer支持最好的云服务。 功能特点&#xff1a; 直接管理云中的文件 设置同一服务上的多个帐户 您可以在任何云服务或计算机之间同步文件夹 云文件浏览器易于使用 通过加入您的所有云服务来增加存储空间 应用程序适用于Windows/Mac Air Explorer…

Druid LogFilter输出可执行的SQL

配置 测试代码&#xff1a; DruidDataSource dataSource new DruidDataSource(); dataSource.setUrl("xxx"); dataSource.setUsername("xxx"); dataSource.setPassword("xxx"); dataSource.setFilters("slf4j"); dataSource.setVal…

2023年大数据平台数据安全厂商汇总

大数据时代&#xff0c;大数据平台数据安全至关重要&#xff0c;这关系着大家的切身安全。所以企业一定要慎重选择大数据平台数据安全厂商。这里给大家简单汇总一下&#xff0c;同时给大家推荐一下&#xff0c;仅供参考哦&#xff01; 2023年大数据平台数据安全厂商汇总 1、…

Kafka3.0.0版本——消费者(消费方式)

目录 一、Kafka 消费方式1.1、pull&#xff08;拉&#xff09; 模式1.2、push &#xff08;推&#xff09;模式1.3、Kafka采用pull&#xff08;拉&#xff09; 模式缺点 一、Kafka 消费方式 1.1、pull&#xff08;拉&#xff09; 模式 consumer采用从broker中主动拉取数据。K…

【Python小项目之Tkinter应用】随机点名/抽奖工具大优化:实现背景图与其他组件自适应窗口大小变化并保持相对位置和比例不变

文章目录 前言一、需求分析与实现思路明确需求实现思路二、关键代码2.1 实现背景图随着窗口大小变化而变化2.2 更换place的参数三、完整代码四、总结4.1 意外收获前言 话不多说,直接看优化后的效果: 优化前: 是不是非常的哇塞,相比于之前只能固定窗口大小来运行,优化后…

基于SSM的营业厅宽带系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

大数据课程L1——网站流量项目的概述整体架构

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解网站流量项目的案例概述; ⚪ 了解网站流量项目的数据埋点和采集; ⚪ 了解网站流量项目的整体架构; 一、网站流量项目概述 1. 背景说明 网站流量统计是改进网站服务的重要手段之一…

大厂常见面试题LRU算法实现

要实现put和get的O(1)时间复杂度 最近最少/最久使用问题 将最近最少使用的数据淘汰 LRU缓存是操作系统常见的页面缓存淘汰机制 实现方式&#xff1a;哈希表 双向链表 哈希表用于存储数据&#xff0c;主要用于实现存取操作put和get的O(1)时间复杂度双向链表用于记录最近最少…

Linux系统访问卡顿 慢

Linux系统访问卡顿、慢 1、查看磁盘使用情况2、查看内存使用情况3、查看磁盘IO使用情况4、查看CPU使用情况5、iostat的查询 1、查看磁盘使用情况 [rootlocalhost ~]# df -h 当发现磁盘使用率很高时&#xff0c;那就要释放磁盘空间了&#xff0c;删除一些不必要的文件查看各个目…

03 Linux

第一课 目录 ⼀、进程与线程 1. 进程 2. 线程 3. 进程和线程的使用条件 ⼆、linux下的sudo命令 (1)sudo sudo的功能&#xff1f; sudo提供的临时权限什么时候被取消&#xff1f; (2)为什么要取消 sudo 权限呢&#xff1f; (2)apt sudo apt update 三、linux常⽤…

第10篇:ESP32外部中断功能的使用

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

BEVFormer论文解析

背景 跟基于雷达的相比&#xff0c;纯视觉的方案成本低&#xff0c;而且具有RGB和纹理信息&#xff0c;可以用于检测像交通信号灯、车道线等道路要素。 自动驾驶的感知本意是要从多个摄像头给出的2D信息来预测3D bbox(检测)或者semantic map(分割)&#xff0c;最直接的方案是…

PlantUML——类图(持续更新)

前言 在分析代码流程中&#xff0c;我们常常会使用到各种UML图&#xff0c;例如用例图、时序图和类图等&#xff0c;以往使用ProcessOn或亿图图示等工具&#xff0c;但是这些工具难以规范化&#xff0c;有没有一种用代码来生成图形的工具呢&#xff1f; 刚好在出差的晨会中机缘…

神策分析 2.5 上线「经营分析」:可视化分析能力重磅升级!

近日&#xff0c;神策数据发布了全新的神策分析 2.5 版本&#xff0c;该版本以经营分析为主题&#xff0c;支持分析模型与外部数据的融合性接入&#xff0c;构建全域数据融合模型&#xff0c;并提供统一、便捷的指标及可视化能力&#xff0c;实现从用户到经营的全链路、全场景分…

【公网远程手机Android服务器】安卓Termux搭建Web服务器

目录 概述 1.搭建apache 2.安装cpolar内网穿透 3.公网访问配置 4.固定公网地址 5.添加站点 概述 Termux是一个Android终端仿真应用程序&#xff0c;用于在 Android 手机上搭建一个完整的Linux 环境&#xff0c;能够实现Linux下的许多基本操作&#xff0c;不需要root权限…

归并排序 Merge Sort

归并排序的基本思想是什么&#xff1f; 采用分治法&#xff08;Divide and Conquer&#xff09;&#xff0c;递归将待排序的数组平均分成两个子数组&#xff0c;直到子数组长度为 0 或 1&#xff0c;这是 分 Divider。再将排序好的两个子数组合并为一个有序数组&#xff0c;这…

AD学习笔记

1快捷键 A 各种对齐 L 切换顶层底层 右键联合 元器件的锁定 N 连线控制是否显示 2原理图和pcb交叉选择 封装重叠警告 在规则中修改

Tcp协议特点

目录 确认应答&#xff08;ACK&#xff09; 超时重传 建立连接-三次握手 断开连接-四次挥手 Tcp特点主要是分为四点&#xff1a;有连接&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工。 这里我们主要介绍可靠传输 确认应答&#xff08;ACK&#xff09; …

EasyFalsh移植使用方法

参考&#xff1a;https://blog.csdn.net/Mculover666/article/details/105510837 注意&#xff1a; 这里说的修改默认环境变量后修改环境变量版本号就自动重新写入到flash这句话是有问题的&#xff0c;要开启上面【#define EF_ENV_AUTO_UODATE】宏定义后才会实现该功能&#…