Vuex 4 指南,使用 Vue3 的需要看看!
时间:2025-11-05 03:10:53 出处:人工智能阅读(143)

Vuex 是指南 Vue.js 生态系统中必不可少的工具。但是使用新接触 Vuex 的开发人员可能会被诸如“状态管理模式”这样的术语所排斥,并且对他们实际需要Vuex的指南目的感到困惑。
本文算是使用 Vuex的入门,当然也会 Vuex 的指南高级概念,并向大家展示如何在应用程序中使用 Vuex。使用
Vuex 解决的指南问题
要理解Vuex,首先要理解它要解决的使用问题。
假设我们开发了一个多用户聊天应用。指南界面有用户列表、使用私人聊天窗口、指南带有聊天记录的使用收件箱和通知栏,通知用户当前未查看的指南其他用户的未读消息。
数以百万计的使用用户每天通过我们的应用与数以百万计的其他用户聊天。然而,指南有人抱怨一个恼人的服务器租用问题:通知栏偶尔会给出错误的通知。用户被通知有一条新的未读消息,但当他们查看时,它只是一条已经被看过的消息。
该作者所描述的是几年前 Facebook 开发人员在其聊天系统中遇到的真实情况。解决这一问题的过程中 开发人员创建名为 **"Flux"**的应用程序体系结构。Flux 构成了Vuex,Redux 和其它类似库的基础。
Flux
Facebook开发者为“僵尸通知”这个问题,苦苦挣扎了一段时间。他们最终意识到,它的持久性不仅仅是一个简单的缺陷——它指出了应用程序架构中的一些潜在缺陷。
抽象中最容易理解该缺陷:当应用程序中有多个共享数据的组件时,它们互连的复杂性将增加到无法预测或理解数据状态的地步。因此,该应用程序无法扩展或维护。IT技术网
Flux 是一个模式,不是一个库。我们不能去Github下载 Flux。它是一种类似MVC的设计模式。像Vuex和Redux这样的库实现Flux模式的方式与其他框架实现MVC模式的方式相同。
事实上,Vuex并没有实现Flux的全部,只是一个子集。不过现在不要担心这个问题,我们关注于理解它所遵循的关键原则。
原则1:单一来源
组件可能具有仅需要了解的本地数据。例如,滚动条在用户列表组件中的位置可能与其他组件无关。
但是,要在组件之间共享的任何数据(即应用程序数据)都必须保存在一个单独的位置,与使用它的组件分开。
这个单一位置称为 "store"。WordPress模板组件必须从该位置读取应用程序数据,并且不能保留其自己的副本以防止冲突或分歧。
import { createStore } from "vuex"; // Instantiate our Vuex store const store = createStore({ // "State" 组件的应用程序数据 state () { return { myValue: 0 }; } }); // 组件从其计算的属性访问 state const MyComponent = { template: "<div>{{ myValue }}</div>", computed: { myValue () { return store.state.myValue; } } };原则2:数据是只读的
组件可以从store中自由读取数据。但是不能更改 store 中的数据,至少不能直接更改。
取而代之的是,它们必须告知 store 要更改数据的意图,store由负责通过一组定义的功能(称为mutation)进行更改。
为什么采用这种方法?如果我们集中数据更改逻辑,那么在状态不一致的情况下,我们只需要在同一地方排查就行了,不用到具体的每个文件中。我们将某些随机组件(可能在第三方模块中)以意外方式更改数据的可能性降至最低。
const store = createStore({ state() { return { myValue: 0 }; }, mutations: { increment (state, value) { state.myValue += value; } } }); // 需要更新值吗? // 错误的,不要直接更改 store 值 store.myValue += 10; // 正确的,调用正确的 mutations。 store.commit(increment, 10);原则3:mutation 是同步的
如果应用程序在其体系结构中实现了上述两个原则,那么调试数据不一致就容易得多。可以记录提交并观察状态如何变化(在使用Vue Devtools 时确实可以这样做)。
但如果我们的mutation被异步调用,这种能力就会被削弱。我们知道提交的顺序,但我们不知道组件提交它们的顺序。
同步mutation可确保状态不取决于不可预测事件的顺序和时间。
太酷了,那么 Vuex 到底是什么?
有了所有这些背景知识,我们终于可以解决这个问题-Vuex 是一个库,可帮助我们在Vue应用程序中实现Flux架构。通过执行上述原则,即使在多个组件之间共享数据时,Vuex 仍可将我们的应用程序数据保持在透明且可预测的状态。
现在,我们已经对Vuex有了一个高级的了解,我们看看如何在实际项目创建基于Vuex的应用程序。
做一个使用 Vuex to-do-list
为了演示Vuex的用法,我们设置一个简单的待办应用程序。大家可以在此处访问代码的有效示例。
示例地址:https://codesandbox.io/s/happy-williams-rdni7
如果大家自己的电脑尝试一波,那么可以使用下面的命令:
vue create vuex-example安装 Vuex
cd vuex-example npm i -S vuex@4 npm run serve创建一个 Vuex store
现在,创建 Vuex store,在项目中创建 src/store/index.js:
mkdir src/store touch src/store/index.js打开文件并导入createStore方法。此方法用于定义store及其特性。现在,我们导出该store ,以便在Vue应用中能访问它。
// src/store/index.js import { createStore } from "vuex"; export default createStore({});将 store 添加到 Vue 实例
为了可以从任何组件中访问 Vuex store,我们需要在主文件中导入 store 模块,并将store作为插件安装在主Vue实例上
// src/main.js import { createApp } from "vue"; import App from "@/App"; import store from "@/store"; const app = createApp(App); app.use(store); app.mount("#app");创建一个简单的应用程序
如上所述,Vuex 的重点是通常在大型应用程序中创建可扩展的全局状态。但是,我们可以在一个简单的待办应用程序中演示其功能。
完成后效果如下所示:

