Javascript vuex存储更改时更新属性

Javascript vuex存储更改时更新属性,javascript,vue.js,vuex,Javascript,Vue.js,Vuex,成功变异到vuex存储状态后,请使用此代码并使用Vue.set,以便Vue能够识别添加的对象属性: store/modules/post.js 模板或组件没有更新。支柱柱是非反应性的,因为即使是观察者也没有被触发。我已仔细检查,每个帖子的评论属性的Vuex存储区都已成功更新为comments对象,但组件SinglePost.vue没有看到这些更改 SinglePost.vue 最终,我可以通过显式地将注释从存储区返回到组件方法并设置本地注释对象来设置本地变量,但我想使用我的中央存储区并假设有一种

成功变异到vuex存储状态后,请使用此代码并使用Vue.set,以便Vue能够识别添加的对象属性:

store/modules/post.js

模板或组件没有更新。支柱柱是非反应性的,因为即使是观察者也没有被触发。我已仔细检查,每个帖子的评论属性的Vuex存储区都已成功更新为comments对象,但组件SinglePost.vue没有看到这些更改

SinglePost.vue

最终,我可以通过显式地将注释从存储区返回到组件方法并设置本地注释对象来设置本地变量,但我想使用我的中央存储区并假设有一种方法

单柱模板

编辑

我是如何获得帖子的:

