首页 > 其他分享 >【Vue】Vuex详解

【Vue】Vuex详解

时间:2022-10-30 17:00:13浏览次数:64  
标签:Vue sum Actions state 详解 Vuex store


 【前言】本博客系统的讲诉了Vuex的安装、搭建。以及Actions、Mutations、State、Getters的使用,为什么使用mapState、mapGetters以及一些细节的解释


Vuex原理讲解 

【Vue】Vuex详解_Vuex

【Vue】Vuex详解_Vue_02编辑

Actions:词义是 动作行为

Mutations:词义是加工、维护

State:词义是 状态和数据

Dispatch:词义是派遣、发出

Commit:提交

Render: 渲染

Mutate:转变

从这些单词中,大体上可以概括整个图的流程。

VC派发(Dispatch)消息到Actions,Actions提交(Commit)到Mutation,Mutation转变(Mutate)state,然后重新渲染整个页面。

1、安装vuex组件

注意:vue3只能用vuex4版本,vue2只能用vuex3版本。2022年2月7日之后,vue3成了默认版本,vuex4相应的也成了默认版本。所以对于vue2,要注明vuex的版本 @3

【Vue】Vuex详解_Vuex_03

【Vue】Vuex详解_Vuex_04编辑

在package.json里看到vuex就说明安装成功了

【Vue】Vuex详解_Vuex_05

【Vue】Vuex详解_Vuex_06编辑

2、使用Vuex

首先需要创建一个Store。

在Src中,创建一个名为store的文件夹,里面包含一个index.js的文件

【Vue】Vuex详解_Vuex_07

【Vue】Vuex详解_Vuex_08编辑

 由上面那个原理图可以看出来,store里面至少包含Actions,Mutations,State。

如下图

(创建Store实例,需要用到Vuex.Store所以需要引用Vuex)

Vue.use(Vuex)的作用就是让vue承认store这个属性,否则初始化Vc的时候,vue不会解析store这个属性

【Vue】Vuex详解_Vuex_09

【Vue】Vuex详解_Vuex_10编辑

main.js配置如下

 其中store相当于store:store。根据ES6语法规则,如果key和value一样,可以简写成key的形式

import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
import store from './store'
new Vue({
render: h => h(App),
store
}).$mount('#app')

【Vue】Vuex详解_Vuex_11


这样Vuex的架子就搭好了,实战演练一下,并借此机会深入的介绍一下Vuex里面的属性。


【求和案例】

流程讲解:点击button按钮,触发点击事件,派发消息去Actions里面找addSum,并且携带参数1。在Actions里面,接受参数,向Mutation提交,携带参数1。Mutation里改变state里的sum的值,vue检测到sum改变,重新渲染整个页面。

效果图:

【Vue】Vuex详解_Vue_12

【Vue】Vuex详解_Vuex_13编辑

Coute.vue

<template>
<div>
<h1>当前的值是:{{sum}}</h1>
<button @click="addSum">点我加1</button>
<button>点我减1</button>
</div>
</template>

<script>
export default {
name:"Coute",
methods:{
addSum()
{
this.$store.dispatch('addSum',1);
}
},
computed:{
sum()
{
return this.$store.state.sum;
}
}
}
</script>

<style>
button{
margin-right: 2px;
}
</style>

【Vue】Vuex详解_Vuex_14

store.js

import Vuex from 'vuex'
import Vue from 'vue'
Vue.use(Vuex)
const state = {
sum:1
};
const mutations={
ADDSUM(state,value)
{
state.sum+=value;
}
};
const actions={
addSum(context,value)
{
context.commit('ADDSUM',value);
}
};
export default new Vuex.Store({
state,
mutations,
actions
})

【Vue】Vuex详解_Vue_15

详细看一下Action和Mutations里面的可以携带参数

Actions

设置四个参数,并打印一下。

【Vue】Vuex详解_Vue_16

【Vue】Vuex详解_Vue_17​编辑

【Vue】Vuex详解_Vue_18

【Vue】Vuex详解_Vue_19编辑

