Vue.js 无法访问数据对象的嵌套属性
Vue.js cannot access to nested properties of data object
在 Vue.js 中,我像这样获取 json 文件的一些数据:
export default {
data () {
return {
data: []
}
},
created () {
this.fetchData();
},
methods: {
fetchData () {
$.getJSON('data/api.json', function(el) {
this.data = el;
}.bind(this)),
}
}
}
获取的数据结构如下:
{
time: '17:00',
pick: {
box: {
single: 1,
multi: 2
}
}
}
当我尝试访问我的组件中的 {{ data.pick.box }} or {{ data.pick.box.single }}
时,我总是收到此错误消息:
vue.js?3de6:2963 Uncaught TypeError: Cannot read property 'box' of undefined
at Proxy.render (eval at <anonymous> (app.js:126), <anonymous>:4:46)
at VueComponent.Vue._render (eval at <anonymous> (app.js:139), <anonymous>:2954:22)
at VueComponent.eval (eval at <anonymous> (app.js:139), <anonymous>:2191:21)
at Watcher.get (eval at <anonymous> (app.js:139), <anonymous>:1656:27)
at new Watcher (eval at <anonymous> (app.js:139), <anonymous>:1648:12)
at VueComponent.Vue._mount (eval at <anonymous> (app.js:139), <anonymous>:2190:19)
at VueComponent.Vue.$mount (eval at <anonymous> (app.js:139), <anonymous>:5978:15)
at VueComponent.Vue.$mount (eval at <anonymous> (app.js:139), <anonymous>:8305:16)
at init (eval at <anonymous> (app.js:139), <anonymous>:2502:11)
at createComponent (eval at <anonymous> (app.js:139), <anonymous>:4052:9)
访问深层嵌套对象有什么限制吗?例如,当我调用 {{ data }}
时,我将整个数据结构正确显示为字符串。
正如 Nora 所提到的,这里是 fiddle:jsfiddle
您可以尝试等待数据完成加载以在您的模板中显示它:
export default {
data () {
return {
loading: false,
data: []
}
},
created () {
this.fetchData();
},
methods: {
fetchData () {
this.loading = true;
$.getJSON('data/api.json', function(el) {
this.data = el;
this.loading = false;
}.bind(this)),
}
}
}
在模板中:
<template>
<div v-if="!loading">
{{ data.pick.box }}
</div>
</template>
您收到此错误,因为 data
在加载时未填充,而您在此期间收到错误。您可以在模板中使用 v-if 直到数据填充到视图中。所以元素在数据加载之前不会被渲染,一旦数据加载它就会显示数据。
可以像下面这样:
<div v-if="data.pick">
{{data.pick.box}}
</div>
我的解决方案是创建一个具有空属性的空对象。
data () {
return {
loading: false,
data: {pick:{},}
}
},
在 Vue.js 中,我像这样获取 json 文件的一些数据:
export default {
data () {
return {
data: []
}
},
created () {
this.fetchData();
},
methods: {
fetchData () {
$.getJSON('data/api.json', function(el) {
this.data = el;
}.bind(this)),
}
}
}
获取的数据结构如下:
{
time: '17:00',
pick: {
box: {
single: 1,
multi: 2
}
}
}
当我尝试访问我的组件中的 {{ data.pick.box }} or {{ data.pick.box.single }}
时,我总是收到此错误消息:
vue.js?3de6:2963 Uncaught TypeError: Cannot read property 'box' of undefined
at Proxy.render (eval at <anonymous> (app.js:126), <anonymous>:4:46)
at VueComponent.Vue._render (eval at <anonymous> (app.js:139), <anonymous>:2954:22)
at VueComponent.eval (eval at <anonymous> (app.js:139), <anonymous>:2191:21)
at Watcher.get (eval at <anonymous> (app.js:139), <anonymous>:1656:27)
at new Watcher (eval at <anonymous> (app.js:139), <anonymous>:1648:12)
at VueComponent.Vue._mount (eval at <anonymous> (app.js:139), <anonymous>:2190:19)
at VueComponent.Vue.$mount (eval at <anonymous> (app.js:139), <anonymous>:5978:15)
at VueComponent.Vue.$mount (eval at <anonymous> (app.js:139), <anonymous>:8305:16)
at init (eval at <anonymous> (app.js:139), <anonymous>:2502:11)
at createComponent (eval at <anonymous> (app.js:139), <anonymous>:4052:9)
访问深层嵌套对象有什么限制吗?例如,当我调用 {{ data }}
时,我将整个数据结构正确显示为字符串。
正如 Nora 所提到的,这里是 fiddle:jsfiddle
您可以尝试等待数据完成加载以在您的模板中显示它:
export default {
data () {
return {
loading: false,
data: []
}
},
created () {
this.fetchData();
},
methods: {
fetchData () {
this.loading = true;
$.getJSON('data/api.json', function(el) {
this.data = el;
this.loading = false;
}.bind(this)),
}
}
}
在模板中:
<template>
<div v-if="!loading">
{{ data.pick.box }}
</div>
</template>
您收到此错误,因为 data
在加载时未填充,而您在此期间收到错误。您可以在模板中使用 v-if 直到数据填充到视图中。所以元素在数据加载之前不会被渲染,一旦数据加载它就会显示数据。
可以像下面这样:
<div v-if="data.pick">
{{data.pick.box}}
</div>
我的解决方案是创建一个具有空属性的空对象。
data () {
return {
loading: false,
data: {pick:{},}
}
},