Vue中的状态管理器 - Vuex

时间:2022-12-30 15:50:25

我们知道vue是组件式开发的,当你的项目越来越大后,每个组件背后的数据也会变得越来越难以理顺,

这个时候你就可以考虑使用vuex了。

备注: 官方建议小项目不要使用,引入vuex会带来新的概念和模式,这对于新手而言理解上本身有难度,而且小项目中vuex发挥的功效确实不怎么明显,

反而增加了开发难度,就像后端项目中常说的 过度设计。

说了这么多,下面介入正题(以下讲解需要一个空的vue项目,推荐使用 vue-cli 创建,快速搭建一个vue开发环境 ):

vuex的作用就是作为一个数据仓库(store),把多个组件的背后的数据都放到store中,然后所有组件通过约定的方式去读取数据和修改数据。

这一句话就概括完了。没有想象的那么复杂。注意,这句话里面一个关键词叫 约定,下面来说说有那些约定:

在将约定之前,首先还是要知道怎么定义一个仓库(store),进入项目然后  vue add vuex 。

通过这条命令,vue-cli 帮我们创建了一个 store.js 的文件,并自动在根组件中引入了store,具体变化如下:

main.js 文件中自动变化了两处

import Vue from 'vue'
import App from './App.vue'
import store from './store' #【引入store文件】 Vue.config.productionTip = false new Vue({
store, #【在根组件中引入了store】
render: h => h(App)
}).$mount('#app')

现在我们编辑一下 store.js 文件:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
user: {
name: '张三', sex: '男'
}
},
mutations: {
change_name (state,payload) {
state.user.name = payload.new_name
},
change_sex (state,payload) {
state.user.sex = payload.new_sex
}
},
actions: {
change_sex_by_action (context,payload) {
setTimeout(() => {
context.commit('change_sex',payload)
},3000)
}
}
})

理解:

  state 是状态(数据中心)。

  mutations 里面定义的函数用来修改state,mutation只能执行同步操作。

  actions 的目的也是更改state,但是他不像mutation一样可以直接更改state,而是通过调用mutation来更改state。还有一个不同点是,action可以执行异步操作,比如网络请求。

  getters 返回组装DIY后的数据,比如state有个sex=“女”,通过getter在后面加一个 生 ,返回 女生,但是我觉得把组件中 computed 干的事情放到store层不是一个好主意,所以本例中不涉及。

用法:

  mutation的一个参数是 state,第二个参数是从 组件传过来的参数对象,

  action的第一个参数是一个与 store 实例具有相同方法和属性的 context 对象,这句话有点难以理解,你就把context想象成一个新的store对象,

  第二个参数还是 组件传过来的参数对象

在编辑一下 App.vue 文件

<template>
<div id="app">
<button @click="change_name">change name by mutation</button>
<p>current name({{ user.name }})</p>
<button @click="change_sex">change sex by action</button>
<p>current sex({{ user.sex }})</p>
</div>
</template>
<script>
export default {
data () {
return {
// user: this.$store.state.user
}
},
computed: {
user() {
return this.$store.state.user
}
},
methods: {
change_name() {
this.$store.commit({
type: 'change_name',
new_name: '李四'
})
},
change_sex() {
this.$store.dispatch({
type: 'change_sex_by_action',
new_sex: '女'
})
}
}
}
</script>

通过store获取数据都要放到computed里面,虽然在其他地方也可以直接获取,但是无法监听数据变动(就像上面注释的一样)。

change_name是通过mutation方式同步更改store中的数据,change_sex采用了action方式异步更改store中的数据。

如果在computed中需要获取的数据很多,可以使用 官方提供的 mapState,具体用法查看官方 文档 。

我自己的理解:

不要滥用store,不要把所有的数据都放到store中,在组件化开发思想下,我认为组件和组件之间本就应该独立封装,

如果一个数据只有在某个组件中使用,而不需要被其他组件共享,那么最好不要放到其中,store只存储有必要的数据,不要让他变得太臃肿,否则麻烦迟早会来。

官方文档中说明,如果store太大可以采用模块方式分割,但貌似不太优雅,

最后我还是推荐store只放必要的东西,不要让他变得太肥胖。

