本篇文章带大家了解一下Vuex,介绍一下如何在应用程序中使用 Vuex。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
|
本篇文章带大家了解一下Vuex,介绍一下如何在应用程序中使用 Vuex。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
本文算是 Vuex的入门,当然也会 Vuex 的高级概念,并向大家展示如何在应用程序中使用 Vuex。 Vuex 解决的问题要理解Vuex,首先要理解它要解决的问题。 假设我们开发了一个多用户聊天应用。界面有用户列表、私人聊天窗口、带有聊天记录的收件箱和通知栏,通知用户当前未查看的其他用户的未读消息。 数以百万计的用户每天通过我们的应用与数以百万计的其他用户聊天。然而,有人抱怨一个恼人的问题:通知栏偶尔会给出错误的通知。用户被通知有一条新的未读消息,但当他们查看时,它只是一条已经被看过的消息。 该作者所描述的是几年前 Facebook 开发人员在其聊天系统中遇到的真实情况。 解决这一问题的过程中 开发人员创建名为 "Flux"的应用程序体系结构。 Flux 构成了Vuex,Redux 和其它类似库的基础。 FluxFacebook开发者为“僵尸通知”这个问题,苦苦挣扎了一段时间。他们最终意识到,它的持久性不仅仅是一个简单的缺陷——它指出了应用程序架构中的一些潜在缺陷。 抽象中最容易理解该缺陷:当应用程序中有多个共享数据的组件时,它们互连的复杂性将增加到无法预测或理解数据状态的地步。 因此,该应用程序无法扩展或维护。
事实上,Vuex并没有实现Flux的全部,只是一个子集。不过现在不要担心这个问题,我们关注于理解它所遵循的关键原则。 原则1:单一来源组件可能具有仅需要了解的本地数据。 例如,滚动条在用户列表组件中的位置可能与其他组件无关。 但是,要在组件之间共享的任何数据(即应用程序数据)都必须保存在一个单独的位置,与使用它的组件分开。 这个单一位置称为 "store"。 组件必须从该位置读取应用程序数据,并且不能保留其自己的副本以防止冲突或分歧。 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:数据是只读的组件可以从 取而代之的是,它们必须告知 为什么采用这种方法? 如果我们集中数据更改逻辑,那么在状态不一致的情况下,我们只需要在同一地方排查就行了,不用到具体的每个文件中。 我们将某些随机组件(可能在第三方模块中)以意外方式更改数据的可能性降至最低。 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 时确实可以这样做)。 但如果我们的 同步 太酷了,那么 Vuex 到底是什么?有了所有这些背景知识,我们终于可以解决这个问题-Vuex 是一个库,可帮助我们在Vue应用程序中实现Flux架构。 通过执行上述原则,即使在多个组件之间共享数据时,Vuex 仍可将我们的应用程序数据保持在透明且可预测的状态。 现在,我们已经对Vuex有了一个高级的了解,我们看看如何在实际项目创建基于Vuex的应用程序。 做一个使用 Vuex to-do-list为了演示Vuex的用法,我们设置一个简单的待办应用程序。 大家可以在此处访问代码的有效示例。 示例地址:https://codesandbox.io/s/happ... 如果大家自己的电脑尝试一波,那么可以使用下面的命令: vue create vuex-example 安装 Vuexcd vuex-example npm i -S vuex@4 npm run serve 创建一个 Vuex store现在,创建 Vuex store,在项目中创建 mkdir src/store touch src/store/index.js 打开文件并导入 // src/store/index.js
import { createStore } from "vuex";
export default createStore({});将 store 添加到 Vue 实例为了可以从任何组件中访问 Vuex store,我们需要在主文件中导入 // 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.vue TodoNew.vue现在,添加一个新组件 touch src/components/TodoNew.vue 打开 // src/components/TodoNew.vue
<template>
<form @submit.prevent="addTodo">
<input
type="text"
placeholder="Enter a new task"
v-model="task"
/>
</form>
</template>现在转到组件定义,有两个局部状态属性- // src/components/TodoNew.vue
<template>...</template>
<script>
export default {
data() {
return {
task: "",
id: 0
};
},
methods: {
addTodo: function() {
//
}
}
};
</script>定义 store 状态过会,我们会创建一个显示待办事项的组件。 由于它和 现在,回到 // src/store/index.js
import { createStore } from "vuex";
export default createStore({
state () {
return {
todos: []
}
}
});定义 mutation从原则2可以知道,Vuex state 不能直接更改,需要定义 现在,我们向 // src/store/index.js
import { createStore } from "vuex";
export default createStore({
state () {
return {
todos: []
}
},
mutations: {
addTodo (state, item) {
state.todos.unshift(item);
}
}
});使用 commit 调用 |
