在VueJS中深层嵌套数据对象

时间:2016-11-21 06:18:41

标签: vue.js

我有一个VueJs前端从API获取一些数据。该应用程序使用vue-router。

为一个组件提取的数据类似于以下内容:

{
  name: ...,
  email: ...,
  order: {
    data: {
      line_items: [
        {
          quantity: ...
        }
      ]
    }
  }
}

使用名为info:

的数据对象实例化组件
data () {
  return {
    info: {}
  }
}

beforeRouteEnter挂钩中,数据由vue-resource http.get获取,信息设置为结果的主体,如下所示:

vm.info = result.body 

当组件呈现时,会产生以下错误:

TypeError: undefined is not an object (evaluating _vm.order.data.line_items')

在模板中,数据按照常规用大括号引用,但是,如果我只是在模板中引用信息,如下所示:

{{ info }}

它会输出所有数据而不会抱怨。

分配深层嵌套数据对象的正确方法是什么?

5 个答案:

答案 0 :(得分:1)

你必须在这里使用condition rendering,你可以在Vue指令v-if的帮助下轻松完成。如果未填充数据并且您尝试访问它,则可能会出错,因此 Range("B3").Select Range(Selection, Selection.End(xlDown)).Select Var = Selection.End(xlDown).Select 仅在数据存在时才会呈现HTML的那部分。

您需要执行以下操作:

v-if

答案 1 :(得分:0)

如果您发现@saurabh答案无效,那么您可能需要检查如何将新值分配给对象。

首先,数据是否被设置为字符串?因此{{info}}工作(或出现)。值得使用response.json()来设置数据。

如果不是,那么可能会产生错误,因为您设置的数据不是被动的。在分配嵌套对象时,您可能需要使用不同的方法使其具有反应性,即

Vue.set(vm.someObject, 'b', 2)

this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })

结帐:https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats

因为您的回复是一个对象,您可能希望将数据分解为相应的参数,即

data () {
  return {
    info: {
      name: '',
      email: '',
      order: {},
    },
  }
}

然后你可以指定名称&按预期发送电子邮件(info.email = ...)。

对于info.order,您可以使用Vue.set

Vue.set(this.info, 'order', result.body.order)

答案 2 :(得分:0)

在我的场景中,我必须使用一个Vue.set来包裹Object.assign

我正在尝试在Vuex mutation中设置state.workouts[state.workoutDate].isDone

toggleWorkout(state, isDone) {
    Vue.set(
        state.workouts,
        state.workoutDate,
        Object.assign({}, state.workouts[state.workoutDate], { isDone: isDone })
    );
},

```

答案 3 :(得分:0)

这里的实际问题是生命周期。创建组件后将调用路由保护beforeRouteEnter,因为当组件尝试访问数据时数据不存在,所以引发了错误。

答案 4 :(得分:0)

强制更新对象设置内容相同的新对象

<button @click="my.object.nested.variable = 2; my = Object.assign({}, my);">

this.my.object.nested.variable = 2;
this.my = Object.assign({}, this.my);