vue/vuex的一些小干货(做项目必备)

Posted gcjun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue/vuex的一些小干货(做项目必备)相关的知识,希望对你有一定的参考价值。

1、vue双向数据绑定vuex中的state,官方推荐最好每次都要actions->mutations来修改state,而不能直接修改state,以便于调试.

虽然可以直接在页面用mutations($store.commit)来解决,但个人建议还是通过actions再走mutations好点,因为这样业务流程统一,团队协作就非常的方便。不会出现有些地方用actions,有些地方是直接mutations,最少保证了后面的人员接手维护时不会懵逼。

技术图片

// 推荐方式
computed: { // 在从组件的computed中
    user: {
        get() {
          return this.$store.state.user
        },
        set(v) {
          // 使用vuex中的actions中定义好的方法来改变
          this.$store.dispatch(‘changeUser‘, v)
          // 使用vuex中的mutations中定义好的方法来改变  可用,但不推荐 
          //this.$store.commit(‘USER‘, v)   
        }
    }
}
// 在组件中就可以使用
<input v-modle="user" />

// 强烈不推荐方式
<input v-modle="$store.state.user" />

 

2、vue 修改数组数据页面渲染问题

/*
 * Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新
 *这些方法如下:
 *push()
 *pop()
 *shift()
 *unshift()
 *splice()
 *sort()
 *reverse()
*/
data: {
    arr:[‘a‘,‘b‘,‘c‘]
}
methods: {
    changeArr: function (){
        // 这个的方式无法更新页面数据
        // this.arr[1]=‘e‘

        //这样的方式可以更新页面数据
        this.arr.splice(1,1,‘e‘)
    }
}

 3、Vuex中一个子模块的actions调用另一个模块的actions、mutations、state,下面的例子就是在auth.js中的actions里调用自身的action/mutations,和调用system.js里的action/mutations/state(ps:里面的变量意义不是重点,这只是一个试例)

store.js

import Vue from ‘vue‘
import Vuex from ‘vuex‘
import auth from ‘./modules/auth‘
import system from ‘./modules/system‘
Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    auth,
    system,
  }
})
system.js
const CHANGEUNAME = ‘CHANGEUNAME‘

let state = {
    Uname: ‘‘,
}

let mutations = {
    [CHANGEUNAME](state, data) {
        state.Uname = data
    },
}
let actions = {
    changeUName: (context, data) => {
        context.commit(CHANGEUNAME, data)
    },
}
let getters = {

}

export default {
    namespaced: true,
    state,
    mutations,
    actions,
    getters
}
auth.js
const LOGIN = ‘LOGIN‘ 
const CHANGEUSERNAME = ‘CHANGEUSERNAME‘ 
const CHANGEPASSWORD = ‘CHANGEPASSWORD‘ 

let state = {
    userData :"",
    username: "",
    password: "",
}

let mutations = {
    [LOGIN](state, data) {
        console.log(‘触发LOGIN‘)
        state.userData = data
    },
    [CHANGEUSERNAME](state, data) {
        state.username = data
    },
    [CHANGEPASSWORD](state, data) {
        state.password = data
    },
}

let actions = {
    changeUserName: (context, data) => {
        //获取 system.js的 state Uname
        let Uname = context.rootState.system.Uname
        //调用system.js的 actions -> changeUName
        /*第一个参数是其他模块的 actions 路径, 
         * 第二个是传给 actions 的数据, 如果不需要传数据, 也必须预留为{},
         * 第三个参数是配置选项, 申明这个 acitons 不是当前模块的
         */ 
        context.dispatch(‘system/changeUName‘, {}, { root: true })
        
        //调用system.js的 mutations -> CHANGEUNAME
        context.commit(‘system/CHANGEUNAME‘, {},{root:true})

        //调用自身的cations  ->changePassword
        context.dispatch(‘changePassword‘,data)
        //调用自身的mutations->CHANGEUSERNAME
        context.commit(‘CHANGEUSERNAME‘,data)
    },
    changePassword: (context, data) => {
        context.commit(CHANGEPASSWORD, data)
    },
}

let getters = {}

export default {
    namespaced: true,
    mutations,
    state,
    actions,
    getters
}        

 4、页面刷新store数据丢失解决方案。在app.vue文件里添加

created() {
    //在页面加载时读取sessionStorage里的状态信息
    if (sessionStorage.getItem("store")) {
      this.$store.replaceState(
        Object.assign(
          {},
          this.$store.state,
          JSON.parse(sessionStorage.getItem("store"))
        )
      );
    }
    //在页面刷新时将vuex里的信息保存到sessionStorage里
    window.addEventListener("beforeunload", () => {
        sessionStorage.setItem("store", JSON.stringify(this.$store.state));
    });
  }

这样可以在页面刷新时保存store的数据,但在vuex 的cations中拿当前的文件的state数据时就有点小问题,拿上面的 auth.js 作个例子

//... 原代码
let actions={
    //... 原代码
    login: (context) => {
        //原获取 state.username 方法已经失效,
        //let username=state.username

        //解决方案为由context中拿数据
        let username=context.rootState.auth.username
    }
}

 

 

以上是关于vue/vuex的一些小干货(做项目必备)的主要内容,如果未能解决你的问题,请参考以下文章

vuejs学习——vue+vuex+vue-router项目搭建

初学vue,vue2.0+vue-router+vuex的小项目

?? 基于 vue2 + vuex + vue-router 构建的移动端微应用

干货-测试工程师必备武器

vue项目中遇到的那些事。

Vue-Router + Vuex 实现单页面应用