vue.js - 使用动态 URl 在 Vue3 中选择“$root”对象条目
问题描述
在我的 Vue3 应用程序中,该$root
对象具有listData
条目。
使来自 App.vue 的 JSON 数据在所有视图中都可访问
此条目包含许多(> 1.000)对象(例如汽车),它们具有始终相同的属性(ID、名称等)。
我想创建一个显示单个对象属性的页面。(Car.name、Car.motor、Car.image 等)。
在路由中使用通配符我将请求转发到details.vue
:
{ path: '/:path(.*)', component: details, props:true, },
还有一个硬编码链接:
<router-link to="/Car_1">Car_1</router-link>
这行得通。
然后我想从$root.listData
对象中找到对应的入口并输出:
export default {
data() {
return {
dataSS: [],
};
},
mounted() {
let name = this.$route.params.path;
let data = this.$root.listData;
for (let i = 0; i < data.length; i++) {
const el = data[i];
// console.log(el.ID)
if (el.name === name) {
this.dataSS = data[i]
}
}
},
}
如果页面是通过 链接到的,这也有效,
<router-link>
但如果页面是直接从浏览器调用的,则无效。
然后 for 循环工作,但数组dataSS[]
保持为空。
首先,这是实现我的目标的“正确”方式,还是有更好的方式?
其次,如何实现它们在直接调用中也显示?
编辑,在 StevenSiebert @19:11 发表第一条评论之后
假设是正确的,this.$root.listData
当 for 循环开始时仍然为空。所以dataSS
可以完全没有内容。
偶然我意识到了这个.filter()
功能:
computed: {
dataSS: function () {
this.dataSS = this.$root.listData.filter(SS => SS.name == this.$route.params.path)[0];
return this.dataSS
},
},
有了这个,<router-link>
在浏览器刷新之后通过 和 显示内容。
但是,浏览器刷新后,我在控制台中收到以下错误消息:
Uncaught (in promise) TypeError: $options.dataSS is undefined
但这仅当我访问对象的属性{{ dataSS.name }}
而不是对象作为一个整体显示时才这样做{{ dataSS }}
。即使预定义 dataSS 也没有什么区别。
data() {
return {
dataSS: { 'country': '', 'city': '', 'foundingyear': '', 'name': '' }
};
},
为什么只有在访问属性时才会出现错误消息,而不是整个对象?
为什么预定义不能防止错误?
解决方案
我假设this.$root.listData
当您在浏览器中调用 url 时未加载,因为您的应用程序在您手动调用时“重新启动”,就像浏览器刷新一样。我建议使用vuex
withvuex-persistedstate
以使您的数据即使在重新加载后也可用。
当你这样做时,你可以使用你的函数async
并await
确保你不会在没有数据的情况下运行它。
推荐阅读
- excel-formula - 基于日期的成功率
- ios - Appium - iOS - 写入 xctestrun 文件时出错:错误域 = NSCocoaErrorDomain 代码 = 4
- powershell - 如何判断路径是文件还是目录?
- python - CartPole-v0 的意外观察空间
- javascript - 如何让 React 父组件在没有表单的情况下访问子状态(使用沙盒)?
- javascript - 一旦组件在 react 中渲染,我们可以修改 div 吗?
- java - 在不使用意图的情况下单击按钮发送 gmail
- c++ - 搜索具有特定签名调用的函数?
- xcode - 为什么我的视图加载但不显示 segue?
- matrix - sympy 矩阵到显式求和并返回(到矩阵表示法)