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

本篇文章带大家了解一下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”。 组件必须从该位置读取应用程序数据,并且不能保留其自己的副本以防止冲突或分歧。

import { createStore } from "vuex";// Instantiate our Vuex storeconst store = createStore({  // "State" 组件的应用程序数据    state () {    return {      myValue: 0    };  }});// 组件从其计算的属性访问 state const MyComponent = {     template: "
{{ myValue }}
",  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/happ…

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

vue create vuex-example

登录后复制

安装 Vuex

cd vuex-examplenpm i -S vuex@4npm run serve

登录后复制

创建一个 Vuex store

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

mkdir src/storetouch src/store/index.js

登录后复制

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

// src/store/index.jsimport { createStore } from "vuex";export default createStore({});

登录后复制

将 store  添加到 Vue 实例

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

// src/main.jsimport { 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 文件:

rm src/components/HelloWorld.vue

登录后复制

TodoNew.vue

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

touch src/components/TodoNew.vue

登录后复制

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

// src/components/TodoNew.vue        

登录后复制

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

// src/components/TodoNew.vue...export default {  data() {    return {      task: "",      id: 0    };  },  methods: {    addTodo: function() {      //    }  }};

登录后复制

定义 store 状态

过会,我们会创建一个显示待办事项的组件。 由于它和TodoNew组件都需要访问相同的数据,因此这是我们在 Vuex 存储中保存的全局state 的理想选择。

现在,回到state并定义属性状态。 这里使用 Vux4 提供的 createStore 函数,该函数返回一个对象。 该对象具有一个属性 todos,它是一个空数组。

// src/store/index.jsimport { createStore } from "vuex";export default createStore({  state () {    return {      todos: []    }  }});

登录后复制

定义 mutation

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

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

// src/store/index.jsimport { 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.vuemethods: {  addTodo: function() {    const { id, task } = this;    this.$store.commit("addTodo", { id, task });    this.id++;    this.task = "";  }}

登录后复制

回顾

到目前为止:

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

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

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

// src/components/TodoNew.vue        export default {  data() {    return {      task: "",      id: 0    };  },  methods: {    addTodo: function() {      const { id, task } = this;      this.$store.commit("addTodo", { id, task });      this.id++;      this.task = "";    }  }};

登录后复制

读取 store 数据

现在,我们已经创建了用于添加待办事项的功能。 接下来,就是把它们显示出来。

创建一个新组件TodoList.vue 文件。

touch src/components/TodoList.vue

登录后复制

内容如下:

// src/components/TodoList.vue
      
  •     {{ todo.description }}  

登录后复制

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

// src/components/TodoList.vueexport default {  computed: {    todos() {      //     }  }};

登录后复制

定义 getters

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

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

todoCount返回todo数组的长度。

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

// src/store/index.jsexport default createStore({  ...  getters: {    getTodos (state) {      return state.todos;    },    todoCount (state) {      return state.todos.length;    }  }})

登录后复制

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

// src/components/TodoList.vueexport default {  computed: {    todos() {      return this.$store.getters.getTodos;    }  }};

登录后复制

App.vue

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

// src/App.vue  

    

To-Do List

    

                

  import TodoNew from "@/components/TodoNew.vue";import TodoList from "@/components/TodoList.vue";export default { components: { TodoNew, TodoList }};

登录后复制

你真的需要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初学者指南的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3020189.html

(0)
上一篇 2025年3月13日 05:35:06
下一篇 2025年3月9日 01:06:27

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Vue如何进行事件处理?相关基础知识介绍

    本篇文章给大家介绍一下vue事件处理的基础知识。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 Vue事件处理是每个Vue项目的必要方面。 它用于捕获用户输入,共享数据以及许多其他创造性方式。【相关推荐:《vue.js教程…

    2025年3月13日
    200
  • 深入了解vue.js的3种安装方法

    本篇文章给大家介绍一下三种 Vue.js 的安装方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架。vue.js 的目…

    2025年3月13日 编程技术
    200
  • 深入浅析vue3中的custom renderer特性

    本篇文章带大家一起来了解一下vue3的新特性custom renderer。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 【相关推荐:《vue.js教程》】 默认的目标渲染平台 在vue3中允许用户自定义目标渲染平台,以…

    2025年3月13日 编程技术
    200
  • Vue如何封装Echarts图表

    在开始之前,我们先按照正常的组件注册流程,在项目components目录中新建一个名为radar-chart的组件,然后在一个demo页面引入该组件使用。 新建的 radar-chart 组件内容: // radar-chart.vue (…

    2025年3月13日
    200
  • 浅谈Vue中v-for,key取值影响过渡效果和动画效果(代码详解)

    之前的文章《教你怎么使用Vue实现动画效果(附代码)》中,给大家介绍了怎么使用Vue实现动画效果。下面本篇文章给大家了解一下浅谈Vue中key取值影响过渡效果和动画效果,有需要的朋友可以参考一下,希望对你们有帮助。 关于Vue.js的v-f…

    2025年3月13日
    200
  • 浅析Vue中入口缓存的问题(代码分享)

    之前的文章《你值得了解的HTTP缓存机制(代码详解)》中,给大家了解了HTTP缓存机制。下面本篇文章给大家了解Vue中入口缓存的问题,伙伴们来看看吧。 关于web的缓存策略,推荐这篇文章:Http缓存机制 在开发时候经常遇到一个问题,我们根…

    2025年3月13日
    200
  • 怎么看vuejs是否安装成功

    看vuejs是否安装成功的方法:1、使用组合键“windows+R”打开“运行”窗口,输入“cmd”,点击“确定”;2、在打开的cmd命令窗口中,执行命令“vue -V”,如果输出版本号则表示vuejs安装成功,反之则安装不成功。 本教程操…

    2025年3月13日
    200
  • vuejs怎么关闭弹窗

    vuejs关闭弹窗的方法:1、创建html代码结构;2、判断所点击的区域是否在“.mask_popup”中;3、通过“hideMaskPopup(e){…}”关闭弹窗即可。 本文操作环境:windows7系统、vue2.5.17…

    2025年3月13日
    200
  • vuejs是国产框架吗

    vuejs算是国产框架,因为vuejs框架的作者是拥有中国国籍的尤雨溪,该作者属于独立开源开发者,目前全职开发和维护Vue.js,所以说vuejs是国产框架。 本文操作环境:windows7系统、vue2.5.17版,DELL G3电脑。 …

    2025年3月13日
    200
  • vuejs的生命周期是什么

    vuejs的生命周期是指vue实例对象从创建之初到销毁的过程,vue所有功能的实现都是围绕其生命周期进行的,在生命周期的不同阶段调用对应的钩子函数可以实现组件数据管理和DOM渲染两大重要功能。 本教程操作环境:windows7系统、vue2…

    2025年3月13日 编程技术
    200

发表回复

登录后才能评论