美文网首页
vue学习笔记(4)—vuex封装

vue学习笔记(4)—vuex封装

作者: 小奚有话说 | 来源:发表于2020-04-20 23:19 被阅读0次

对于一个vue来说,它有自己的一套插件库。我们一般构建一个vue项目,会使用到vue-router,vuex,axios,有了这三个插件,基本上就可以构建一个web网站了。

vue-router

vue-router是什么,你可以这样理解,当我们页面发生跳转,即path发生变化之后(在vue里称作是路由),路由即发生相应的变化,你所看到的页面变化,无非是路由中所渲染的组件发生变化而已。

vuex

vuex是状态管理,通常我们在页面跳转或者交互的时候,会产生数据交互,通常我们的做法可能是通过localstorage,sessionstorage,cookies等进行数据的存储,而vuex则有类似的功能,而不用频繁的操作storage,并且很方便的获取到页面中的数据,便于组件间的数据交互。

axios

axios类似于jQuery中的ajax,用于获取后台数据,支持promise,避免ajax中的回调地狱。对于vue而言,目前算是一个比较好的选择。

基本上一个vue项目有这三个插件,基本上就差不多了,但是在实际开发过程中,我们会使用前端样式库,如elementvant等,当然还有其他的,如vue-echarts-v3vue-quill-editorvue-i18n等插件来丰富自己的网站,这里就不一一叙述了。

上一篇已经针对于router做了描述,本片文章主要是针对vuex进行封装,一般而言,我们在项目中可能会有很多个不同的store,来管理不同的状态,如User,module1,module2等,那么你每写一个store都需要在index.js中import一次,非常麻烦。
是否有简单的方法呢?肯定是有的。那么来看一下

store目录结构
首先看到我这边目录结构非常简单,在store目录下有一个index.js,然后其他的store文件均放在modules目录下。
首先看一下index.js做了什么吧!
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

let modules = {}
let sessionStore = []
const storeModules = require.context('./modules', false, /\.js/)
storeModules.keys().forEach(filename => {
    const storeModuleItem = storeModules(filename)
    let module_name = filename.split('/').pop().replace('.js', '')
    module_name = module_name[0].toUpperCase() + module_name.slice(1)
    modules[module_name] = storeModuleItem.default || storeModuleItem
    if (storeModuleItem.default && storeModuleItem.default.saveStore) {
        sessionStore.push(module_name)
    }
})

export {sessionStore}

let store = new Vuex.Store({
    modules: modules
})

export default store

从代码看分三步走,
1、引用vuex
2、从modules文件夹导入对应的store文件,并初始化modules字典
3、实例化store并导出给外部使用。
我这里使用到了两个变量,modules主要用来存放store配置的,而sessionStore是用session存储store配置的,我们知道当我们强制刷新页面时(点击页面上的刷新按钮)会导致vuex的配置丢失,而这恰恰是我们应该避免的,所以在强制刷新时,我们通过sessionStore可以将我们认为需要保存的数据存储在session中,避免数据丢失,并且只需要在定义store的时候加一个saveStore参数即可。
那么现在来看一下user.js吧

const UserInfo = {
    namespace: true,
    saveStore: true,
    state: {
        userInfo: {}
    },
    mutations: {
        set_user_info(state, user_info) {
            state.userInfo = JSON.parse(JSON.stringify(user_info))
        }
    }
}

export default UserInfo

很常规的store写法,namespace用来限定命令空间,saveStore是我们控制是否要保存store参数,state是需要管理的状态,而改变store需要通过mutations进行改变。具体可以查看 vuex官网学习更多用法。

这样就大功告成了吗?还没有,还有一件事情,就是需要在页面强制刷新的时候保存store
这个时候看一下APP.vue

<template>
  <div id="app">
    <router-view/>
  </div>
</template>

<script>
  import {sessionStore} from "./store";
  export default {
    created() {
      let tempStore = sessionStorage.getItem('store')
      if (tempStore) {
        this.$store.replaceState(Object.assign({}, this.$store.state, JSON.parse(tempStore)))
      }
      window.onbeforeunload = () => {
        let store = {}
        for (let module of sessionStore) {
          store[module] = this.$store.state[module]
        }
        sessionStorage.setItem("store", JSON.stringify(store))
      }
    }
  }
</script>

APP.vue是整个vue页面的入口,在该组件created的时候先从sessionStorage中更新store,并且监听onbeforeunload方法,当页面即将离开或关闭或刷新时会调用该方法,我们在这个时候去保存store就可以了。

vuex的封装就到此结束咯,你也来试一下吧。

相关文章

  • vue学习笔记(4)—vuex封装

    对于一个vue来说,它有自己的一套插件库。我们一般构建一个vue项目,会使用到vue-router,vuex,ax...

  • Vue学习笔记进阶篇——vuex安装及使用

    本文为转载,原文:Vue学习笔记进阶篇——vuex安装及使用 简介 Vuex是一个专为 Vue.js 应用程序开发...

  • vue安装veux

    现在使用npm i 会默认安装vuex4,vuex4只适用于vue3,如果使用的vue环境是vue3,安装vuex...

  • vuex学习笔记

    vuex学习笔记 vuex是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存...

  • vue 技术栈 架子 vue-router axios vuex

    本文是vue技术栈基础架子包含:1 路由配置2 vuex使用模块化3 axios封装4 element-ui 组件...

  • vuex状态管理的学习

    学习vuex首先要在vue的项目中安装vuexcnpm i vuex -S引入vuex 并注册import Vue...

  • Vue学习笔记进阶篇——vuex核心概念

    本文为转载,原文:Vue学习笔记进阶篇——vuex核心概念 前言 本文将继续上一篇 vuex文章 ,来详细解读一下...

  • 2019-06-07

    import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)...

  • 2019-11-01

    平时做过的项目复杂不复杂,vue的话,把一个项目运用的技术栈都说出来 vue vue-cli vuex 封装axios

  • 2018-09-06

    import Vue from 'vue'import Vuex from 'vuex' Vue.use(Vuex...

网友评论

      本文标题:vue学习笔记(4)—vuex封装

      本文链接:https://www.haomeiwen.com/subject/ihsxbhtx.html