文章目录
- 编辑
Actions:词义是 动作行为
Mutations:词义是加工、维护
State:词义是 状态和数据
Dispatch:词义是派遣、发出
Commit:提交
Render: 渲染
Mutate:转变
从这些单词中,大体上可以概括整个图的流程。
VC派发(Dispatch)消息到Actions,Actions提交(Commit)到Mutation,Mutation转变(Mutate)state,然后重新渲染整个页面。
- 注意:vue3只能用vuex4版本,vue2只能用vuex3版本。2022年2月7日之后,vue3成了默认版本,vuex4相应的也成了默认版本。所以对于vue2,要注明vuex的版本 @3 编辑 在package.json里看到vuex就说明安装成功了 编辑
- 首先需要创建一个Store。 在Src中,创建一个名为store的文件夹,里面包含一个index.js的文件 编辑 由上面那个原理图可以看出来,store里面至少包含Actions,Mutations,State。 如下图 (创建Store实例,需要用到Vuex.Store所以需要引用Vuex) Vue.use(Vuex)的作用就是让vue承认store这个属性,否则初始化Vc的时候,vue不会解析store这个属性 编辑 main.js配置如下 其中store相当于store:store。根据ES6语法规则,如果key和value一样,可以简写成key的形式 import Vue from 'vue'import App from './App.vue'Vue.config.productionTip = falseimport store from './store'new Vue({ render: h => h(App), store}).$mount('#app') 这样Vuex的架子就搭好了,实战演练一下,并借此机会深入的介绍一下Vuex里面的属性。
- 流程讲解:点击button按钮,触发点击事件,派发消息去Actions里面找addSum,并且携带参数1。在Actions里面,接受参数,向Mutation提交,携带参数1。Mutation里改变state里的sum的值,vue检测到sum改变,重新渲染整个页面。
效果图:
编辑
- <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>
- 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})
- 设置四个参数,并打印一下。 编辑 编辑 结果只输出了两个参数,第一个参数是一个对象,里面包含了commit,dispatch等属性,第二个参数就是要携带的值; 其中第二个参数叫做value,第一个参数通常叫做Context,里面最常用的是Commit。如果只想获得Commit也可以写成这种形式 编辑
- 编辑 编辑 同样Mutations里面也是只有两个参数,其中第一个是state(看到了sum),第二个就是携带的、值。Mutations最大的作用就是可以改变state的值。
- 答:确实是这样子。如果参数确定的话,可以跳过Actions,直接commit到Mutations里面。但是如果参数不确定的话,比如我需要向服务器要数据,这时候就必须用到Actions发送Ajax。
- 如果多个组件都用到一个对state里数据处理过的值,比如求和案例中sum的20倍。通过getters仅处理一次,就可以让多个组件同时使用。
- 编辑 现在我们有多个数据,怎么样在任意组件里面访问的到呢?为了表现出组件之间的通信。新建一个组件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>
- 编辑 效果都是可以的 编辑 mapGetters同理,就不赘述了
- 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 = falseimport store from './store'new Vue({ render: h => h(App), store}).$mount('#app') import Vuex from 'vuex'const state = { };const mutations={ };const actions={ };const getters = { }export default new Vuex.Store({ state, mutations, actions, getters}) 编辑
- 【报错】 编辑 语法校验不过关,在vue.config.js加上这句lintOnSave:false(关闭语法校验) 编辑

编辑
Actions:词义是 动作行为
Mutations:词义是加工、维护
State:词义是 状态和数据
Dispatch:词义是派遣、发出
Commit:提交
Render: 渲染
Mutate:转变
从这些单词中,大体上可以概括整个图的流程。
VC派发(Dispatch)消息到Actions,Actions提交(Commit)到Mutation,Mutation转变(Mutate)state,然后重新渲染整个页面。
注意:vue3只能用vuex4版本,vue2只能用vuex3版本。2022年2月7日之后,vue3成了默认版本,vuex4相应的也成了默认版本。所以对于vue2,要注明vuex的版本 @3

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

编辑
首先需要创建一个Store。
在Src中,创建一个名为store的文件夹,里面包含一个index.js的文件

编辑
由上面那个原理图可以看出来,store里面至少包含Actions,Mutations,State。
如下图
(创建Store实例,需要用到Vuex.Store所以需要引用Vuex)
Vue.use(Vuex)的作用就是让vue承认store这个属性,否则初始化Vc的时候,vue不会解析store这个属性

编辑
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')

这样Vuex的架子就搭好了,实战演练一下,并借此机会深入的介绍一下Vuex里面的属性。
流程讲解:点击button按钮,触发点击事件,派发消息去Actions里面找addSum,并且携带参数1。在Actions里面,接受参数,向Mutation提交,携带参数1。Mutation里改变state里的sum的值,vue检测到sum改变,重新渲染整个页面。
效果图:

编辑
<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>
<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>

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
})
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
})

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

编辑

编辑
结果只输出了两个参数,第一个参数是一个对象,里面包含了commit,dispatch等属性,第二个参数就是要携带的值;
其中第二个参数叫做value,第一个参数通常叫做Context,里面最常用的是Commit。如果只想获得Commit也可以写成这种形式

编辑

编辑

编辑
同样Mutations里面也是只有两个参数,其中第一个是state(看到了sum),第二个就是携带的、值。Mutations最大的作用就是可以改变state的值。
答:确实是这样子。如果参数确定的话,可以跳过Actions,直接commit到Mutations里面。但是如果参数不确定的话,比如我需要向服务器要数据,这时候就必须用到Actions发送Ajax。
如果多个组件都用到一个对state里数据处理过的值,比如求和案例中sum的20倍。通过getters仅处理一次,就可以让多个组件同时使用。
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
})
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
})


编辑

编辑
现在我们有多个数据,怎么样在任意组件里面访问的到呢?为了表现出组件之间的通信。新建一个组件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>


编辑

编辑

编辑

编辑
为什么报错呢?
输出一下mapState()来看看。

编辑

编辑
效果都是可以的

编辑
mapGetters同理,就不赘述了
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')

import Vuex from 'vuex'
const state = {
};
const mutations={
};
const actions={
};
const getters = {
}
export default new Vuex.Store({
state,
mutations,
actions,
getters
})


编辑
【报错】

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

编辑