结果只输出了两个参数,第一个参数是一个对象,里面包含了commit,dispatch等属性,第二个参数就是要携带的值

其中第二个参数叫做value,第一个参数通常叫做Context,里面最常用的是Commit。如果只想获得Commit也可以写成这种形式

【Vue】Vuex详解_Vuex_20

【Vue】Vuex详解_Vue_21编辑

 Mutations

【Vue】Vuex详解_Vue_22

【Vue】Vuex详解_Vuex_23编辑

【Vue】Vuex详解_Vuex_24

【Vue】Vuex详解_Vue_25编辑

同样Mutations里面也是只有两个参数,其中第一个是state(看到了sum),第二个就是携带的、Mutations最大的作用就是可以改变state的值。 


疑问:为什么需要一个Actions,求和案例之中,我把参数传给Actions,Actions原封不动的又传给了Mutations,为什么我不直接传给Mutations呢?

答:确实是这样子。如果参数确定的话,可以跳过Actions,直接commit到Mutations里面。但是如果参数不确定的话,比如我需要向服务器要数据,这时候就必须用到Actions发送Ajax。


getters的使用:

如果多个组件都用到一个对state里数据处理过的值,比如求和案例中sum的20倍。通过getters仅处理一次,就可以让多个组件同时使用。

store

import Vuex from 'vuex'
import Vue from 'vue'
Vue.use(Vuex)
const state = {
sum:1
};
const mutations={
ADDSUM(state,value)
{
state.sum+=value
}
};
const actions={
addSum({commit},value)
{
commit('ADDSUM',value)
}
};
const getters = {
bigSum(state)
{
return state.sum*20
}
}
export default new Vuex.Store({
state,
mutations,
actions,
getters
})

【Vue】Vuex详解_Vue_26

【Vue】Vuex详解_Vuex_27

【Vue】Vuex详解_Vue_28编辑



Store仓库数据的使用:

【Vue】Vuex详解_Vue_29

【Vue】Vuex详解_Vuex_30编辑

现在我们有多个数据,怎么样在任意组件里面访问的到呢?为了表现出组件之间的通信。新建一个组件Information

答案就是在Computed里面获得

<template>
<div>
<h1>姓名:{{name}}</h1>
<h1>学校:{{school}}</h1>
<h1>爵位:{{Marquis}}</h1>
</div>
</template>

<script>
export default {
name:'Information',
computed:{
school()
{
return this.$store.state.school;
},
sum()
{
return this.$store.state.sum;
},
name()
{
return this.$store.state.name;
},
Marquis()
{
return this.$store.state.Marquis;
}
}
}
</script>

<style>

</style>

【Vue】Vuex详解_Vue_31

效果图

【Vue】Vuex详解_Vuex_32

【Vue】Vuex详解_Vuex_33编辑


GetState 的引入

【Vue】Vuex详解_Vuex_34

【Vue】Vuex详解_Vue_35编辑

由上图所示,这样一个一个的写,虽然可以写出来,但是实在是太麻烦了。干的都是一样的工作。所以Vue给我们提供了一个方法。mapState和mapGetters。这两个一个是简化State里的属性,一个是简化getters里面的属性。


第一种方法可以简写成下面这种形式。(对象写法。函数的名字可以随意)

【Vue】Vuex详解_Vue_36

【Vue】Vuex详解_Vuex_37编辑

 为什么要用...mapState。

原因:mapState报错

【Vue】Vuex详解_Vue_38

【Vue】Vuex详解_Vue_39编辑

 为什么报错呢?

输出一下mapState()来看看。

【Vue】Vuex详解_Vue_40

【Vue】Vuex详解_Vuex_41编辑

 mapState里面是一个对象。computed本身也是一个对象。{}里面再加一个{},是肯定会报错的。

那为什么用...呢,ES6用法中,一个对象t1,一个对象t2,t1{...t2}就相当于,把t2中的属性全拿出来一个个放到t1里面。


第二种方法:数组方法(state里面的属性是什么就必须写什么)

【Vue】Vuex详解_Vue_42

【Vue】Vuex详解_Vue_43编辑

 效果都是可以的

