当前位置:   article > 正文

Vuex之store原理及使用指南_new vuex.store

new vuex.store

介绍

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

引言

Vuex的store组件,主要存储应用中的状态,具体应用中如何来用呢?存储我们也可以使用缓存比如uni.setStorageSync(...) uni.getStorageSync(),来存储应用级的状态,也可以实现相应需求。单纯缓存数据可能并不能很好满足一定的业务场景,而且缓存数据是多样化的,状态的交互在应用中存在很多,不同模块间互相通过状态调用来通信,而如果仅通过缓存值来通信,如果需求改动,可能造成比较大的修改维护量。Store组件是封装比较好的对象来管理统一状态及数据的,这样可能更优雅,容易维护一些,比如:他的state对象存放状态属性及值,用getters中定义访问属性数据的方法,mutations中定义修改属性的同步方法,actions中定义外部访问属性数据的异步方法。

使用

       我们通过如下内容,从安装、到一个实例场景的实现,使用vue框架来实现这个场景,来说明vuex的store的使用。

安装

$ npm install vuex --save

注意此处可能会报错,最好指定vuex版本,用如下命令

$ npm install vuex@3.6.2 --save

示例需求场景

应用在登录后存储状态数据:1.是否登录is_login(true已登录,false未登录);2.当前用户id curr_uid。

源码目录结构

本源码使用vue2+uview2.x ui

store组件初始化

main.js,引入store组件

  1. import App from './App'
  2. import store from "./store";
  3. ...
  4. const app = new Vue({
  5. store,
  6. ...App
  7. })
  8. app.$mount()
  9. ...

App.vue,状态缓存处理,避免刷新时状态被清空

  1. export default {
  2. ...
  3. created(){
  4. //在页面刷新时将vuex里的信息保存到localStorage里 https://blog.csdn.net/XinYe666666/article/details/102939381
  5. window.addEventListener("beforeunload",()=>{
  6. localStorage.setItem("messageStore",JSON.stringify(this.$store.state))
  7. })
  8. //在页面加载时读取localStorage里的状态信息
  9. localStorage.getItem("messageStore") && this.$store.replaceState(Object.assign(this.$store.state,JSON.parse(localStorage.getItem("messageStore"))));
  10. },
  11. ...

store,存储状态的组件文件,加入模块化

index.js,存储组件的入口文件,加载状态组件、模块化

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. import user from './modules/user'
  4. Vue.use(Vuex)
  5. const store = new Vuex.Store({
  6. modules: {
  7. user
  8. },
  9. });

 user.js 模块状态组件

  1. import { getToken,removeToken } from '@/common/auth.js';
  2. const state={ //要设置的全局访问的state对象
  3. is_login: false,
  4. curr_uid:0
  5. //要设置的初始属性值
  6. };
  7. const getters = { //实时监听state值的变化(最新状态)
  8. isLogin(state) { //承载变化的showFooter的值
  9. return state.is_login
  10. },
  11. getCurrUid(state){ //承载变化的curr_uid的值
  12. return state.curr_uid
  13. }
  14. };
  15. const mutations = {
  16. setLogin(state) { //自定义改变state初始值的方法,这里面的参数除了state之外还可以再传额外的参数(变量或对象);
  17. state.is_login = true;
  18. },
  19. setLogout(state) { //同上
  20. state.is_login = false;
  21. removeToken();
  22. },
  23. setCurrUid(state,uid){ //同上,这里面的参数除了state之外还传了需要增加的值sum
  24. state.curr_uid=uid;
  25. }
  26. };
  27. const actions = {
  28. setLogin(context) { //自定义触发mutations里函数的方法,context与store 实例具有相同方法和属性
  29. context.commit('setLogin');
  30. },
  31. setLogout(context) { //同上注释
  32. context.commit('setLogout');
  33. },
  34. setCurrUid(context,uid){ //同上注释,uid为要变化的形参
  35. context.commit('setCurrUid',uid)
  36. }
  37. };
  38. export default {
  39. namespaced: true, //用于在全局引用此文里的方法时标识这一个的文件名
  40. state,
  41. getters,
  42. mutations,
  43. actions
  44. }

这里引入了token缓存的清除处理功能是额外的,先看基本功能实现了登录状态的设置读写,当前uid设置读写,公开的读写的相应调用方法。

login.vue  ,我们在登录页面调用生成状态数据的写入

  1. import { setToken } from 'common/auth.js';
  2. import { mapActions} from 'vuex';
  3. export default {
  4. ....
  5. methods: {
  6. ...mapActions('user', ['setLogin','setCurrUid']),
  7. submit() {
  8. const _self = this;
  9. ...
  10. postLogin({ username:v_username,password:v_password }).then(res => {
  11. if(res.code==0){
  12. uni.$u.toast('登录成功');
  13. _self.$store.dispatch("user/setLogin");
  14. _self.$store.dispatch("user/setCurrUid",res.data.uid);
  15. ...

这里我们把关键调用代码写出,这里是调用状态模块user的写入方法进行登录状态、用户uid的写入。

user.vue 我们这里读取登录状态,用户uid信息

  1. import { mapGetters} from 'vuex';
  2. export default {
  3. ...
  4. computed:{
  5. ...mapGetters('user',{ //用mapGetters来获取user.js里面的getters
  6. isLogin:'isLogin', currUid:'getCurrUid'
  7. })
  8. },
  9. onLoad() {
  10. this.initData();
  11. },
  12. methods: {
  13. initData() {
  14. console.log("initData.store=",this.$store);
  15. console.log('init.isLogin=',this.isLogin);
  16. console.log('init.currUid=',this.currUid);
  17. ...

这里我们通过vue的computed方法注入从store组件的mapGetters设置的状态数据。后续代码就可以从这里读取状态数据了。

我们打印store对象结构,帮助理解store对象的存储结构

 我们看到store对象的存储结构,就是一个对象,封装的属性方法,和我们定义的js文件中某些方法、属性相对应。我们按照它的语法结构来访问就可以了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/280216
推荐阅读
相关标签
  

闽ICP备14008679号