Basic Vue help: Accessing JS object values in component
我一直在尝试vue.js,并且在路由时难以访问组件中的JS对象值。
使用此仓库进行实验,https://github.com/johnayeni/filter-app-vue-js,我只是想复制一个基本的"产品列表"和"产品描述"应用程序,但是我无法正常工作。存储库的主页(SearchPage.vue组件)用作"产品列表",而我只是想添加"产品描述"组件,一次只显示一项。
我添加了一个"描述页面"组件(称为" item.vue"),以允许用户单击一种语言/框架,然后将其路由到item.vue,以仅显示该特定对象的关联信息(item.name,item.logo等),即不显示任何其他语言。
在遵循一些教程之后,这是我尝试的方法:
首先,我向JS对象(在data / data.js中找到)添加了id,即id:'1'。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | const data = [ { id: '1', name: 'vue js', logo: 'http://... .png', stack: [ 'framework', 'frontend', 'web', 'mobile' ], }, { id: '2', name: 'react js', logo: 'http://... .png', stack: [ 'framework', 'frontend', 'web', 'mobile' ] }, ... ]; export default data |
然后,我将item.name(在ItemCard.vue中)package在路由器链接标记中:
1 | <router-link :to="'/item/'+item.id"> {{ item.name}} </router-link> |
然后我在router / index.js中添加了新路径:
1 2 3 4 5 | { path: './item/:id', component: item, props: true } |
但是,当单击该路由器链接时,我只能访问" .id"(通过$ route.params.id),但无法获取.name或.logo。如何访问其他值(即item.name,item.logo等)?我觉得我在这里走错了路。
非常感谢您的帮助。
您可以访问
您在此处有几个选择,具体取决于您要完成的工作:
如@dziraf所建议,您可以使用
1 2 3 4 5 6 7 | export default { computed: { data() { return this.$store.data; } } } |
在此处了解更多信息:https://vuex.vuejs.org/
作为替代方案,您可以仅导入数据,并通过其
来获取正确的项目。
1 2 3 4 5 6 7 8 9 | import data from './data.js'; export default { computed: { data() { return data.find(d => d.id === this.$route.params.id); } } } |
仅取决于您要执行的操作。
我想您只需要一个package器组件即可从URL中获取所需的项目并呈现适当的项目。假设有一个ItemWrapper:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <template> <item-card :item="item"></item-card> </template> import ItemCard from './ItemCard.vue'; import data from '../data/data'; export default { components: { ItemCard, }, props: { stackNameUrl: { required: true, type: String, }, }, data() { return { item: {}, } }, computed: { stackName() { return decodeURI(this.stackNameUrl); } }, created() { this.item = data.find( fw => fw.name === this.stackName); } } <style> </style> |
此组件采用uri编码的栈/固件名称prop对其进行解码,基于该字符串从数据中找到固件,并使用固件项目渲染
要使其正常工作,我们需要设置路由器,以便
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import Vue from 'vue'; import Router from 'vue-router'; import SearchPage from '@/components/SearchPage'; import ItemWrapper from '@/components/ItemWrapper'; Vue.use(Router); export default new Router({ routes: [ { path: '/', name: 'SearchPage', component: SearchPage }, { path: '/item/:stackNameUrl', name: 'ItemWrapper', component: ItemWrapper, props: true, }, ] }); |
现在,我们需要修改
1 2 | <!-- iterate data --> <item-card v-for="(item, index) in filteredData" :key="index" :item="item"></item-card> |
我们现在放置:
1 2 3 4 5 | <template v-for="(item, index) in filteredData"> <router-link :to="'/item/' + item.name" :key="index"> <item-card :key="index" :item="item"></item-card> </router-link> </template> |
因此现在每个组件都放置在
还有,瞧瞧。
一些注意事项:
-
:param 是vue路由器正常工作的关键。您想使用它来呈现ItemCard 本身。那可能有效,但是您需要从组件created() 的数据中检索fw。这会将您的卡组件与data.js 绑定在一起,这很不好,因为这种组件可以重用,并且采用item 参数比在这种情况下从文件中获取数据要好得多。因此,创建了一个ItemWrapper 来代理该请求并为卡选择正确的框架。 -
您仍然应该检查用户键入错误字符串的情况。
-
在寻求vuex解决方案之前,先深入探索Vue。 Vuex很棒,但通常会导致代码变脆,因此不应过度使用。