vue + vuex 实战开发使用

2021-04-29  本文已影响0人  多久以后_Mr
  1. 使用vuex 前老规矩首先下载安装 对应模块
    npm install vuex --save

2.安装好对应模块后src文件夹下自动建立store 文件夹 ,文件夹下自动建立index.js 文件(其余的自己先建立一下之后用到的时候在进行说明)


image.png

大概目录如上所示

  1. index.js 内容大致如下(modules analysisStoreModule.js 接下来详细讲解)
import Vue from 'vue'
import Vuex from 'vuex'
import analysisStoreModule from './analysisStoreModule'
Vue.use(Vuex)
const modules = analysisStoreModule(require.context('./modules', true, /\.js$/))   // 对所有使用vuex 模块的文件夹 进行 解析遍历
export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules
})

analysisStoreModule.js的大致内容如下

// 自动解析模块,包含递归子模块
const analysisSubModule = (rq, moduleNames) => {
  const moduleKeys = rq.keys()
  const modules = moduleKeys.reduce((obj, path) => {
    // 路径数组
    const arr = path.split('/')
    // 解析深度
    const depth = moduleNames.length * 2
    if (arr.length < 3 + depth) {
      return obj
    }
    const parentName = arr[depth - 1]
    const parentModule = moduleNames[moduleNames.length - 1]
    // 避免将其他模块的子模块解析到当前递归模块
    if (parentName !== parentModule) {
      return obj
    }
    // 模块名称
    const moduleName = arr[depth + 1]
    // 字段名称,可以是以下中的某一个: state, actions, mutations, getters, modules
    const fieldName = arr[depth + 2].replace(/\.js/, '')
    // 若模块没有创建,创建它
    if (!obj[moduleName]) {
      obj[moduleName] = {
        namespaced: true
      }
    }
    // 当字段没有时,创建它
    if (!obj[moduleName][fieldName]) {
      obj[moduleName][fieldName] = {}
    }
    // 确保已有的对象数据不会丢失
    const subObj = obj[moduleName][fieldName]
    // 如果字段名称是modules,递归解析模块
    obj[moduleName][fieldName] = {
      ...subObj,
      ...(fieldName === 'modules' ? analysisSubModule(rq, [...moduleNames, moduleName]) : rq(path).default)
    }
    return obj
  }, {})
  return modules
}
/**
 * 解析store模块
 * @param  {[type]} rq        [require.context返回的对象]
 * @return {[type]}           [无]
 */
export default (rq) => analysisSubModule(rq, [])

首先我们先在 modules 中建立两个文件夹 作为我们学习使用的两个模块(当然名称要与views中我们写的页面要一至),


image.png

每个文件夹里都有对应的四个js如下


image.png
对应的 views 中也有相同的两个文件夹如下
image.png

4.以home 文件夹为例


image.png

在 使用actionReduce 方法时传参


image.png
可以看到store中 modules下home内有四个对应的文件夹
首先在home 内引入对应的 state, getters,actions,mutations ( 通过 createNamespacedHelpers() )

然后介绍一下state, getters,actions,mutations 四个js 的内容以及功能

  1. state 和 getters 映射到当前组件的 computed

    Vuex就是提供一个仓库,仓库里面放了很多对象。其中state就是数据源存放地;
    存储在 Vuex 中的数据和 Vue 实例中的 data 遵循相同的规则,例如状态对象必须是纯粹 (plain) 的。参考:Vue#data (opens new window)
    state.js

export default {
  index: 0,
  homeData: '我是home文件的数据'
}

Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
(Getter 接受 state 作为其第一个参数;Getter 也可以接受其他 getter 作为第二个参数;)
getters.js

export default {
   jisuanAdd: state => {
        const max = state.index
        return max > 5?'计算出数值大于5':'计算出数值小于5'
   },
    jisuanReduce: ( state, getters) => {
        const max = state.index + 2
         return max > 5?'计算出数值大于5(+2)':'计算出数值小于5(+2)'
   }
}
  1. actions和mutations映射到当前组件的methods
    通俗的理解mutations,里面装着一些改变数据方法的集合,这是Veux设计很重要的一点,就是把处理数据逻辑方法全部放在mutations里面,使得数据和视图分离。
    Vuex中store数据改变的唯一方法就是mutation!(Mutation 必须是同步函数)
    mutations.js
export default {
   add: (state, val) => {
         console.log(val)  // 用来记录传参问题
         state.index--
   },
    reduce: ( state, val) => {
        console.log(val)  // 用来记录传参问题
        state.index++
   }
}

Action 类似于 mutation,不同在于:
Action 提交的是 mutation,而不是直接变更状态。
Action 可以包含任意异步操作。
背景:在mutation中我们讲到,mutation中是存放处理数据的方法的集合,我们使用的时候需要commit。但是commit是同步函数,而且只能是同步执行。那我们想异步操作怎么办?
作用:在actions中提交mutation,并且可以包含任何的异步操作。actions可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据(但是还是通过mutation来操作,因为只有它能操作)
actions.js

export default {
   actionAdd: (context, val) => {
         console.log(val)  // 用来记录传参问题
          context.commit('add', val)    // add 时 mutations 中的方法
   },
    actionReduce: ( {commit}, val) => {    // 参数解构 方法来简化代码
        console.log(val)  // 用来记录传参问题
         commit('reduce', val)
   }
}

在运用过程中多添加打印 用来更好的理解vuex
(参考他人 + 官网) 自己实际在项目中操作的结果(-_-```)
(重要通知 在“例如在store 下 home 下增加子模块时 一定要在 home 文件夹下建立 modules,子模块添加在modules中 在文件中引用时 createNamespacedHelpers(home/ 子模块名称)”)

上一篇下一篇

猜你喜欢

热点阅读