写在前面

状态管理也就是数据状态管理,vue 应用程序的各组件之间经常需要进行通信,除了 v-on、EventBus 等通信方式外,可以采用数据共享的方式进行通信。这种简单的数据共享模式就是 store 模式。

Vue 官网有对简单状态管理的介绍,详看 Vue 状态管理

store 状态管理模式的实现思想很简单,就是定义一个 store 对象,对象里有 state 属性存储共享数据,对象里还存储操作这些共享数据的方法。在组件中将 store.state 共享数据作为 data 的一部分或全部,在对 store.state 对象里的共享数据进行改变时,必须调用 store 提供的接口进行共享数据的更改。

以下以一个简单 todo-list demo 来介绍 store 状态管理模式

1. 定义 store.js

  1. //store.js
  2. export const store = {
  3. state: {
  4. todos: [
  5. {text: '写语文作业', done: false},
  6. {text: '做数学卷子', done: false}
  7. ]
  8. },
  9. addTodo(str){
  10. const obj = {text: str, done: false}
  11. this.state.todos.push(obj)
  12. },
  13. setDone(index){
  14. this.state.todos[index].done = true
  15. }
  16. }

2. 组件使用 store.js

  1. //A.vue
  2. <template>
  3. <div class="A">
  4. 我是 A组件
  5. <ul>
  6. <li v-for="(todo,index) in todos"
  7. :key="index" :class="todo.done?'done':''" @click="setDone(index)">
  8. {{todo.text}}
  9. </li>
  10. </ul>
  11. </div>
  12. </template>
  13. <script>
  14. import {store} from '../store/store.js'
  15. export default {
  16. name: 'A',
  17. data(){
  18. return store.state
  19. },
  20. methods: {
  21. setDone(index){
  22. store.setDone(index)
  23. }
  24. }
  25. }
  26. </script>
  27. <style scoped>
  28. .A{
  29. background: red;
  30. color: white;
  31. padding: 20px;
  32. }
  33. .A li.done{
  34. background: green;
  35. }
  36. </style>
  1. //B.vue
  2. <template>
  3. <div class="B">
  4. <div>
  5. 我是 B 组件,在下方输入框输入任务在 A组件 中添加任务
  6. </div>
  7. <input type="text" v-model="text">
  8. <button @click="addTodo">add todo</button>
  9. </div>
  10. </template>
  11. <script>
  12. import {store} from '../store/store.js'
  13. export default {
  14. name: 'B',
  15. data(){
  16. return {
  17. text: ''
  18. }
  19. },
  20. methods:{
  21. addTodo(){
  22. if(this.text){
  23. store.addTodo(this.text)
  24. }
  25. }
  26. }
  27. }
  28. </script>
  29. <style scoped>
  30. .B{
  31. background: yellow;
  32. padding: 20px;
  33. }
  34. </style>
  1. //App.vue
  2. <template>
  3. <div id="app">
  4. <A />
  5. <B />
  6. </div>
  7. </template>
  8. <script>
  9. import A from './components/A.vue'
  10. import B from './components/B.vue'
  11. export default {
  12. name: 'App',
  13. components: {
  14. A,
  15. B
  16. }
  17. }
  18. </script>

3. 实现效果

Vue 简单状态管理—store模式 - 图1

可以看到,在 A组件 中显示的数据,在 B组件 中进行添加和修改,就是通过数据共享的方式进行数据通信,简单的 store模式 就是这样的运用方式。