现在,删除 HelloWorld 文件:
rm src/components/HelloWorld.vueTodoNew.vue
现在,添加一个新组件 TodoNew,它负责创建新的待办事项。
touch src/components/TodoNew.vue打开 TodoNew.vue 并输入以下内容:
// src/components/TodoNew.vue <template> <form @submit.prevent="addTodo"> <input type="text" placeholder="Enter a new task" v-model="task" /> </form> </template>现在转到组件定义,有两个局部状态属性-task和给新待办事项提供唯一标识符的id。
// src/components/TodoNew.vue <template>...</template> <script> export default { data() { return { task: "", id: 0 }; }, methods: { addTodo: function() { // } } }; </script>定义 store 状态
过会,我们会创建一个显示待办事项的组件。由于它和TodoNew组件都需要访问相同的数据,因此这是我们在 Vuex 存储中保存的全局state 的理想选择。
现在,回到state并定义属性状态。这里使用 Vux4 提供的 createStore 函数,该函数返回一个对象。该对象具有一个属性 todos,它是一个空数组。
// src/store/index.js import { createStore } from "vuex"; export default createStore({ state () { return { todos: [] } } });定义 mutation
从原则2可以知道,Vuex state 不能直接更改,需要定义mutator函数。
现在,我们向store添加一个mutation属性,并添加一个函数属性addTodo。所有mutator方法第一个参数。第二个可选参数是 store,第二个是传递的数据。
// src/store/index.js import { createStore } from "vuex"; export default createStore({ state () { return { todos: [] } }, mutations: { addTodo (state, item) { state.todos.unshift(item); } } });使用 commit 调用 mutation
现在,可以在TodoNew组件中使用它,在 TodoNew组件定义一个addTodo方法。
要访问store ,我们可以使用全局属性this.$store。使用commit方法创建一个新的mutation。需要传递了两个参数-首先是mutation的名称,其次是我们要传递的对象,是一个新的待办事项(由id和task值组成)。
// src/components/TodoNew.vue methods: { addTodo: function() { const { id, task } = this; this.$store.commit("addTodo", { id, task }); this.id++; this.task = ""; } }回顾
到目前为止:
用户将待办事项通过输入框输入,并绑定到 task 变量。 提交表单后,将调用addTodo方法 创建一个待办事项对象并将其“提交”到store中。 // src/components/TodoNew.vue <template> <form @submit.prevent="addTodo"> <input type="text" placeholder="Enter a new task" v-model="task" /> </form> </template> <script> export default { data() { return { task: "", id: 0 }; }, methods: { addTodo: function() { const { id, task } = this; this.$store.commit("addTodo", { id, task }); this.id++; this.task = ""; } } }; </script>读取 store 数据
现在,我们已经创建了用于添加待办事项的功能。接下来,就是把它们显示出来。
创建一个新组件TodoList.vue 文件。
touch src/components/TodoList.vue内容如下:
// src/components/TodoList.vue <template> <ul> <li v-for="todo in todos" :key="todo.id" > {{ todo.description }} </li> </ul> </template>todos是一个计算属性,我们在其中返回Vuex store 的内容。
// src/components/TodoList.vue <script> export default { computed: { todos() { // } } }; </script>定义 getters
与直接访问store 内容不同,getter是类似于存储的计算属性的函数。在将数据返回到应用程序之前,这些工具非常适合过滤或转换数据。
例如,下面有getTodos,它返回未过滤的状态。在许多情况下,可以使用filter或map来转换此内容。
todoCount返回todo数组的长度。
通过确保组件愿意保留数据的本地副本,getter有助于实现原则1,即单一数据来源。
// src/store/index.js export default createStore({ ... getters: { getTodos (state) { return state.todos; }, todoCount (state) { return state.todos.length; } } })返回TodoList组件,我们通过返回this.$store.getters.getTodos来完成功能。
// src/components/TodoList.vue <script> export default { computed: { todos() { return this.$store.getters.getTodos; } } }; </script>App.vue
要完成此应用程序,现在要做的就是导入并在App.vue中声明我们的组件。
// src/App.vue <template> <div> <h1>To-Do List</h1> <div> <TodoNew /> <TodoList /> </div> </div> </template> <script> import TodoNew from "@/components/TodoNew.vue"; import TodoList from "@/components/TodoList.vue"; export default { components: { TodoNew, TodoList } }; </script>你真的需要Vuex吗?
显然,在大型应用程序中,拥有全局状态管理解决方案将有助于让我们的应用程序可预测和可维护。
但对于比较小的项目,有时候觉得使用 Vuex 太大材小用了,还这个还是大家跟着实际需求走比较合理。
Vuex的优点:
易于管理全局状态 强大的调试全局状态Vuex的缺点:
额外的项目依赖 繁琐的模板~ 完, 我是刷碗智,刷碗去咯,下期见!
作者:Anthony Gore 译者:前端小智 来源:vuejsdevelopers
原文:https://vuejsdevelopers.com/2017/05/15/vue-js-what-is-vuex/
猜你喜欢
- OPPOA57自拍效果实测(探秘OPPOA57自拍的魅力与功能)
- Ubuntu升级到12.04失败的解决办法1:按关机键,使用tab键重启2:选择previous version 中的升级前的一个版本的recovery模式,然后进行network修复.3:重启,选择ubuntu第一个选项,进去后网络可以用了,然后更新软件ok了。ps:在恢复模式中可以进行很多操作,清理旧内核,释放空间等等。当ubuntu出了问题,可以进入以前的版本或者修复模式。
- ubuntu安装和配置SVN第一步:安装apache2 libapache2-svn subversion复制代码代码如下:复制代码代码如下:复制代码代码如下:apt-get install subversion2. 建立svn仓库1). 建立svn目录:mkdir /home/.svn(使用隐藏目录)2). cd /home/.svn 3). mkdir astar4). 创建仓库astar:svnadmin create /home/.svn/astar,执行完毕后astar目录有svnadmin创建的目录和文件5). mkdir test6). 创建仓库test:svnadmin create /home/.svn/test,执行完毕后test目录有svnadmin创建的目录和文件3. 配置和管理svn1). 每个仓库的配置文件在$repos/conf/下,vi svnserve.conf,配置项在[general]下:anon-access:匿名用户的权限,可以为read,write和none,默认值read。不允许匿名用户访问:anon-access = noneauth-access:认证用户的权限,可以为read,write和none,默认值write。password-db:密码数据库的路径,去掉前边的#authz-db:认证规则库的路径,去掉前边的#。注意:这些配置项的行都要顶格,否则会报错。修改配置后需要重启svn才能生效。2). 配置passwd文件这是每个用户的密码文件,比较简单,就是“用户名=密码”,采用的是明码。如allen=1111113). 配置authz文件1. [groups] section:为了便于管理,可以将一些用户放到一个组里边,比如:owner=allen,ellen2. groups下边的sections表示对一个目录的认证规则,比如对根目录的认证规则的section为[/]。设置单用户的认证规则时一个用户一行,如: [/] allen=rw #allen对根目录的权限为rw ellen=r #ellen对根目录的权限为r 假如使用group,需要在group名字前加@,如 @owner=rw #group owner中的用户均为rw,等价于上边的两句话启动时假如从/home/.svn/astar启动,/就是astar目录,用如上方式以astar目录为根设置权限。假如从/home/.svn/启动,每个仓库根还是自己的起始目录。可以采用如上方式设置astar的权限,也可以采用如下方式: [astar:/] @owner=rw设置test的权限如下: [test:/] @harry_and_sally = rw简言之,每个仓库的根目录(/)就是自己的起始目录;[repos:/]这种方式只适用于多仓库的情况;[/]适合于单仓库和单仓库的方式。3. 不能跨越仓库设置权限。4. 启动和停止svn 1). 启动:1. 从astar目录启动,svnserve -d -r /home/.svn/astar,根目录(/)是astar,authz中规则的配置使用section[/]。访问方式为: svn://192.168.0.87/2. 从.svn目录启动,svnserve -d -r /home/.svn,根目录(/)是.svn,authz中对astar的配置使用section[astar:/] ,对test的配置使用section[test:/]。访问方式为: svn://192.18.0.87/astar svn://192.18.0.87/test假如需要svn自启动,把命令加入/etc/rc.local中2). 检查svn服务器是否已经启动(svn默认使用3690端口):netstat -an | grep 36903). 停止:killall svnserve5. svn client推荐使用TortoiseSVN, http://tortoisesvn.tigris.org/Eclipse插件,http://subclipse.tigris.org/作者 t80t90s
- 电脑耳机效果调试教程(让你的音乐体验更上一层楼)
- 电脑时钟错误导致无法上网的解决方法(解决电脑时钟错误,顺利上网畅享互联网世界)
- 解决电脑读写文件错误的方法(处理电脑文件错误,让读写更高效)
- Ubuntu怎么安装mac os x主题呢?下文小编将为大家分享ubuntu14.04安装mac os x主题教程,安装MAC OS X 主题会帮助你的 Ubuntu 14.04 看起来更像MAC OS X,效果非常的不错。buntu14.04安装mac os x主题教程:第一步、下载壁纸第一步要做的事仅仅是下载Mac OS X 的壁纸,这个压缩包的大小有39.2MB, 解压之后右键点击桌面->修改背景图片->选择下载的背景。第二步、安装主题修改工具为了修改GTK主题,图标,系统主题,光标,字体我们需要安装unity tweak。要安装unity tweak在ubuntu14.04上通过使用如下命令:sudo apt-get install unity-tweak-tool当然你也可以通过安装ubuntu-tweak来实现主题更换sudo add-apt-repository ppa:tualatrix/ppasudo apt-get updatesudo apt-get install ubuntu-tweak效果图:第三步、在Ubuntu 14.04上安装Mac OS X主题为了修改上文所说的内容。我们需要打开终端运行如下命令:sudo add-apt-repository ppa:noobslab/themessudo apt-get updatesudo apt-get install mac-ithemes-v3sudo apt-get install mac-icons-v3现在打开刚才安装的工具来选择主题,在GTK主题上选择MBuntu,再本地tab上选择“Mbuntu-osx”,在光标tab上选择“Mac-cursors”。现在unity桌面看起来就像Mac了,你已经有了mac的图标,mac的窗口样式,mac的鼠标指针样式。
- 多桌面是一个非常有用的功能,它能让不同的工作任务分别被放置在不同的工作区中, 保持桌面的整洁,让人心情舒畅, 保持工作的高效率。多桌面一直是Linux桌面的一大特色,不过ubuntu这几个版本默认都没有开启多桌面,估计是为了照顾windows用户迁移适应。作为Linux爱好者, 如何开启ubuntu的多桌面功能呢?1、点击左侧菜单中的“扳手齿轮”图标,打开系统设置。2、进入“外观”选项。3、选择“行为”标签页,勾选“开启工作区”。然后关闭系统设置。4、使用快捷键 CTRL + 上/下/左/右 切换工作区。
- 磁盘重新分区教程(以简单步骤了解如何重新分区您的磁盘)