【问题标题】:Child component does not re-render when props change in store当道具在商店中更改时,子组件不会重新渲染
【发布时间】:2019-12-08 09:30:16
【问题描述】:

我将 Vue-js 与 require-js 一起使用。我正在尝试从 vuex 商店获取数据到我的 cart 组件 并为商店中的每个项目呈现一个组件。但是,当我从我的 body 组件 触发突变以更改商店时,数据正在更改并且我的 cart 组件 的道具发生更改,但 UI 不会重新渲染。

这是我的商店:

    state: {
      users: {
        user1: {
           item: { date:null }
        }
      }
   }
   mutations: { setDate:function(state,payload){ 
              var newState = state.users;
              newState[user][item].date = payload.date
              state.users = Object.assign({},newState)
           } }

这是我的购物车组件:

<template>
    <div v-if="activeStep==1">
        <p> Service Time: {{service.ServiceTime}} Min.</p>
        <p>Date: {{service.date || 'Not Selected'}}  </p>
        <p>Time: {{service.time || 'Not Selected'}}  </p>
        <p>Prefered Staff:  {{service.staff}} </p>
    </div>
</template>

<script>

    define(['Vue','vuex'],function(Vue,vuex){
        return {
            template: template,
            computed: vuex.mapState(['activeStep']),
            props: ['service'],

        }
    })
</script>

这是我的购物车组件的父级:

<template>
    <div class="cart-user-body" >

            <div class="cart-service" v-for="(service,key,index) in users[user]" :key="index">
              <div class="cart-service-body">
                    <service-book-details :service="service"></service-book-details>
                </div>
            </div>
        </div>


</template>



<script>
    define([
        'Vue','vuex','vue!./serviceBookDetails'
    ], function(Vue,vuex,serviceBookDetails) {
        return {

            template:template,
            components: {
                'service-book-details': serviceBookDetails
            },
            props: ['user'],
            computed: vuex.mapState(['users']),
        }        
    });
</script>

这就是我从身体部位触发突变的方式:

addDate(e) {
        var payload = {
          date: moment(e, "DD/MM/YYYY").format("Do MMMM YYYY"),
          id: this.$data.class,
          name: this.username
        };
        this.$store.commit("setDate", payload);
      },

我什至尝试使用 Vue.set(state,'users',newState),但 UI 没有重新渲染。

我检查了 Vue 开发工具,发现触发突变后,我的 cart 组件 的 props 已更新,但未显示在 UI 上。

如果我尝试使用 getters,则对象的键不存在,因为我的商店在用户与 UI 交互并添加数据之前没有所需的数据。而且我的 购物车组件 从一开始就一直显示,所以它向我显示了一个错误,说 cant read property item of undefined

我做错了什么还是有其他方法可以让它发挥作用。

【问题讨论】:

  • 在这一行,newState[user][item].date = payload.dateuseritem 定义在哪里?
  • 我没有放确切的代码。这是确切的突变:setDate:function(state,payload){ var newState = state.users; newState[payload.name][payload.id].date = payload.date state.users = Object.assign({},state.users,newState) // Vue.set(state,'users',newState) },

标签: vue.js vue-component


【解决方案1】:

你不能使用数组索引来设置 Vue.js 的值。这是Javascript造成的限制。

如果您创建商店时user 和/或item 不存在,这将不会发生反应。

newState[user][item].date = 

相反,您需要使用:

Vue.set(object, key, value)

在您的情况下,您首先需要确保使用该方法设置useritem分配给date

【讨论】:

  • 当我调用突变时,商店中存在 state[user][id]。你的意思是我应该使用Vue.set(newState[payload.name][payload.id],date,payload.date) 在我的newState 中设置值,然后将其分配给state.users?
  • 另外,我的商店格式为:state:{ users:{ [guest-name]:{ [itemID]:{ date:null } }}}
  • @abhirham 我建议你在newState[user][item].date = payload.date 设置一个断点,然后使用chrome 的调试器(不是vue 工具)检查newState。确保 Vue 已经深入到整棵树中。应该只有对象的代理,而不是普通对象。如果你看到一个普通的对象,你就会知道这个状态不是响应式的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 2021-09-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2023-02-15
相关资源
最近更新 更多