【Vue】Vuex详解_Vuex_44

【Vue】Vuex详解_Vuex_45编辑

mapGetters同理,就不赘述了 


【错误示范--使用Vuex时】

Vue.use(Vuex)在main.js里面使用

main.js

import Vue from 'vue'
import App from './App.vue'
import Vuex from 'vuex'
Vue.use(Vuex)
Vue.config.productionTip = false
import store from './store'
new Vue({
render: h => h(App),
store
}).$mount('#app')

【Vue】Vuex详解_Vue_46

import Vuex from 'vuex'

const state = {

};
const mutations={

};
const actions={

};
const getters = {

}
export default new Vuex.Store({
state,
mutations,
actions,
getters
})

【Vue】Vuex详解_Vue_47

【Vue】Vuex详解_Vuex_48

【Vue】Vuex详解_Vue_49编辑

你发现报了一个这样的错误(Vue.use(Vuex)应该在创建store之前执行),然后仔细检查了一遍,确认Vue.use(Vuex)写在了引入store之前。为什么还报错呢?这里我想说的就是Vue在解析代码的时候,会按顺序首先执行所有的import的语句,所以Vue.use(Vuex)只能写在store里面

【报错】

【Vue】Vuex详解_Vuex_50

【Vue】Vuex详解_Vuex_51编辑

 语法校验不过关,在vue.config.js加上这句lintOnSave:false(关闭语法校验)

【Vue】Vuex详解_Vue_52

【Vue】Vuex详解_Vuex_53编辑



标签:Vue,sum,Actions,state,详解,Vuex,store
From: https://blog.51cto.com/u_15807146/5807544

相关文章

  • vue-cil搭建vue
    搭建vue-cil脚手架需要node.js环境去官网下载node.js  win系统cmdnode-v查看当前版本npminstallcnpm-g或者npminstall--registry=https://registry.npm.taoba......
  • 类变量(类对象变量)和实例对象变量详解
    类变量总结:第一:作为类对象的变量每次创建一个新的实例对象时,类对象变量就多一个引用指向它通过实例对象来修改类对象变量的取值,实际上是让实例对象的data指向了另外......
  • vue echarts graph 关系图
    最近项目需要,用到了echart的grpah关系图,研究了下,大概就画个简单的吧html:<divid="app"><divid="main"class="echarts":style="{......
  • Matlab的regionprops详解
    招募大量matlab技术人员,有大量matlab需求订单,均为个人短期可以完成,有时间的朋友可以加我微信  :Ahxyz6666 matlab函数_连通区域1、matlab函数bwareaopen──删除小面......
  • vue学习笔记
    今日内容概要计算属性监听属性组件介绍和定义父子通信之父传子父子通信之子传父ref属性动态组件插槽vue-cli今日内容详细计算属性我们可以通过计算属性c......
  • vue3路由的使用
    一、路由的概要1.1、什么是路由?路由就是一组映射关系,根据不同的url地址展示不同的内容或页面(key-value);key为路径,value可能是function或component 路......
  • 【博学谷学习记录】超强总结,用心分享|Python容器详解
    一、Python中容器的介绍容器:也可以称为是数据序列,或者高级数据类型,也是Python中的数据类型。容器中可以存放多个数据。Python中常用的容器有4种:list(列表)、......
  • np.clip()的用法和python,numpy中np.random.choice()的用法详解
    np.clip()的用法 numpy.clip(a,a_min,a_max,out=None)Clip(limit)thevaluesinanarray.Givenaninterval,valuesoutsidetheintervalareclippedtoth......
  • equals和hashCode详解
    equals和hashCode详解http://www.cnblogs.com/Qian123/p/5703507.html阅读目录equals()方法详解hashcode()方法详解Hashset、Hashmap、Hashtable与hashcode()和equa......
  • Vue学习-04
    一、计算属性如果是{{}},每次页面刷新,函数都会重新执行写在computed的函数——当属性来使用,缓存通过计算属性实现名字首字母大写第一种:函数简单写法<!--大段的代码写在......