目录
Vuex 解决的问题
Flux
原则1:单一来源
原则2:数据是只读的
原则3:mutation 是同步的
太酷了,那么 Vuex 到底是什么?
做一个使用 Vuex to-do-list
安装 Vuex
创建一个 Vuex store
将 store  添加到 Vue 实例
创建一个简单的应用程序
TodoNew.vue
定义 store 状态
定义 mutation
使用 commit 调用 mutation
回顾
读取 store 数据
定义 getters
你真的需要Vuex吗?
首页 web前端 Vue.js 什么是Vuex?Vuex 4初学者指南

什么是Vuex?Vuex 4初学者指南

May 26, 2021 am 11:26 AM
vue.js

本篇文章带大家了解一下Vuex,介绍一下如何在应用程序中使用 Vuex。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

什么是Vuex?Vuex 4初学者指南

Vuex 是 Vue.js 生态系统中必不可少的工具。但是新接触 Vuex 的开发人员可能会被诸如“状态管理模式”这样的术语所排斥,并且对他们实际需要Vuex的目的感到困惑。【相关推荐:《vue.js教程》】

本文算是 Vuex的入门,当然也会 Vuex 的高级概念,并向大家展示如何在应用程序中使用 Vuex。

Vuex 解决的问题

要理解Vuex,首先要理解它要解决的问题。

假设我们开发了一个多用户聊天应用。界面有用户列表、私人聊天窗口、带有聊天记录的收件箱和通知栏,通知用户当前未查看的其他用户的未读消息。

数以百万计的用户每天通过我们的应用与数以百万计的其他用户聊天。然而,有人抱怨一个恼人的问题:通知栏偶尔会给出错误的通知。用户被通知有一条新的未读消息,但当他们查看时,它只是一条已经被看过的消息。

该作者所描述的是几年前 Facebook 开发人员在其聊天系统中遇到的真实情况。 解决这一问题的过程中 开发人员创建名为 "Flux"的应用程序体系结构。 Flux 构成了Vuex,Redux 和其它类似库的基础。

Flux

Facebook开发者为“僵尸通知”这个问题,苦苦挣扎了一段时间。他们最终意识到,它的持久性不仅仅是一个简单的缺陷——它指出了应用程序架构中的一些潜在缺陷。

抽象中最容易理解该缺陷:当应用程序中有多个共享数据的组件时,它们互连的复杂性将增加到无法预测或理解数据状态的地步。 因此,该应用程序无法扩展或维护。

Flux 是一个模式,不是一个库。我们不能去Github下载 Flux。它是一种类似MVC的设计模式。像Vuex和Redux这样的库实现Flux模式的方式与其他框架实现MVC模式的方式相同。

事实上,Vuex并没有实现Flux的全部,只是一个子集。不过现在不要担心这个问题,我们关注于理解它所遵循的关键原则。

原则1:单一来源

组件可能具有仅需要了解的本地数据。 例如,滚动条在用户列表组件中的位置可能与其他组件无关。

但是,要在组件之间共享的任何数据(即应用程序数据)都必须保存在一个单独的位置,与使用它的组件分开。

这个单一位置称为 "store"。 组件必须从该位置读取应用程序数据,并且不能保留其自己的副本以防止冲突或分歧。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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)进行更改。

为什么采用这种方法? 如果我们集中数据更改逻辑,那么在状态不一致的情况下,我们只需要在同一地方排查就行了,不用到具体的每个文件中。 我们将某些随机组件(可能在第三方模块中)以意外方式更改数据的可能性降至最低。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

const store = createStore({

  state() {

    return {

      myValue: 0

    };

  },

  mutations: {

    increment (state, value) {

      state.myValue += value;

    }

  }

});

// 需要更新值吗?

// 错误的,不要直接更改 store 值

store.myValue += 10;

// 正确的,调用正确的 mutations。

