- vuex4是vue3的兼容版本;关注兼容性,提供和vuex3相同的api,可以在vue3中复用之前的代码
中文文档 https://next.vuex.vuejs.org/zh/index.html
初始化vuex
为了向vue3初始化方式看齐,vuex4初始化的方式醉了相应的变化:使用新的createStore函数创建新的实例
- store/index.js
import { createStore } from 'vuex'export default createStore({state: {},mutations: {},actions: {},modules: {}})
- main.js全局注册
import { createApp} from 'vue'import App from './App.vue'import store from './store'const app = createApp(App);app.use(store);
vuex中的数据响应式变化
vuex3的传统写法数据是响应式变化的
<template><div><div >{{$store.state.count}}</div><button @click="$store.commit('add')" style="margin-left: 15px">+</button></div></template>
…toRefs方式保留state数据响应式
- let state = store.state;
- return {…toRefs(state)} 在dom中直接写在state中声明的字段即可
{{count}}等同于store.state.count{{username}}等同于store.state.username
<template><div><div >{{count}}</div><button @click="add" style="margin-left: 15px">+</button><button @click="handleupdateCount('100')" style="margin-left: 15px">更改值为100</button></div></template>
<script>import { toRefs} from 'vue'import { useStore } from 'vuex'export default {//返回store的实例 响应式数据只有statevar store = useStore();let state = store.state;//这种写法动态更改的时候数据丢失响应式特性// let count = store.state.count return countreturn{...toRefs(state),}}</script>
computed方式保留state数据响应式
<template><div><div >{{count}}</div></div></template>
<script>import { computed } from 'vue'import { useStore } from 'vuex'export default {//返回store的实例 响应式数据只有statevar store = useStore();let count = computed(() => {return store.state.count})return{count}}</script>
通过commit或者dispath进行数据更改
<template><div><div style="display: flex;justify-content: center"><!-- 传统写法 --><div >{{$store.state.count}}</div><button @click="$store.commit('add')" style="margin-left: 15px">+</button><!-- composition写法 --><div >{{count}}</div><button @click="add" style="margin-left: 15px">+</button><button @click="handleupdateCount('100')" style="margin-left: 15px">更改值为100</button></div></div></template><script>import { toRefs ,computed} from 'vue'import { useStore } from 'vuex'export default {name: "18.vuex4",setup(){//返回store的实例 响应式数据只有statevar store = useStore();let state = store.state;const add = (newVal) => {// 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation// 使用 store.commit 访问 mutation , 来改变state// 在 Vuex 中,mutation 都是同步事务// 通过 store.commit('mutation名称', 参数)store.commit('add', newVal)}// 定义函数const handleupdateCount = (newVal) => {// Action 提交的是 mutation,而不是直接变更状态。// Action 可以包含任意异步操作。// 通过 store.dispatch('action名称') 使用store.dispatch('updateCount', newVal)}return{...toRefs(state),add,handleupdateCount}}}</script>
- store.js
import { createStore } from 'vuex'export default createStore({state(){return{count:1,aa:2}},mutations:{add(state){state.count++;},update(state,newVal){state.count = newVal;}},actions:{updateCount({commit}, newVal){commit('update', newVal)}}})
vuex 模块化 跟veux3写法一样
<template><div><div >{{count}}</div></div></template><script>import { toRefs ,computed} from 'vue'import { useStore } from 'vuex'export default {setup(){//返回store的实例 响应式数据只有statevar store = useStore();let state = store.state.user;return{...toRefs(state),}}}</script>
- modules/user.js
let user = {state(){return{count:1,aa:2}},mutations:{},actions:{}}export default user;
import { createStore } from 'vuex'import user from './modules/user'export default createStore({modules: {user},})
