Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

vuex

作者头像
epoos
发布于 2022-06-06 07:47:37
发布于 2022-06-06 07:47:37
1.1K00
代码可运行
举报
文章被收录于专栏:epoos.comepoos.com
运行总次数:0
代码可运行

Vuex是一个专门为Vue.js应用程序开发的状态管理模式。 它采用集中式存储管理应用的所有组件状态,并以相应的规则保证状态以一种可预测的方式发生变化。

状态管理包含以下几部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.state 驱动应用的数据源
2.view 以声明方式将state映射到视图
3.action 相应在 view 上的用户输入导致的状态变化

这三个状态之间互相交互,就形成了vue的单向数据流

但是这个单项数据流模式是很容易被破坏的。 如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.多个视图依赖于同一状态。
2.来自不同视图的行为需要变更同一状态。

对于第一种状态,可以通过传参的形式解决,但是对于兄弟节点之间的状态传递就很麻烦了。 第二种状态,我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。

这些做法都有其局限性,那么有什么办法能解决这些问题呢?

这就是vuex被设计出来的原因了。它的出现就是为了解决这些问题。

核心概念

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
state:vuex使用单一状态树,一个对象包含了全部应用层级的状态,是唯一数据源。

由于vuex的状态是存储是响应式的,从store实例中读取状态,最简单的方法就是在计算属性中返回某个状态。

除此之外,vue 还通过store选项,提供了一种机制,将状态从根组件 注入到每一个子组件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

import Vue from 'vue'
import Vuex from 'vuex'
import * as actions from './actions'
import * as getters from './getters'
import state from './state'
import mutations from './mutations'

Vue.use(Vuex)

const debug = process.env.NODE_ENV !== 'production'

let store = new Vuex.Store({
  actions,
  getters,
  state,
  mutations,
})


const app = new Vue({
  el: '#app',
  store, // 把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件
  components: { Counter },
  template: `
    <div class="app">
      <counter></counter>
    </div>
  `
})

通过在根实例中注册store选项,该store实例会注入到根组件下所有子组件中 子组件能通过 this.$store 访问到。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getter: 通过getter获取属性,可以在获取state的时候对属性进行过滤或者计算。

getter的返回值跟计算属性一样,会被缓存,只有当依赖属性变化的时候才会重新计算,可以看做是store的计算属性。 getter可以返回一个函数,来实现给getter传参。 当getter返回的是一个函数的时候,通过方法访问的时候,每次都会去进行调用,不会缓存结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mutation:更改vuex中store状态的唯一方法就是提交mutation

vuex中的mutation类似于事件 每个mutation都有一个字符串 事件类型(type)和一个回调函数(handler) 这个回调函数就是我们实际进行状态更改的地方,它接受一个state作为第一个参数。

定义一个mutation

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state, n) {
      // 变更状态
      state.count++
    }
  }
})

调用一个mutation

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 字符串的方式调用
store.commit('increment', n)

// 对象的方式调用cc
store.commit({
  type: 'increment',
  amount: 10
  ... // 更多字段
})

第二个参数‘n’叫做载荷,通常情况n是一个对象,这样方便传更多的参数。

特别注意:mutation必须是同步函数。 那么如果是异步请求怎么办呢?

此时,就需要用到另一个核心概念Action了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
action:action和mutation类型,区别在于,action是提交一个mutation而直接变更状态。

action可以包含任意异步操作。

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象作为参数。 context可以有commit、state、getters、 因此,可以直接通过参数调用commit触发mutation。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 定义一个action
actions: {
  incrementAsync ({ commit }) {
    setTimeout(() => {
      commit('increment')
    }, 1000)
  }
}

// 调用一个action action也支持荷载,支持对象和字符串的方式传参
// 以载荷形式分发
store.dispatch('incrementAsync', {
  amount: 10
})

// 以对象形式分发
store.dispatch({
  type: 'incrementAsync',
  amount: 10
})

store.dispatch可以处理被触发action的处理函数返回的Promise,并且 store.dispatch仍旧返回Promise

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 定义异步的action
actions: {
  actionA ({ commit }) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        commit('someMutation')
        resolve()
      }, 1000)
    })
  }
}

// dispatch一个promise
store.dispatch('actionA').then(() => {
  // ...
})
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module:将store分割成模块,每个模块拥有自己的state、mutation、action、getter、嵌套子模块等。这个模块就是module

如果store非常大的时候,非常不好管理,这时候就可以将其分割为小的module了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态

对于模块内部的 mutation 和 getter,接收的第一个参数是模块的局部状态对象。 对于模块内部的 action,局部状态通过 context.state 暴露出来,根节点状态则为 context.rootState 对于模块内部的 getter,根节点状态会作为第三个参数暴露出来

模块命名空间

默认情况下,模块内部的 action、mutation 和 getter 是注册在全局命名空间的——这样使得多个模块能够对同一 mutation 或 action 作出响应。 如果希望你的模块具有更高的封装度和复用性,你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const store = new Vuex.Store({
  modules: {
    account: {
      namespaced: true, // 待命名空间的模块,(命名空间控制属性会继承)
    }
  }
})

