Vuex 状态树分析
发布时间:2023-04-14 13:08:44 所属栏目:教程 来源:
导读:对于每个大项目来说,使用状态树 (store) 管理状态 (state) 十分有必要。这就是为什么 Nuxt.js 内核实现了 Vuex。
使用状态树
Nuxt.js 会尝试找到src目录(默认是应用根目录)下的 store 目录,如果该目录存在
使用状态树
Nuxt.js 会尝试找到src目录(默认是应用根目录)下的 store 目录,如果该目录存在
|
对于每个大项目来说,使用状态树 (store) 管理状态 (state) 十分有必要。这就是为什么 Nuxt.js 内核实现了 Vuex。 使用状态树 Nuxt.js 会尝试找到src目录(默认是应用根目录)下的 store 目录,如果该目录存在,它将做以下的事情: 引用 vuex 模块 将 vuex 模块 加到 vendors 构建配置中去 设置 Vue 根实例的 store 配置项 Nuxt.js 支持两种使用 store 的方式,你可以择一使用: 模块方式: store 目录下的每个 .js 文件会被转换成为状态树指定命名的子模块 (当然,index 是根模块) Classic(不建议使用): store/index.js返回创建Vuex.Store实例的方法。 无论使用那种模式,您的state的值应该始终是function,为了避免返回引用类型,会导致多个实例相互影响。 普通方式 Nuxt.js允许您拥有一个 store 目录,其中包含与模块对应的每个文件。 首先,只需将状态导出为 函数,将变量和操作作为 store/index.js 中的对象导出: export const state = () => ({ counter: 0 }) export const mutations = { increment (state) { state.counter++ } } 然后,您可以拥有 store/todos.js 文件: export const state = () => ({ list: [] }) export const mutations = { add (state, text) { state.list.push({ text, done: false }) }, remove (state, { todo }) { state.list.splice(state.list.indexOf(todo), 1) }, toggle (state, todo) { todo.done = !todo.done } } Vuex将如下创建: new Vuex.Store({ state: () => ({ counter: 0 }), mutations: { increment (state) { state.counter++ } }, modules: { todos: { namespaced: true, state: () => ({ list: [] }), mutations: { add (state, { text }) { state.list.push({ text, done: false }) }, remove (state, { todo }) { state.list.splice(state.list.indexOf(todo), 1) }, toggle (state, { todo }) { todo.done = !todo.done } } } } }) 在您的 pages/todos.vue 中,使用 todos 模块: <template> <ul> <li v-for="todo in todos"> <input type="checkBox" :checked="todo.done" @change="toggle(todo)"> <span :class="{ done: todo.done }">{{ todo.text }}</span> </li> <li><input placeholder="What needs to be done?" @keyup.enter="addTodo"></li> </ul> </template> <script> import { mapMutations } from 'vuex' export default { computed: { todos () { return this.$store.state.todos.list } }, methods: { addTodo (e) { this.$store.commit('todos/add', e.target.value) e.target.value = '' }, ...mapMutations({ toggle: 'todos/toggle' }) } } </script> <style> .done { text-decoration: line-through; } </style> 模块方法也适用于顶级定义,而无需在 store 目录中实现子目录 示例:您创建文件 store/state.js 并添加以下内容 export default () => ({ counter: 0 }) 相应的可以在文件夹中添加 store/mutations.js export default { increment (state) { state.counter++ } } 模块文件 您可以将模块文件分解为单独的文件:state.js,actions.js,mutations.js和getters.js。如果您使用index.js来维护state,getters,actions和mutations,同时具有单个单独的操作文件,那么仍然可以正确识别该文件。 注意:在使用拆分文件模块时,必须记住使用箭头函数功能, this 在词法上可用。词法范围this意味着它总是指向引用箭头函数的所有者。如果未包含箭头函数,那么this将是未定义的(undefined)。解决方案是使用 "normal" 功能,该功能会将this指向自己的作用域,因此可以使用。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