store.commit(&#39;increment&#39;, 10);

登录后复制

原则3:mutation 是同步的

如果应用程序在其体系结构中实现了上述两个原则,那么调试数据不一致就容易得多。可以记录提交并观察状态如何变化(在使用Vue Devtools 时确实可以这样做)。

但如果我们的mutation被异步调用,这种能力就会被削弱。我们知道提交的顺序,但我们不知道组件提交它们的顺序。

同步mutation可确保状态不取决于不可预测事件的顺序和时间。

太酷了,那么 Vuex 到底是什么?

有了所有这些背景知识,我们终于可以解决这个问题-Vuex 是一个库,可帮助我们在Vue应用程序中实现Flux架构。 通过执行上述原则,即使在多个组件之间共享数据时,Vuex 仍可将我们的应用程序数据保持在透明且可预测的状态。

现在,我们已经对Vuex有了一个高级的了解,我们看看如何在实际项目创建基于Vuex的应用程序。

做一个使用 Vuex to-do-list

为了演示Vuex的用法,我们设置一个简单的待办应用程序。 大家可以在此处访问代码的有效示例。

示例地址:https://codesandbox.io/s/happ...

如果大家自己的电脑尝试一波,那么可以使用下面的命令:

1

vue create vuex-example

登录后复制

安装 Vuex

1

2

3

cd vuex-example

npm i -S vuex@4

npm run serve

登录后复制

创建一个 Vuex store

现在,创建 Vuex store,在项目中创建 src/store/index.js

1

2

mkdir src/store

touch src/store/index.js

登录后复制

打开文件并导入createStore方法。此方法用于定义store及其特性。现在,我们导出该store ,以便在Vue应用中能访问它。

1

2

3

4

5

// src/store/index.js

 

import { createStore } from "vuex";

 

export default createStore({});

登录后复制

将 store 添加到 Vue 实例

为了可以从任何组件中访问 Vuex store,我们需要在主文件中导入 store 模块,并将store作为插件安装在主Vue实例上

1

2

3

4

5

6

7

8

9

10

11

// 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 的重点是通常在大型应用程序中创建可扩展的全局状态。 但是,我们可以在一个简单的待办应用程序中演示其功能。

完成后效果如下所示:

1.png

现在,删除 HelloWorld 文件:

1

rm src/components/HelloWorld.vue

登录后复制

TodoNew.vue

现在,添加一个新组件 TodoNew,它负责创建新的待办事项。

1

touch src/components/TodoNew.vue

登录后复制

打开 TodoNew.vue 并输入以下内容:

1

2

3

4

5

6

7

8

9

10

11

// src/components/TodoNew.vue

 

<template>

  <form @submit.prevent="addTodo">

    <input

      type="text"

      placeholder="Enter a new task"

      v-model="task"

    />

  </form>

</template>

登录后复制

现在转到组件定义,有两个局部状态属性-task和给新待办事项提供唯一标识符的id

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

// 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,它是一个空数组。

1

2

3

4

5

6

7

8

9

10

// src/store/index.js

import { createStore } from "vuex";

 

export default createStore({

  state () {

    return {

      todos: []

    }

  }

});

登录后复制

定义 mutation

从原则2可以知道,Vuex state 不能直接更改,需要定义mutator函数。

现在,我们向store添加一个mutation属性,并添加一个函数属性addTodo。 所有mutator方法第一个参数。 第二个可选参数是 store,第二个是传递的数据。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

// 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的名称,其次是我们要传递的对象,是一个新的待办事项(由idtask值组成)。

1

2

3

4

5

6

7

8

9

// src/components/TodoNew.vue

methods: {

  addTodo: function() {

    const { id, task } = this;

    this.$store.commit("addTodo", { id, task });

    this.id++;

    this.task = "";

  }

}

登录后复制

回顾

到目前为止:

  • 用户将待办事项通过输入框输入,并绑定到 task 变量。

  • 提交表单后,将调用addTodo方法

  • 创建一个待办事项对象并将其“提交”到store中。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

// 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 文件。

1

touch src/components/TodoList.vue

登录后复制

内容如下:

1

2

3

4

5

6

7

8

9

10

11

// src/components/TodoList.vue

<template>

<ul>

  <li

    v-for="todo in todos"

    :key="todo.id"

  >

    {{ todo.description }}

  </li>

</ul>

</template>

登录后复制

todos是一个计算属性,我们在其中返回Vuex store 的内容。

1

2

3

4

5

6

7

8

9

10

11

// src/components/TodoList.vue

 

<script>

export default {

  computed: {

    todos() {

      //

    }

  }

};

</script>

登录后复制

定义 getters

与直接访问store 内容不同,getter是类似于存储的计算属性的函数。在将数据返回到应用程序之前,这些工具非常适合过滤或转换数据。

例如,下面有getTodos,它返回未过滤的状态。 在许多情况下,可以使用filtermap来转换此内容。

todoCount返回todo数组的长度。

通过确保组件愿意保留数据的本地副本,getter有助于实现原则1,即单一数据来源。

1

2

3

4

5

6

7

8

9

10

11

12

13

// src/store/index.js

 

export default createStore({

  ...

  getters: {

    getTodos (state) {

      return state.todos;

    },

    todoCount (state) {

      return state.todos.length;

    }

  }

})

登录后复制

返回TodoList组件,我们通过返回this.$store.getters.getTodos来完成功能。

1

2

3

4

5

6

7

8

9

10

11

// src/components/TodoList.vue

 

<script>

export default {

  computed: {

    todos() {

      return this.$store.getters.getTodos;

    }

  }

};

</script>

登录后复制

App.vue

要完成此应用程序,现在要做的就是导入并在App.vue中声明我们的组件。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

// src/App.vue

 

<template>

  <p>

    <h1>To-Do List</h1>

    <p>

      <TodoNew />

      <TodoList />

    </p>

  </p>

</template>

<script>

import TodoNew from "@/components/TodoNew.vue";

import TodoList from "@/components/TodoList.vue";

 

export default {

  components: {

    TodoNew,

    TodoList

  }

};

</script>

登录后复制

你真的需要Vuex吗?

显然,在大型应用程序中,拥有全局状态管理解决方案将有助于让我们的应用程序可预测和可维护。

但对于比较小的项目,有时候觉得使用 Vuex 太大材小用了,还这个还是大家跟着实际需求走比较合理。

Vuex的优点:

  • 易于管理全局状态
  • 强大的调试全局状态

Vuex的缺点:

  • 额外的项目依赖
  • 繁琐的模板

英文原文地址:https://vuejsdevelopers.com/2017/05/15/vue-js-what-is-vuex/

作者:Anthony Gore

转载地址:https://segmentfault.com/a/1190000039872016

更多编程相关知识,请访问:编程入门!!

以上是什么是Vuex?Vuex 4初学者指南的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

深入探讨vite是怎么解析.env文件的 深入探讨vite是怎么解析.env文件的 Jan 24, 2023 am 05:30 AM

使用vue框架开发前端项目时,我们部署的时候都会部署多套环境,往往开发、测试以及线上环境调用的接口域名都是不一样的。如何能做到区分呢?那就是使用环境变量和模式。

图文详解如何在Vue项目中集成Ace代码编辑器 图文详解如何在Vue项目中集成Ace代码编辑器 Apr 24, 2023 am 10:52 AM

Ace 是一个用 JavaScript 编写的可嵌入代码编辑器。它与 Sublime、Vim 和 TextMate 等原生编辑器的功能和性能相匹配。它可以很容易地嵌入到任何网页和 JavaScript 应用程序中。Ace 被维护为Cloud9 IDE的主要编辑器 ,并且是 Mozilla Skywriter (Bespin) 项目的继承者。

vue中组件化和模块化有什么区别 vue中组件化和模块化有什么区别 Dec 15, 2022 pm 12:54 PM

组件化和模块化的区别:模块化是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个每个功能模块的职能一致。组件化是从UI界面的角度进行规划;前端的组件化,方便UI组件的重用。

探讨如何在Vue3中编写单元测试 探讨如何在Vue3中编写单元测试 Apr 25, 2023 pm 07:41 PM

当今前端开发中,Vue.js 已经成为了一个非常流行的框架。随着 Vue.js 的不断发展,单元测试变得越来越重要。今天,我们将探讨如何在 Vue.js 3 中编写单元测试,并提供一些最佳实践和常见的问题及解决方案。

深入聊聊vue3中的reactive() 深入聊聊vue3中的reactive() Jan 06, 2023 pm 09:21 PM

前言:在vue3的开发中,reactive是提供实现响应式数据的方法。日常开发这个是使用频率很高的api。这篇文章笔者就来探索其内部运行机制。

Vue中JSX语法和模板语法的简单对比(优劣势分析) Vue中JSX语法和模板语法的简单对比(优劣势分析) Mar 23, 2023 pm 07:53 PM

在Vue.js中,开发人员可以使用两种不同的语法来创建用户界面:JSX语法和模板语法。这两种语法各有优劣,下面就来探讨一下它们的区别和优劣势。

怎么查询当前vue的版本 怎么查询当前vue的版本 Dec 19, 2022 pm 04:55 PM

查询当前vue版本的两种方法:1、在cmd控制台内,执行“npm list vue”命令查询版本,输出结果就是vue的版本号信息;2、在项目中找到并打开package.json文件,查找“dependencies”项即可看到vue的版本信息。

浅析Vue3动态组件怎么进行异常处理 浅析Vue3动态组件怎么进行异常处理 Dec 02, 2022 pm 09:11 PM

Vue3动态组件怎么进行异常处理?下面本篇文章带大家聊聊Vue3 动态组件异常处理的方法,希望对大家有所帮助!

See all articles