vuex的使用封裝

前言

相信做前端的同學,肯定是避免不了使用vue的,在vue項目中,總會有各種傳值,稍稍復雜一點的用單純的父子傳值可以說是相當麻煩,這個時候,我們就會想到vuex,vuex幫我們做到了各個組件傳值,實現數據共享,隨用隨取,博主也是剛入行前端不久,把自己用過的東西記錄下來,希望對大家有所幫助,針對于vuex有一定基礎的童鞋

環(huán)境和簡介

利用webpack安裝vue的手腳架,并安裝vuex插件

vuex的作用是將所有項目中需要用到的變量存在一個倉庫里面,可以對其中的數據進行讀取修改等操作,實現全局響應式改變

vuex 結構

state: 簡稱 倉庫 存放所有變量
mutations: 存放同步讀取违帆、修改state的的方法
action: 存放異步讀取溉知、修改state的的方法
getter: 是store的計算屬性,

編寫store文件

話不多說,直接上代碼,在這里,我是將vuex進一步進行了封裝,使得開發(fā)時更方便,

在src 下面直接創(chuàng)建store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
export default new Vuex.Store({
  state: {
    userInfo: {}, //用戶信息
    otherInfo: {}, //其他信息
  },


  getters: {
    getUserInfo(state) {
      //獲取用戶信息
      return state.userInfo;
    },
    getOtherInfo(state) {
      //獲取其他信息
      return state.otherInfo;
    },
  },


  mutations: {
    setUserInfo(state, value) { //設置用戶信息
      for (let key in value) {
        Vue.set(state.userInfo, key, value[key]);
      }
      let time = new Date();
      Vue.set(state.userInfo, "lastTime", {
        date: time.toLocaleString(),
        second: time.getTime()
      });
    },
    deleteUserInfo(state, value) {
      Vue.delete(state.userInfo, value.key);
    },
    setOtherInfo(state, value) { //設置其他信息
      for (let key in value) {
        Vue.set(state.otherInfo, key, value[key]);
      }
      let time = new Date();
      Vue.set(state.otherInfo, "lastTime", {
        date: time.toLocaleString(),
        second: time.getTime()
      });
    },
    deleteOtherInfo(state, value) {
      Vue.delete(state.otherInfo, value.key);
    },
    clearVuex(state) {
      state.userInfo = {};
      state.otherInfo = {};
    }
  },


  actions: {
    upVuex(context, data) { //自定義觸發(fā)mutations里函數的方法礁阁,context與store 實例具有相同方法和屬性
      context.commit(data.mutations, data.value);
    }
  }
})

上述是所有的代碼,
第一步引入vue vuex并注冊
在這里面,我將所有的信息分為兩大部分,一部分是用戶信息,我是把登陸信息存到這里面,一部分是其他信息,大家可以靈活使用
對應的mutations里面有對這兩個對象設置和刪除信息的方法,以及記錄下了每此更新的時間

項目中使用

在src下面新建myminxin.js文件,對vue 混入不了解的童鞋,請戳https://cn.vuejs.org/v2/guide/mixins.html

let m = {
    computed : {
        userInfo () {
            return this.$store.getters.getUserInfo;
        } ,
        otherInfo () {
            return this.$store.getters.getOtherInfo;
        } ,
    } ,
    watch : {
  
    } ,
    methods : {
        deleteOtherInfo ( k ) {
            //刪除其他的信息
            this.$store.dispatch ( "upVuex" , {
                mutations : "deleteOtherInfo" ,
                value : {
                    key : k
                }
            } );
        } ,
        setOtherInfo ( v ) {
            //設置其他的信息
            this.$store.dispatch ( "upVuex" , {
                mutations : "setOtherInfo" ,
                value : v
            } );
        } ,
        deleteUserInfo ( k ) {
            //刪除用戶的信息
            this.$store.dispatch ( "upVuex" , {
                mutations : "deleteUserInfo" ,
                value : {
                    key : k
                }
            } );
        } ,
        setUserInfo ( v ) {
            //設置用戶的信息
            this.$store.dispatch ( "upVuex" , {
                mutations : "setUserInfo" ,
                value : v
            } );
        } ,
    }
};
export default m;

myminxin也需要在項目中引入,可以全局在main.js中引入,也可以按需導入,導入之后,我們就不需要在每個.vue文件中單獨引入vuex

使用方法:

let obj = {name:'張三'}
//存數據
this.setUserInfo({'obj':obj})
//取數據
let name = this.userInfo.obj.name
console.log(name)  //張三
//刪除
this.deleteUserInfo('obj')

