写在后面
状态治理也就是数据状态治理,vue 应用程序的各组件之间常常须要进行通信,除了 v-on、EventBus 等通信形式外,能够采纳数据共享的形式进行通信。这种简略的数据共享模式就是 store 模式。
Vue 官网有对简略状态治理的介绍,详看 Vue 状态治理
store 状态管理模式的实现思维很简略,就是定义一个 store 对象,对象里有 state 属性存储共享数据,对象里还存储操作这些共享数据的办法。在组件中将 store.state 共享数据作为 data 的一部分或全副,在对 store.state 对象里的共享数据进行扭转时,必须调用 store 提供的接口进行共享数据的更改。
以下以一个简略 todo-list demo 来介绍 store 状态管理模式
1. 定义 store.js
//store.jsexport const store = { state: { todos: [ {text: '写语文作业', done: false}, {text: '做数学卷子', done: false} ] }, addTodo(str){ const obj = {text: str, done: false} this.state.todos.push(obj) }, setDone(index){ this.state.todos[index].done = true }}
2. 组件应用 store.js
//A.vue<template> <div class="A"> 我是 A组件 <ul> <li v-for="(todo,index) in todos" :key="index" :class="todo.done?'done':''" @click="setDone(index)"> {{todo.text}} </li> </ul> </div></template><script>import {store} from '../store/store.js'export default { name: 'A', data(){ return store.state }, methods: { setDone(index){ store.setDone(index) } }}</script><style scoped>.A{ background: red; color: white; padding: 20px;}.A li.done{ background: green;}</style>
//B.vue<template> <div class="B"> <div> 我是 B 组件,在下方输入框输出工作在 A组件 中增加工作 </div> <input type="text" v-model="text"> <button @click="addTodo">add todo</button> </div></template><script>import {store} from '../store/store.js'export default { name: 'B', data(){ return { text: '' } }, methods:{ addTodo(){ if(this.text){ store.addTodo(this.text) } } }}</script><style scoped>.B{ background: yellow; padding: 20px;}</style>
//App.vue<template> <div id="app"> <A /> <B /> </div></template><script>import A from './components/A.vue'import B from './components/B.vue'export default { name: 'App', components: { A, B }}</script>
3. 实现成果
能够看到,在 A组件 中显示的数据,在 B组件 中进行增加和批改,就是通过数据共享的形式进行数据通信,简略的 store模式 就是这样的使用形式。