1.布尔模式
在你的组件中使用 $route
会与路由紧密耦合,这限制了组件的灵活性,因为它只能用于特定的 URL。虽然这不一定是件坏事,但我们可以通过 props
配置来解除这种行为:
1.1 传递一个参数
1.1.1 路由添加 props:true,当 props
设置为 true
时,route.params
将被设置为组件的 props。
{
path: '/Profile/:username',
name: 'Profile',
props: true,
component: () => import('../views/profile.vue'),
},
1.1.2 传递参数
<el-button>
<router-link to="/Profile/name张三">Profile</router-link></el-button
>
1.1.3 页面接受参数
props: ["username"], 注意这里的username要和前面的传递参数键对应起来
<template>
<div style="margin: 50px; line-height: 34px; width: 800px">
<h2>profile</h2>
<h3>参数为:【{
{ username }}】--路由展示参数,页面刷新参数不消失</h3>
<h3></h3>
</div>
</template>
<script>
export default {
name: "Table",
props: ["username"],
components: {},
data() {
return {
dataDraggerle1: [
{ student: "11", number: 1 },
{ student: "22", number: 2 },
{ student: "33", number: 3 },
{ student: "44", number: 4 },
],
dataDraggerle2: [
{ student: "5", number: 5 },
{ student: "6", number: 6 },
{ student: "7", number: 7 },
],
};
},
methods: {},
mounted() {
//3这里可id以看到传递的参数username
console.log("mounted", this.username);
},
created() {
//3这里可id以看到传递的参数username
console.log("created", this.username);
},
};
</script>
<style scoped lang="scss">
h2 {
color: purple;
margin-bottom: 10px;
}
h3 {
font-size: 18px;
}
</style>
2 对象传参 传递多个参数
2.1 path后面直接写参数
{
path: '/Profile/:username/:userid',
name: 'Profile',
props: true,
component: () => import('../views/profile.vue'),
},
2.2传递时也直接拼参数
<el-button>
<router-link to="/Profile/name张三/123">Profile</router-link></el-button
>
2.3
<template>
<div style="margin: 50px; line-height: 34px; width: 800px">
<h2>profile</h2>
<h3>
2 username参数为:【{
{ username }}】--路由展示参数,页面刷新参数不消失
</h3>
<h3>2 userid参数为:【{
{ userid }}】--路由展示参数,页面刷新参数不消失</h3>
<h3></h3>
</div>
</template>
<script>
export default {
name: "Table",
//1
props: ["username", "userid"],
components: {},
data() {
return {};
},
methods: {},
mounted() {
//3这里可id以看到传递的参数username
console.log("mounted", this.username, this.userid);
},
created() {
//3这里可id以看到传递的参数username
console.log("created", this.username, this.userid);
},
};
</script>
<style scoped lang="scss">
h2 {
color: purple;
margin-bottom: 10px;
}
h3 {
font-size: 18px;
}
</style>
3.命名视图传递参数
如果一个页面有多个命名视图,对于有命名视图的路由,你必须为每个命名视图定义 props
配置:
官网例子
const routes = [
{
path: '/user/:id',
components: { default: User, sidebar: Sidebar },
props: { default: true, sidebar: false }
}
]
看我的例子更加清晰明了
2.1 比如我们上面的例子,又增加了一个底部固定的视图组件,不明白命名视图的可以看看前几期的讲解(就是我的每一个页面都要有一个顶部和一个底部组件展示商标或者logo固定的,也可以传递参数)
第一步
在路由中配置
props 对应上面的 components
{
path: '/Profile/:username/:userid',
name: 'Profile',
components: {
default: () => import('../views/profile.vue'),
footerName: Footer//( => import('../views/Footer.vue'))//上面的组件需要引入
},
props: {
default: true, //也可以选择false,不展示
footerName: {
footerdata: "正版"
}
}
},
2 底部footer组件接接受参数
<template>
<div style="margin: 50px; line-height: 34px; width: 800px">
<h2>
版权所有,翻版必究<span style="color: blue">{
{ footerdata }}</span>
</h2>
</div>
</template>
<script>
export default {
name: "Table",
props: {
footerdata: {
type: String,
default: "绝版",
},
},
};
4.函数模式
{
path: '/Test/:username', //传递一个参数
name: 'Test',
components: {
default: () => import('../views/Test.vue'),
footerName: Footer
},
props: {
default: route => {
search: route.query.search //用了eslintrc这里报错
},
footerName: {
footerdata: "正版"
}
}
},
<template>
<div>
<h3>test:{
{ search }}</h3>
</div>
</template>
<script>
export default {
props: ["search"],
};