vuex的封裝就到此完畢,但是,使用過vuex的童鞋都知道,刷新的時候數據會消失,針對于不同的業(yè)務需求,我在項目中也做了處理,大概思路就是在home頁中監(jiān)聽刷新屏幕的事件,及時存在本地存儲中,然后去全局路由鉤子中判斷,如果進入login頁面,就不需要重新賦值了,如果是非login頁面,把本地的值又賦值給vuex,這樣vuex結合本地存儲,就能很完美的做到數據的存儲,傳值也變得簡單起來

貼貼代碼:

//布局頁面
  methods : {
            beforeunloadFn ( e ) {
                setLocal ( "userMemory" , {
                    userInfo : this.userInfo ,
                    otherInfo : this.otherInfo ,
                } );
             //   let confirmationMessage = "";
               // ( e || window.event ).returnValue = confirmationMessage; // Gecko and Trident
               // return confirmationMessage;
            }
        } ,
        mounted () {
            // this.resizeHandler();
            //beforeunload事件在當頁面卸載(關閉)或刷新時調用
            // window.addEventListener("resize", this.resizeHandler);
            window.addEventListener ( "beforeunload" , this.beforeunloadFn , true );
        } ,
        beforeDestroy () {
            // window.removeEventListener("resize", this.resizeHandler);
            window.removeEventListener ( "beforeunload" , this.beforeunloadFn , true );
        }

圖上用到的setLocal,getLocal方法就是本地存儲存取,代碼如下

export function setLocal(key, val) {
    let ls = window.localStorage;
    let allLoacl = getLocal("allLoacl");
    if (allLoacl == null) {
        let nullObj = {};
        nullObj[key] = val;
        ls.setItem("allLoacl", JSON.stringify(nullObj))
    }
    else {
        allLoacl[key] = val;
        ls.setItem("allLoacl", JSON.stringify(allLoacl));
    }
    // }
}

export function getLocal(key, value) {
    if (value == undefined) {
        value = {}
    }
    let ls = window.localStorage;
    try {
        let data = JSON.parse(ls.getItem("allLoacl"));
        if (data == null) {
            return value;
        } else if (key === "allLoacl") {
            return data;
        } else if (!!data[key] && data[key] != undefined) {
            return data[key];
        } else {
            return value;
        }
    } catch (error) {
        return value;
    }
}

路由鉤子里面代碼,具體判斷路由都省了,這里只添加重新賦值vuex的代碼

//引入store
import store from './store';

  let userMemory = getLocal ( "userMemory" );
  store.dispatch ( "upVuex" , {
     mutations : "setUserInfo" ,
     value : userMemory.userInfo
    });
  store.dispatch ( "upVuex" , {
    mutations : "setOtherInfo" ,
    value : userMemory.otherInfo
 });                                     

到此,vuex結合本地存儲全部完畢,個人拙見,有錯誤或好的想法歡迎指出!

附言:

基于vue+element 的后臺管理框架

GitHub: https://github.com/wxyfc/management-system

網址: https://wxyfc.github.io/management-system/#/login肛走,賬號:admin 密碼:admin 直接點擊登錄即可

如果對您有幫助請點個小星星哦,謝謝,mua~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末彼妻,一起剝皮案震驚了整個濱河市滚澜,隨后出現的幾起案子古话,更是在濱河造成了極大的恐慌牺氨,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件草娜,死亡現場離奇詭異挑胸,居然都是意外死亡,警方通過查閱死者的電腦和手機宰闰,發(fā)現死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門茬贵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人移袍,你說我怎么就攤上這事解藻。” “怎么了咐容?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵舆逃,是天一觀的道長蚂维。 經常有香客問我戳粒,道長路狮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任蔚约,我火速辦了婚禮奄妨,結果婚禮上,老公的妹妹穿的比我還像新娘苹祟。我一直安慰自己砸抛,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布树枫。 她就那樣靜靜地躺著直焙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砂轻。 梳的紋絲不亂的頭發(fā)上奔誓,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音搔涝,去河邊找鬼厨喂。 笑死,一個胖子當著我的面吹牛庄呈,可吹牛的內容都是我干的蜕煌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼诬留,長吁一口氣:“原來是場噩夢啊……” “哼斜纪!你這毒婦竟也來了?” 一聲冷哼從身側響起文兑,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤傀广,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后彩届,有當地人在樹林里發(fā)現了一具尸體伪冰,經...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年樟蠕,在試婚紗的時候發(fā)現自己被綠了贮聂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡寨辩,死狀恐怖吓懈,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情靡狞,我是刑警寧澤耻警,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響甘穿,放射性物質發(fā)生泄漏腮恩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一温兼、第九天 我趴在偏房一處隱蔽的房頂上張望秸滴。 院中可真熱鬧,春花似錦募判、人聲如沸荡含。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽释液。三九已至,卻和暖如春装处,著一層夾襖步出監(jiān)牢的瞬間均澳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工符衔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留找前,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓判族,卻偏偏與公主長得像躺盛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子形帮,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359