一、 简介
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库(全局管理,相当于一个全局变量,所有页面共享)。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
二、使用介绍
模块可能会有很多个,公用的一套state、getters、mutations、actions,若想封装更强单独使用,需要加上namespaced:true
注意:namespaced:true, 使用模块中的mutations、getters、actions时候,要加上模块名(uInfo注册时的模块名)
》》 调用方法的时候:store.commit("uInfo/方法名",data.userLoginInfo)
》》获取属性的时候:store.state.uInfo.属性名
1 、Vuex使用样例包含 state、getters、mutations、actions使用
-
第一步:引入 在main.js 中--生成项目是已经做好
javascript//vuex import store from './store' createApp(App).use(store)
-
第二步:在store文件夹下的index.js中
Promise介绍javascriptimport { createStore } from 'vuex' export default createStore({ //全局状态初始值 state: { count:1 }, //计算state,获取对应的值 getters: { countStatus(state){ return state.count <= 1 } }, //更新状态的方法--更新state的唯一方法,commit mutations mutations: { setCount(state,num){ state.count=num; } }, //可以异步操作,可以返回promise,更改数据还是传递到 mutations 去更改 actions: { setCountPromise(context,num){//包含store的上下文对象 //Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。 //Promise就是能把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。 //resolve执行成功时的回调;reject执行失败时的回调 return new Promise((resolve, reject) => { if(num >100){ reject("不能大于100") }else{ context.commit("setCount",num) resolve() } }) } }, //数据较多时,分模块 modules: { } })
-
第三步:vue页面代码
html<template> <p>{{num}}</p> <el-button type="primary" @click="handle">提交</el-button> </template> <script> import {reactive,toRefs} from "vue" import { useStore} from "vuex" export default { name:"user", setup(){ const store =useStore() const count = store.state.count const data = reactive({ num:count, }) console.log("修改前的getters",store.getters.countStatus) const handle=()=>{ //测试mutations中的setCount //store.commit("setCount",100) //测试actions中的setCountPromise--异步 store.dispatch("setCountPromise",100).then(res=>{ alert("修改成功") }).catch(err=>{ alert(err) }); console.log(store.state.count) console.log("修改后的getters",store.getters.countStatus) } return{ ...toRefs(data), handle } } } </script>
2、modules分模块
-
第一步:在store文件夹下,建立sate,里面包含多个js文件,一个js代表一个模块
例子:num.state.js,多了namespaced,缺少modules,其他的state、getters、mutations、actions和index中的一样
jsexport default { //防止模块名字相同 namespaced:true, //全局状态初始值 state: { count:1 }, //计算state,获取对应的值 getters: { countStatus(state){ return state.count <= 1 } }, //更新状态的方法--更新state的唯一方法,commit mutations mutations: { setCount(state,num){ state.count=num; } }, //可以异步操作,可以返回promise,更改数据还是传递到 mutations 去更改 actions: { setCountPromise(context,num){//包含store的上下文对象 //Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。 //Promise就是能把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。 //resolve执行成功时的回调;reject执行失败时的回调 return new Promise((resolve, reject) => { if(num >100){ reject("不能大于100") }else{ context.commit("setCount",num) resolve() } }) } } }
-
第二步:将index.js中的state、getters、mutations、actions代码删除,需要引入注册mutations
jsimport { createStore } from 'vuex' //引入state模块 import number from "../store/state/num.state.js" export default createStore({ //数据较多时,分模块 modules: { number//注册state模块 } })
-
第三步:vue页面需要相应的更改
html<template> <div>用户列表aaa</div> <p>{{num}}</p> <el-button type="primary" @click="handle">提交</el-button> </template> <script> import {reactive,toRefs} from "vue" import { useStore} from "vuex" export default { name:"user", setup(){ const store =useStore() const count = store.state.number.count const data = reactive({ num:count, }) //store.getters.countStatus改成现在这样否则会报语法错误 console.log("修改前的getters",store.getters["number/countStatus"]) const handle=()=>{//调用mutations中的setCount方法 //store.commit("number/setCount",100) store.dispatch("number/setCountPromise",100).then(res=>{ alert("修改成功") }).catch(err=>{ alert(err) }); console.log(store.state.number.count) console.log("修改后的getters",store.getters["number/countStatus"]) } return{ ...toRefs(data), handle } } } </script>
三、核心概念
1、state
每一个 Vuex 应用的核心就是 store(仓库)。"store"基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同:
- Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
- 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit)
mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。