getPosts ({ commit, state, getters, dispatch, rootState }, ctx) {
  //other stuff
  APIHelper.post('/post/search', mergedPayload).then(res => {
    var results = res.data.results
    commit('SET_POSTS', posts || [])
    // where SET_POSTS is just state.posts = posts
vuex操作getPosts是从Posts.vue组件调用的,不返回任何内容,因为它是由一个变异@click=getPoststhis.context设置的。这对于设置帖子非常有用

    <div v-for="post in posts">
      <single-post :key="post._id" :post="post" context="feed" />
    </div>
您应该使用vuex的MapGetter

它提供对存储状态的访问,并且是被动的,因此您不需要监视程序或其他计算程序。

您应该使用vuex的MapGetter


它提供对存储状态的访问,并且是被动的,因此您不需要监视程序或额外的计算。

双向数据绑定是实现这一点的好方法,您可以创建自己的getter/setter方法,并在需要时将其导入Vue组件中:

export function mapFields(fields)
{
    let computers = {}
    for (let field of fields) {
        computers[field] = {
            get() {
                return this.$store.state[field];
            },
            set(value) {
                this.$store.commit(`UPDATE_${field.toUpperCase()}`, value);
            }
        }
    }
    return computers;
}
然后在Vue组件中:

import {mapFields} from 'utils.js'; // or whatever the name of the file

computed: {
   ...mapFields(['mappedState']),
},
this.mappedState = ['foo', 'bar'];
// In your template
{{ mappedState }}

// In Vue methods
this.mappedState;
正在Vue组件中更新此.mappedState:

import {mapFields} from 'utils.js'; // or whatever the name of the file

computed: {
   ...mapFields(['mappedState']),
},
this.mappedState = ['foo', 'bar'];
// In your template
{{ mappedState }}

// In Vue methods
this.mappedState;
将触发:

this.$store.commit('UPDATE_MAPPEDSTATE', ['foo', 'bar']);
要获取属性数据,只需在组件中调用它:

import {mapFields} from 'utils.js'; // or whatever the name of the file

computed: {
   ...mapFields(['mappedState']),
},
this.mappedState = ['foo', 'bar'];
// In your template
{{ mappedState }}

// In Vue methods
this.mappedState;

双向数据绑定是实现这一点的好方法,您可以创建自己的getter/setter方法,并在需要时将其导入Vue组件中:

export function mapFields(fields)
{
    let computers = {}
    for (let field of fields) {
        computers[field] = {
            get() {
                return this.$store.state[field];
            },
            set(value) {
                this.$store.commit(`UPDATE_${field.toUpperCase()}`, value);
            }
        }
    }
    return computers;
}
然后在Vue组件中:

import {mapFields} from 'utils.js'; // or whatever the name of the file

computed: {
   ...mapFields(['mappedState']),
},
this.mappedState = ['foo', 'bar'];
// In your template
{{ mappedState }}

// In Vue methods
this.mappedState;
正在Vue组件中更新此.mappedState:

import {mapFields} from 'utils.js'; // or whatever the name of the file

computed: {
   ...mapFields(['mappedState']),
},
this.mappedState = ['foo', 'bar'];
// In your template
{{ mappedState }}

// In Vue methods
this.mappedState;
将触发:

this.$store.commit('UPDATE_MAPPEDSTATE', ['foo', 'bar']);
要获取属性数据,只需在组件中调用它:

import {mapFields} from 'utils.js'; // or whatever the name of the file

computed: {
   ...mapFields(['mappedState']),
},
this.mappedState = ['foo', 'bar'];
// In your template
{{ mappedState }}

// In Vue methods
this.mappedState;

我添加了一个getter postById:state=>postId=>\uu.findstate.posts,[''u id',postId],并传递了一个postId来测试您的理论,但它仍然没有更新。我还希望getter在存储更改时不会缓存,但对于计算的:{我在帖子中使用的注释。例如,如果computed不起作用,getters prob也不会起作用,对吗?mapGetters有点用词不当。请注意,助手在computed声明中使用,因此它实际上是在创建计算属性。他是对的,但设置正确,vuex存储是一个全局反应对象,这是最广义的。嗯,我猜当试图将一个getter映射到post对象本身时,它不起作用,但是当将它映射到一个新对象并使用它来代替currPost时,它确实起作用。因此@Ashram您一直都是对的。我很抱歉,我添加了一个getter-postById:state=>postId=>\uu.findstate.posts,['\u-id',postId],并传递了一个postId来测试您的理论,但它仍然没有更新。我还希望getter在存储更改时不会缓存,但对于计算的:{我在帖子中使用的注释。例如,如果computed不起作用,getters prob也不会起作用,对吗?mapGetters有点用词不当。请注意,助手在computed声明中使用,因此它实际上是在创建计算属性。他是对的,但设置正确,vuex存储是一个全局反应对象,这是最广义的。嗯,我猜当试图将getter映射到post对象本身时,它不起作用,但是当将它映射到一个新对象并使用它来代替currPost时,它确实起作用。因此@Ashram你一直都是对的。我的道歉你能展示你是如何从存储中检索post对象并将其作为道具传递到组件的吗?@thanksd,我更新了我的post w通过编辑-基本上posts包含许多post对象,这些对象在存储中设置,在posts.vue中使用v-for进行迭代,其中每个post都作为道具传递给SinglePost.vue。我通过在SinglePost中检索和设置注释使其工作,但不使用vuex存储在该v-for中,post的数据在哪里/如何设置?@thanksd,设置完毕在SET_POSTS中,从getPosts操作调用state.POSTS=有效负载的vuex存储中的POSTS。getPosts操作由附加到单击事件@click=getPoststhis.context in POSTS.vue的操作处理程序getPosts调度-简言之,POSTS是在vuex存储中设置的,而不是在组件中设置的。您如何访问thos的值从组件中删除帖子?是否设置了getter?是否使用Mapgetter?是否可以演示如何从存储中检索帖子对象并将其作为道具传递给组件?@thanksd,我用编辑更新了我的帖子-基本上,帖子包含许多帖子对象,这些对象在存储中设置,并在posts.vue中使用v-for进行迭代,其中每个post作为道具传递给SinglePost.vue。我通过在中检索和设置注释使其正常工作
SinglePost,但不使用该v-for中的vuex存储,将在何处/如何设置帖子的数据?@thanksd,它是在vuex存储的set_posts中设置的,state.posts=从getPosts操作调用的有效负载。getPosts操作由附加到单击事件@click=GetPostStThis.context的操作处理程序getPosts在Posts.vue中调度-简而言之,Posts是在vuex存储中设置的,而不是在组件中设置的。您如何从组件访问这些Posts的值?你有一个getter设置吗?你在使用MapGetter吗?