1. 代码思想:
1.1 如果一个页面(加载页面)在多个页面都会用到,封装到公共的 store
文件夹里面的 main.js
如果需要修改的话,只让不同页面控制 main.js 里的变量即可
1.2 页面中的网络请求很多,(加载页面)在获取数据的时候,都会用到,所以要写在request 请求文件里面
import axios from 'axios'
import { BASE_URL, TIMEOUT } from './config'
import useMainStore from '@/stores/modules/main'
const mainStore = useMainStore()
request(config) {
// mainStore.isLoading = true;
return new Promise((resolve, reject) => {
this.instance.request(config).then((res) => {
resolve(res.data);
// mainStore.isLoading = false;
}).catch(err => {
reject(err);
// mainStore.isLoading = false;
})
})
}
- 发送网络请求的代码文件夹
2. 动态路由
path 后面的参数可以是 Query 参数,也可以是动态路由的参数,这个例子是动态路由的例子
3. $attr
分析
- 组件可以接收props,但对非props的属性
- 在Vue中,当父组件向子组件传递属性和事件时,如果子组件没有在props中声明这些属性,或者没有在emits中声明事件,这些属性和事件会被保存在
$attrs
对象里。特别是对于原生事件,比如click,如果子组件的根元素需要继承这些事件,就需要用v-bind="$attrs"来绑定。
4. 路由里面携带参数
1. 定义方式
- 路径占位符:通过冒号
:
标记动态参数(如:id
)。
路由配置:
// router.js
const routes = [
{
path: "/detail/:id",
component: Detail
}
]
2. 匹配规则
- URL 示例:
/detail/123
→id
的值为"123"
。 - 访问方式:通过
$route.params.id
获取参数值。
3. 关键特性
- 必传性:若路径定义为
/:id
,则访问时必须携带该参数(否则路由不匹配)。 - 类型限制:参数默认是字符串类型(可通过路由守卫或组件内逻辑转换类型)。
二、params
****vs ****query
1. params
****参数
- 用途:标识资源的唯一性(如文章详情页的 ID)。
- 位置:属于 URL 路径的一部分(如
/detail/123
)。 - 访问方式:
$route.params
。
2. query
****参数
- 用途:传递附加过滤或配置信息(如分页、排序)。
- 位置:URL 的查询字符串(如
/list?page=2&sort=asc
)。 - 访问方式:
$route.query
。
3. 对比总结
特性 | params | query |
---|---|---|
定义位置 | 路径中(/path/:id ) | URL 查询字符串(?key=value ) |
必传性 | 根据路由配置是否必需 | 可选 |
典型场景 | 资源唯一标识(如文章 ID) | 过滤条件(如分页、排序) |
SEO 影响 | 对 SEO 更友好(路径包含关键信息) | 无直接影响 |
三、代码示例
1. 路由配置(params
)
// router.js
{
path: "/detail/:id",
name: "Detail",
component: () => import("@/views/Detail.vue")
}
2. 导航传参(编程式导航)
// 跳转到 /detail/123
router.push({
name: "Detail", // 使用路由名称
params: { id: 123 } // 传递 params
})
// 或通过路径直接传递(需确保路径匹配)
router.push("/detail/123")
3. 组件内获取参数
<!-- Detail.vue -->
<script setup>
import { useRoute } from "vue-router"
const route = useRoute()
console.log(route.params.id) // 输出 "123"(字符串类型)
</script>
四、常见问题
1. params
****参数是可选的吗?
- 默认必传:若路径定义为
:id
,必须传递参数。 - 可选参数:可通过正则表达式或重复参数实现:
// 可选 id(匹配 /detail 或 /detail/123)
path: "/detail/:id?"
2. 如何传递对象或复杂类型?
params
****仅支持字符串:需手动序列化(如JSON.stringify
)和反序列化。- 替代方案:将复杂数据存储在 Vuex/Pinia 中,通过
params
或query
传递标识符。
3. params
****参数丢失问题
- 场景:直接刷新页面时
params
可能丢失。 - 解决:确保路由配置正确,或使用
localStorage
临时存储关键参数。
五、最佳实践
- 优先使用 ****
params
****标识资源唯一性(如详情页)。 - 用 ****
query
****传递非关键性参数(如搜索条件、分页)。 - 显式定义路由的 ****
name
****属性:避免硬编码路径,提升代码可维护性。 - 类型校验:在组件内对
params
做类型转换(如Number(id)
)。
总结
path: "/detail/:id"
→params
参数(路径参数)。- 核心区别:
params
是路径的一部分,query
是查询字符串。 - 适用场景:
params
用于资源定位,query
用于附加过滤。