一、首先明白vuex是什么,简单来说:
1、vuex用来创建一个全局唯一的仓库store,来管理全局通用数据。 2、一处修改,全局改变
二、store中的几个基本概念
1、state : 定义全局数据, 例如用户信息 2、getters : 相当于计算属性 3、mutations : 用来同步修改state中的数据,只允许写同步代码,不推荐写异步代码 4、actions : 异步的修改数据,主要是通过commit 触发mutation 5、modules : 用来管理各个子模块
三、传统方式使用vuex
举个例子,在state中定义一个用户姓名name, 我们要做的是在页面中使用和修改name.以此为目的我们展开来说:
首先store中定义好name:
export default createStore({
state: {
name: 'mily'
}
})
在页面中我们可以直接通过$store.state.name 获取, 也可以通过计算属性computed ,比如
// home.vue
<template>
<div class="home">
<h1 @click="handleClick">点击修改名字:{{myName}}</h1>
</div>
</template>
<script>
export default {
name: 'HomeView',
computed: {
myName() {
return this.$store.state.name
}
}
}
</script>
如果我们需要对name作出修改,可以通过dispatch 或者commit ,这里有两种情况: 1、 如果需要异步修改,需要通过store的dispatch 派发一个action来修改; 2、 如果同步修改,可以直接commit 一个mutation方法。
打个比方,这里我们使用异步修改的方式: 1-1、首先我们在页面定一个methods, 定义handleClick方法来修改,
methods: {
handleClick() {
this.$store.dispatch('changeName', 'song')
}
}
1-2、其次,我们也需要在store 的action 中定一个changeName 的方法, 然后通过commit 触发一个mutation; 第一个参数为store, 第二个参数为传递过来的参数
changeName(store, params) {
setTimeout(() => {
store.commit('CHANGE', params)
}, 1000);
}
1-3、最后,我们在mutations 中定义一个CHANGE 方法, 第一个参数为state,第二个为传递过来的参数;
mutations: {
CHANGE(state, str) {
state.name = str;
}
}
四、compositon-api中如何使用vuex
<template>
<div class="about">
<h1>
This is an about page
<p @click="handleClick">{{name}}</p>
</h1>
</div>
</template>
<script>
import { useStore } from 'vuex';
import { toRefs } from 'vue';
export default {
setup() {
const store = useStore();
const { name } = toRefs(store.state);
function handleClick() {
store.dispatch('changeName', 'hello mily')
}
return {
name,
handleClick
}
}
}
</script>
小结:
- 组件中dispatch派发actions中的同名事件
- 异步:通过actinos的方法提交commit, 触发mutation事件;
同步:可以直接提交commit触发mutation - 在mutation中修改state中的数据, 一个地方改变 其他地方也会改变
|