V-bind 在存储状态更改时不更新类

jus*_*inw 3 vue.js vuex vuejs2

我对 Vue 和 Nuxt 还很陌生。我正在努力摆脱困境$store

我创建了一个状态对象并给它一个简单布尔值的属性。我想根据该属性是否为true. 这是我创建商店的方式:

const store = () => {
    return new Vuex.Store({
        state: {
            foo: "You got the global state!",
            userSidebarVisible: true
        },
    })
}
Run Code Online (Sandbox Code Playgroud)

在我的vue文件中,我有以下内容:

<template>
    <div>
        <div>Hello!</div>
        <button v-on:click="showSidebar">Click</button>
        <div v-bind:class="{active: userSidebarVisible}">the sidebar</div>
        <div>{{$store.state.userSidebarVisible}}</div>
    </div>
</template>



<script>
    export default {
        data: function() {
            return {
                userSidebarVisible: this.$store.state.userSidebarVisible,
            }
        },
        methods: {
            showSidebar: function() {
                if (this.$store.state.userSidebarVisible === true) {
                    this.$store.state.userSidebarVisible = false;
                } else {
                    this.$store.state.userSidebarVisible = true;
                }
            }
        }
    }
</script>
Run Code Online (Sandbox Code Playgroud)

当我单击 时button,该类active不会切换,但最后一个类中的文本<div> 更新。我想知道我在这里做错了什么。对本地数据属性执行相同的操作似乎可以按预期工作。

tha*_*ksd 5

首先,你不应该改变$store突变之外的状态。

您需要向商店添加一个突变方法以进行更新userSidebarVisible

state: {
  userSidebarVisible: true
},
mutations: {
  SET_USER_SIDEBAR_VISIBLE(state, value) {
    state.userSidebarVisible = value;
  }
}
Run Code Online (Sandbox Code Playgroud)

其次,如果您希望 Vue 实例的数据反映状态数据,您可以userSidebarVisible使用 getter 和 setter 函数创建计算属性:

computed: {
  userSidebarVisible: {
    get() {
      return this.$store.state.userSidebarVisible;
    },
    set(value) {
      this.$store.commit('SET_USER_SIDEBAR_VISIBLE', value);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

state: {
  userSidebarVisible: true
},
mutations: {
  SET_USER_SIDEBAR_VISIBLE(state, value) {
    state.userSidebarVisible = value;
  }
}
Run Code Online (Sandbox Code Playgroud)
computed: {
  userSidebarVisible: {
    get() {
      return this.$store.state.userSidebarVisible;
    },
    set(value) {
      this.$store.commit('SET_USER_SIDEBAR_VISIBLE', value);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
const store = new Vuex.Store({
  state: {
    userSidebarVisible: true
  },
  mutations: {
    SET_USER_SIDEBAR_VISIBLE(state, value) {
      state.userSidebarVisible = value;
    }
  }
})

new Vue({
  el: '#app',
  store,
  computed: {
    userSidebarVisible: {
      get() {
        return this.$store.state.userSidebarVisible;
      },
      set(value) {
        this.$store.commit('SET_USER_SIDEBAR_VISIBLE', value);
      }
    }
  },
  methods: {
    toggleSidebar() {
      this.userSidebarVisible = !this.userSidebarVisible;
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

  • 喜欢你的回答,我想为这个问题增加一些深度;我们应该不直接用突变更新我们的状态,这没关系,但我在媒体上读到,我们不应该从 vue 文件提交突变,而应该分派提交突变的操作。即使是同步状态更新,此规则也始终适用吗? (2认同)