相关链接

[vuex]https://vuex.vuejs.org/zh/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
10.Vuex组件中的mapState、mapGetters、mapMutations、mapActions等辅助函数
可以将所有的Mutation事件,写入到一个单独的文件中,然后通过常量来替代,可以方便开发者对项目中所有Mutation
全栈程序员站长
2022/09/01
1.3K0
了解Vuex状态管理模式的理解强化指南
Vuex是什么呢?它是Vue的状态管理模式,在使用vue的时候,需要在vue中各个组件之间传递值是很痛苦的,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被改变,所有引用该值的地方就会自动更新。是不是很方便,很好用呢?
桃翁
2019/11/22
1.2K0
​轻松掌握vuex,让你对状态管理有一个更深的理解
Vuex 是一个专为 Vue.js 应用程序开发的 状态管理模式 。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化
前端老鸟
2019/07/29
3.4K0
Vuex的简单入门
在src目录下新建个store文件夹,里面新建index.js 在index.js文件夹中创建Vuex实例
明知山
2020/09/03
3120
vuex学习笔记
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
前端迷
2018/10/22
7440
vuex学习笔记
第十三章:vuex状态(数据)管理
概念:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,可以用于组件之间的通信。
张哥编程
2024/12/13
1900
Vuex详细介绍
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。这是官网的说法,其实很简单:就是一个加强版的data! 在单页应用中会有一个data函数,里面就存放了当前页面的一些数据。比如:
从入门到进错门
2019/06/11
1K0
Vuex的五个核心属性
Vue有五个核心概念,state, getters, mutations, actions, modules。本文将对这个五个核心概念进行梳理。
不愿意做鱼的小鲸鱼
2022/09/24
5230
vuex的五大核心_vue如何实现跨域
Vuex有5个核心概念,分别是State,Getters,mutations,Actions,Modules。
全栈程序员站长
2022/09/19
1.6K0
Vuex精简文档
Vuex 通过 store 选项,提供了一种机制将状态从根组件“注入”到每一个子组件中(需调用 Vue.use(Vuex)):
神葳
2021/01/22
8940
Vuex中的核心方法
Vuex是一个专为Vue.js应用程序开发的状态管理模式,其采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。每一个Vuex应用的核心就是store仓库,store基本上就是一个容器,它包含着你的应用中大部分的状态state。
WindRunnerMax
2020/11/30
2K0
Vue状态管理模式:Vuex入门教程
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
德顺
2020/11/12
1.8K0
Vue状态管理模式:Vuex入门教程
vuex 使用文档
安装 直接下载CDN 引用   <script src="/path/to/vue.js"></script>   <script src="/path/to/vuex.js"></script> npm   npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.use() 来安装Vuex。   import Vue from 'vue'   import Vuex from 'vuex'   Vue.use(Vuex)   Vuex 是一个专为Vue.js 应
用户1197315
2018/01/22
1.7K0
Vue项目搭建与开发(四): Vuex使用
从中我们可以关注到,这应该是一个关于状态管理的工具,简单的理解就是我们的数据状态该怎么变化,如何控制,可以通过Vuex来控制。
玖柒的小窝
2021/11/08
5430
Vue项目搭建与开发(四): Vuex使用
一文让你彻底搞懂 vuex,满满的干货
简单地讲:可以把多个组件都需要的变量全部存储到一个对象里面,然后这个对象放在顶层的 vue 实例中,让其他组件可以使用。这样多个组件就可以共享这个对象中的所有属性。
呆呆
2021/12/01
8980
vuex知识笔记,及与localStorage和sessionStorage的区别
  首先,Vuex是什么,官网介绍说Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。我的理解就是Vuex就是类似于sessionStorage这样管理数据(本地存和取)的一种技术方案。
tandaxia
2020/02/25
2.6K0
vuex知识笔记,及与localStorage和sessionStorage的区别
Vuex基本使用的总结
在 Vue 的单页面应用中使用,需要使用Vue.use(Vuex)调用插件。 使用非常简单,只需要将其注入到Vue根实例中。
用户1065635
2019/03/21
7480
vuex
问题1:通过路由传递参数,我们会采用params或者query形式,但这两种方式都会在URL上做手脚,如果传递的参数过多,会导致400 Bad Request(如,点击表格某行,携带行数据跳转到新页面进行查看)。 问题2:兄弟组件传值 问题3:多处地方使用同一数据,为节省重复请求(最为常见)
奋飛
2019/08/14
3.1K0
Vue中的Vuex详解
        C.存储在vuex中的数据是响应式的,当数据发生改变时,页面中的数据也会同步更新
陶然同学
2023/02/27
1.4K0
Vue中的Vuex详解
Vuex
当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键:
小小杰啊
2022/12/21
1.2K0
相关推荐
10.Vuex组件中的mapState、mapGetters、mapMutations、mapActions等辅助函数
更多 >
LV.1
某大厂前端开发工程师
加入讨论
的问答专区 >
1技术专家擅长2个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    本文部分代码块支持一键运行,欢迎体验
    本文部分代码块支持一键运行,欢迎体验