Vue中的状态管理器 - Vuex的更多相关文章

  1. vue - 状态管理器 Vuex

    状态管理 vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性.

  2. Vuex内容解析和vue cli项目中使用状态管理模式Vuex

    中文文档:vuex官方中文网站 一.vuex里面都有些什么内容? const store = new Vuex.Store({ state: { name: 'weish', age: }, gett ...

  3. 【Vue】Vue学习&lpar;四&rpar;-状态管理中心Vuex的简单使用

    一.vuex的简介 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.Vuex背后的基本思想,就是前面所说的单向数据流.图4就是Vuex实现单向数据流的示意图.    Store     ...

  4. 对于React各种状态管理器的解读

    首先我们要先知道什么是状态管理器,这玩意是干啥的? 当我们在多个页面中使用到了相同的属性时就可以用到状态管理器,将这些状态存到外部的一个单独的文件中,不管在什么时候想使用都可以很方便的获取. reac ...

  5. vue状态管理器&lpar;用户登录简单应用&rpar;

    技术点:通过vue状态管理器,对已经登录的用户显示不同的页面: 一  vue之状态管理器应用 主要用来存储cookie信息 与vue-cookies一起使用 安装:npm install vue-co ...

  6. VueX状态管理器 的应用

    VueX状态管理器 cnpm i vuex axios -S 1 创建Vuex 仓库 import Vue from 'vue' import Vuex from 'vuex' vue.use(Vue ...

  7. Vue状态管理模式---Vuex

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

  8. JAVA中GridBagLayout布局管理器应用详解

    很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够 ...

  9. &lpar;转&rpar;Python中的上下文管理器和Tornado对其的巧妙应用

    原文:https://www.binss.me/blog/the-context-manager-of-python-and-the-applications-in-tornado/ 上下文是什么? ...

随机推荐

  1. &lbrack;Js&rsqb;高级运动

    一.链式运动框架 1.他需要一个回调函数,在运动停止时,开始下一次运动(执行函数) 多物体运动框架改为如下: function startMove(obj,attr,iTarget,fn){ ... ...

  2. Chrome下的语音控制框架MyVoix&period;js使用篇(一)

    日前因工作需求,着手研究了语音识别技术,发现github上有网友发布了一款叫做voix.js的javascript框架.在拜读voix.js的源码后发现了不少问题,于是自己写了一款语音识别框架MyVo ...

  3. NSLog用法,打印日志

    要输出的格式化占位:   %@ 对象 %d, %i 整数 %u   无符整形 %f 浮点/双字 %x, %X 二进制整数 %o 八进制整数 %zu size_t %p 指针 %e   浮点/双字 (科 ...

  4. 一步一步学习SignalR进行实时通信&lowbar;5&lowbar;Hub

    原文:一步一步学习SignalR进行实时通信_5_Hub 一步一步学习SignalR进行实时通信\_5_Hub SignalR 一步一步学习SignalR进行实时通信_5_Hub 前言 Hub命名规则 ...

  5. Maven Install指令构建时出现找不到符号

    检查引用的JRE编译的版本,可能由于JRE编译版本太低导致的  

  6. &star; &lbrack;HDU4825&rsqb; Xor Sum「最大异或和&lpar;Trie树&rpar;」

    传送门:>Here< 题意:给出一个集合,包含N个数,每次询问给出一个数x,问x与集合中的一个数y异或得到最大值时,y是多少? 解题思路 由于N,M非常大,暴力显然不行.抓住重点是异或,所 ...

  7. day6作业--选课系统

    角色:学校.学员.课程.讲师 要求: 1.创建北京.上海2所学校: 2.创建Linux,Python,go 3个课程,Linux\python在北京开,go在上海开: 3.课程包含,周期.价格,通过学 ...

  8. WPF 平板上按钮点击不触发,鼠标点击触发的两种解决方法

    今天运行在windows平板上的程序,有个功能是弹出子窗体,点弹出窗体的关闭按钮,要点好几次才能触发.网上找了找,也有人与我类似的情形. 解决方法如下: public static void Disa ...

  9. CopyOnWriteArrayList介绍

    CopyOnWrite容器即写时复制的容器.通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后, ...

  10. Lintcode---统计比给定整数小的数的个数

    给定一个整数数组 (下标由 0 到 n-1,其中 n 表示数组的规模,数值范围由 0 到 10000),以及一个 查询列表.对于每一个查询,将会给你一个整数,请你返回该数组中小于给定整数的元素的数量. ...