vuex中store存储store.commit和store.dispatch的区别及说明

目录
  • store存储store.commit和store.dispatch区别
    • 主要区别
  • vuex store原理及使用指南
    • 使用
    • 安装
    • 示例需求场景
    • 源码目录结构
    • store组件初始化

store存储store.commit和store.dispatch区别

代码示例:

this.$store.commit('loginStatus', 1);
this.$store.dispatch('isLogin', true);

规范的使用方式:

// 以载荷形式
store.commit('increment',{
  amount: 10   //这是额外的参数
})
// 或者使用对象风格的提交方式
store.commit({
  type: 'increment',
  amount: 10   //这是额外的参数
})

主要区别

dispatch:含有异步操作,数据提交至 actions ,可用于向后台提交数据

写法示例: this.$store.dispatch('isLogin', true);

commit:同步操作,数据提交至 mutations ,可用于登录成功后读取用户信息写到缓存里

写法示例: this.$store.commit('loginStatus', 1);

两者都可以以载荷形式或者对象风格的方式进行提交

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组件

import App from './App'
import store from "./store";
...

const app = new Vue({
	store,
    ...App
})
app.$mount()
...

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

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

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

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

import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'

Vue.use(Vuex)

const store = new Vuex.Store({
   modules: {
     user
   },
});

user.js 模块状态组件

import { getToken,removeToken } from '@/common/auth.js';
const state={   //要设置的全局访问的state对象
     is_login: false,
     curr_uid:0
     //要设置的初始属性值
   };
const getters = {   //实时监听state值的变化(最新状态)
    isLogin(state) {  //承载变化的showFooter的值
       return state.is_login
    },
    getCurrUid(state){  //承载变化的curr_uid的值
       return state.curr_uid
    }
};
const mutations = {
    setLogin(state) {   //自定义改变state初始值的方法,这里面的参数除了state之外还可以再传额外的参数(变量或对象);
        state.is_login = true;
    },
    setLogout(state) {  //同上
        state.is_login = false;
		removeToken();
    },
    setCurrUid(state,uid){ //同上,这里面的参数除了state之外还传了需要增加的值sum
       state.curr_uid=uid;
    }
};
 const actions = {
    setLogin(context) {  //自定义触发mutations里函数的方法,context与store 实例具有相同方法和属性
        context.commit('setLogin');
    },
    setLogout(context) {  //同上注释
        context.commit('setLogout');
    },
    setCurrUid(context,uid){   //同上注释,uid为要变化的形参
        context.commit('setCurrUid',uid)
     }
};
export default {
    namespaced: true, //用于在全局引用此文里的方法时标识这一个的文件名
    state,
    getters,
    mutations,
    actions
}

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

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

