英文:
Can we pass data via props when pushing to a route in Vue?
问题
我问这个问题是为了了解当导航到新路由时是否可以通过 props 传递一些数据。因为我读了一些推荐将数据作为 props 传递的文章,我想了解这是否真的有效。
根据我查阅的文档,在路由中传递 props 仅在两种情况下有效:
- 当您希望将传递的参数用作 props 时。
{ path: '/user/:id', component: User, props: true },
- 当您希望传递一些静态数据时。
{ path: '/user/:id', component: User, props: { value: 123 } },
在这两种情况下,我们在路由定义中使用 props 属性。
我的问题是,如果我们想在推到新路由时通过 props 传递一些数据,是否可行?因为我尝试过这个,发现传递的 props 总是 undefined。GitHub 上有相同的问题,但我不理解他们的最后一条评论。
以下是演示,显示模板中传递的 props 总是 undefined。
const Comp1 = Vue.component('Comp1', {
template: `
<div>Comp1- <button @click="$router.push({name: 'Comp2',props: { value: 1234 })">Push to route with props</button>
</div>`,
});
const Comp2 = Vue.component('Comp1', {
template: `<div>Comp2 - {{ value }} <button @click="$router.push({name: 'Comp1' })">Go back</button> </div>`,
mounted() { console.log('Prop value- ', this.value) },
props: ['value']
});
const router = new VueRouter({
routes: [{
path: '/',
name: "Comp1",
component: Comp1,
},
{
path: '/comp1',
name: "Comp2",
component: Comp2,
}
]
});
const app = new Vue({
el: "#app",
router,
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/vue-router@3.6.5/dist/vue-router.js"></script>
<div id="app">
<router-view></router-view>
</div>
英文:
I am asking this question to understand whether we can pass some data via props when navigating the new route. Because I read a few articles which recommend passing data as props and I want to understand if this really works.
As much as I looked into the documentation, passing props in routes works with only two cases-
- When you want to use passed params as props.
{ path: '/user/:id', component: User, props: true },
- When you want to pass some static data.
{ path: '/user/:id', component: User, props: { value: 123 } },
In both cases, we use the props property in the route's definition.
My question is if we want to pass some data via props when we push to a new route, is it doable? Because I tried this and noticed that passed props are always undefined. There is the same issue on GitHub that stated the problem but I didn't understand their last comment.
Here is the demo which shows that passed props are always undefined in the template.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
const Comp1 = Vue.component('Comp1', {
template: `
<div>Comp1- <button @click="$router.push({name: 'Comp2',props: { value: 1234 },
})">Push to route with props</button>
</div>`,
});
const Comp2 = Vue.component('Comp1', {
template: `<div>Comp2 - {{ value }} <button @click="$router.push({name: 'Comp1'
})">Go back</button> </div>`,
mounted() { console.log('Prop value- ', this.value) },
props: ['value']
});
const router = new VueRouter({
routes: [{
path: '/',
name: "Comp1",
component: Comp1,
},
{
path: '/comp1',
name: "Comp2",
component: Comp2,
}
]
});
const app = new Vue({
el: "#app",
router,
})
<!-- language: lang-html -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/vue-router@3.6.5/dist/vue-router.js"></script>
<div id="app">
<router-view></router-view>
</div>
<!-- end snippet -->
答案1
得分: 2
以下是翻译好的部分:
"所说的是,除非它在路由记录的参数中或静态提供的情况下,否则无法动态传递数据到路由。"
"路由参数是URL的一部分,应该与某些内容匹配,但仍与给定的组件相关联。例如,在此路由记录中,:id
就是一个路由参数。它是一个将是动态的内容。"
"现在,路由记录中的 props
属性用于以不同方式读取URL中的参数。您可以通过两种方式实现这一点:"
"那么,为什么要使用props呢?"
"我可能错了,但我看到的唯一用例是当您想将一个组件用作路由的视图时。"
"就我的经验来看,这是很少发生的事情。路由URL中的参数通常与资源的ID匹配,通常在将其传递给组件之前进行获取。因此,我会无论如何使用一个包装器,永远不会在路由记录上使用props。"
"答案是:"
"当推送到新路由时,您无法传递props。如果在路由记录中使用 props: true
,则props将从URL中读取,否则将从路由定义(记录)中静态定义。"
"如果要推送数据:"
- "要么您在URL中提供资源ID,以便要推送到的页面获取它。"
- "要么您将其保存在
localStorage
中(不建议,这意味着您的应用架构可能不适合您的需求),然后在下一页检索它。"
英文:
What is said is that you can't dynamically pass data to a route unless it's in the parameters of the route record or statically provided
What is a route parameter ?
A route parameter is a part of the url that should match something, but that is still tied to a given a component. For example, in this route record, :id
is a route parameter. It's something that will be dynamic.
const routes: Route[] = [
{
name: 'user-detail',
path '/users/:id',
component: UserDetailView,
},
];
Now, the props property in the route record is something used to read differently the parameter in the URL. You can achieve this in 2 ways:
export default defineComponent({
props: {
id: string; // Route params are strings, I'm not sure if you can parse them first
},
// Composition API
setup(props) {
// Method 1
const route = useRoute();
const userId = route.params.id;
// Method 2
const userIdFromProps = props.id
},
// Options API
created() {
// Method 1
const userId = this.$route.params.id;
// Method 2
const userIdFromProps = this.id; (this.id reads the prop id)
},
});
What's the point of using props then ?
I may be wrong, but the only use case I see is when you want to use a component as a route's view.
You have a component that accepts props that you use in another view. And this component matches exactly your requirements, so instead of wrapping it in a view, you directly use it as a route's view, and props are automatically passed down.
My thoughts
Given my experience in many apps built with vue, this is something that rarely happens. Params in the route url usually match a ressource's ID, and you usually fetch it before passing it down to a component. So I'd use a wrapper anyway and would never use props on route records.
The answer:
After all those explanations I forgot to answer, because the question shouldn't have to be asked:
You can't pass props when pushing to a new route. The props will be read either from the URL if you use props: true
in your route record, or from the route definition (record) if you statically defined it.
If you want to push data:
- Either you provide the resource id in the URL to let the page you're pushing to fetching it
- Either you save it in the
localStorage
(not recommended, that means your app architecture is maybe not adapted to your needs), and retrieve it on your next page
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论