import { setToken } from 'common/auth.js';
import { mapActions} from 'vuex';
export default {
....
methods: {
		...mapActions('user', ['setLogin','setCurrUid']),
		submit() {
			const _self = this;
...
            postLogin({ username:v_username,password:v_password }).then(res => {
                if(res.code==0){
					uni.$u.toast('登录成功');
                    _self.$store.dispatch("user/setLogin");
					_self.$store.dispatch("user/setCurrUid",res.data.uid);
...

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

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

import { mapGetters} from 'vuex';

export default {
...
    computed:{
		...mapGetters('user',{ //用mapGetters来获取user.js里面的getters
			isLogin:'isLogin',  currUid:'getCurrUid'
		})
	},	

    onLoad() {
		this.initData();
	},
	methods: {
		initData() {
            console.log("initData.store=",this.$store);
            console.log('init.isLogin=',this.isLogin);
			console.log('init.currUid=',this.currUid);
...
 

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

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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vuex store 缓存存储原理分析

    目录 vuex store 缓存存储原理 如何使用store缓存数据 1 src/store/index.js 写方法 2 src/store/getter.js 3 使用 store 存取数据 vuex store 缓存存储原理 vuex 的设计是将数据存在一个对象树的变量中,我们的应用(vue应用)从这个变量中取数据,然后供应用使用,当将当前页面关闭, vuex 中的变量会随着消失,重新打开页面的时候,需要重新生成. 而,浏览器缓存(cookie,localstorage等)是将数据存到浏览

  • vue项目退出登录清除store数据的三种方法

    目录 方法一:(不友好,页面会白屏,不推荐使用) 方法二 : (不会出现白屏,推荐使用) 方法三 : vuex清除token (不会出现白屏,推荐使用) 总结 方法一:(不友好,页面会白屏,不推荐使用) 在退出登录的loginOut 方法里面: window.location.reload() 方法二 : (不会出现白屏,推荐使用) 利用v-if控制router-view,在根组件APP.vue中实现一个刷新方法 <template> <router-view v-if="is

  • vue如何利用store实现两个平行组件间的传值

    目录 store实现两个平行组件间的传值 方法:利用store.js传值 平行组件传值的步骤 1.布好局 2.在ccc模板中用mounted函数接收 完整代码如下 store实现两个平行组件间的传值 需求:把Login.vue的username传到Index.vue中显示出来 方法:利用store.js传值 Login.vue 登录后跳转 store.js 定义变量并从Login.vue中获取值 Index.vue 定义变量,利用computed获取变量的值 平行组件传值的步骤 1.布好局 然后

  • vuex中store的action和mutations用法

    目录 action和mutations (this.$store.dispatch和this.$store.commit)区别 用法 dispatch: 含有异步操作 commit:同步操作 实例 action和mutation分别用来处理什么? action和mutations (this.$store.dispatch和this.$store.commit)区别 都是调用vuex中的方法.一个异步一个同步 dispatch:含有异步操作,例如向后台提交数据,写法: this.$store.d

  • C++中静态存储区与栈以及堆的区别详解

    学习c++如果不了解内存分配是一件非常可悲的事情.而且,可以这样讲,一个C++程序员无法掌握内存.无法了解内存,是不能够成为一个合格的C++程序员的.一.内存基本构成可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同.静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量.栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算

  • vuex中的state属性解析

    目录 state属性介绍 state的使用 扩展 vuex的State 单一状态树 在Vue组件中获得 Vuex 状态 mapState辅助函数 state属性介绍 state属性是Vuex中用于存放组件之间共享的数据:也就是说,我们把一些组件之间共享的状态主要存放在state属性中:它采用的是单一状态树——用一个对象就包含了全部的应用层级状态.这也意味着,每个应用将仅仅包含一个 store 实例.单一状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态的快

  • vuex中store存储store.commit和store.dispatch的用法

    代码示例: this.$store.commit('loginStatus', 1); this.$store.dispatch('isLogin', true); 规范的使用方式: // 以载荷形式 store.commit('increment',{ amount: 10 //这是额外的参数 }) // 或者使用对象风格的提交方式 store.commit({ type: 'increment', amount: 10 //这是额外的参数 }) 主要区别: dispatch:含有异步操作,数

  • vuex中store存储store.commit和store.dispatch的区别及说明

    目录 store存储store.commit和store.dispatch区别 主要区别 vuex store原理及使用指南 使用 安装 示例需求场景 源码目录结构 store组件初始化 store存储store.commit和store.dispatch区别 代码示例: this.$store.commit('loginStatus', 1); this.$store.dispatch('isLogin', true); 规范的使用方式: // 以载荷形式 store.commit('incr

  • Vuex中this.$store.commit()和this.$store.dispatch()区别说明

    目录 this.$store.commit()和this.$store.dispatch()的区别 commit: 同步操作 dispatch: 异步操作 其他了解 Vuex应用实例this.$store.commit()触发 新建文件夹store,store下 头部公共组件components文件夹下 this.$store.commit()和this.$store.dispatch()的区别 两个方法其实很相似,关键在于一个是同步,一个是异步 commit: 同步操作 this.$store

  • vuex中this.$store.commit和this.$store.dispatch的基本用法实例

    目录 前言 区别 实战 总结 前言 this. s t o r e . d i s p a t c h ( ) 与 t h i s . store.dispatch() 与 this. store.dispatch()与this.store.commit()方法的区别总的来说他们只是存取方式的不同,两个方法都是传值给vuex的mutation改变state 区别 this.$store.commit() 同步操作 this.$store.commit('方法名',值)[存储] this.$sto

  • vuex中store.commit和store.dispatch的区别及使用方法

    目录 store.commit和store.dispatch的区别及使用 规范的使用方式 主要区别 this.$store.dispatch() 与 this.$store.commit() 总结 store.commit和store.dispatch的区别及使用 代码示例: this.$store.commit('loginStatus', 1); this.$store.dispatch('isLogin', true); 规范的使用方式 // 以载荷形式 store.commit('inc

  • 对vuex中store和$store的区别说明

    这里写自定义目录标题 <router-link to="/login">{{ $store.state.userName }}</router-link> <router-link to="/login">{{ store.state.userName }}</router-link> <router-link to="/login">{{ this.store.state.userNa

  • Vue Element前端应用开发之Vuex中的API Store View的使用

    概述 在我们开发Vue应用的时候,很多时候需要记录一些变量的内容,这些可以用来做界面状态的承载,也可以作为页面间交换数据的处理,处理这些内容可以归为Vuex的状态控制.例如我们往往前端需要访问后端数据,一般是通过封装的Web API调用获取数据,而使用Store模式来处理相关的数据或者状态的变化,而视图View主要就是界面的展示处理.本篇随笔主要介绍如何整合这三者之间的关系,实现数据的获取.处理.展示等逻辑操作. Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管

随机推荐