【VUE2】如何在项目中快速的搭建并使用VUEX?

2749次阅读 214人点赞 作者: WuBin 发布时间: 2021-08-27 14:31:38
扫码到手机查看

VUEX简介

VUE3中如何搭建VUEX,可以参考我的最新文章:VUE3中使用VUEX的基本文件套路

本文章中介绍的使用环境为vue2.x。官方链接:https://vuex.vuejs.org/zh/guide/

众所周知 Vuex 是什么呢?是用来干嘛的呢?

Vuex 是一个专为 Vue.js 应用程序开发的`状态管理模式`。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

例如:你有几个数据,几个操作,在多个组件上都需要使用,如果每个组件都去调用都是写,就会很麻烦,代码又臭又长。当然 如果没有大量的操作和数据需要在多个组件内使用的话呢,其实也就可以不用这个 Vuex了。看个人吧!

快速使用

安装vuex

npm install vuex --save

建立store文件夹,创建Index.js

首先为了项目格式便于维护和相对规范一点,我们先在 目录下建立一个 store 文件夹,并且在下面建立一个 index.js 文件。

import Vue from "vue";
import Vuex from 'vuex';

import state from "./state";
import * as actions from './actions';
import * as getters from './getters';
import mutations from "./mutations";

import createLogger from 'vuex/dist/logger'

Vue.use(Vuex);

let debug = process.env.NODE_ENV !== 'production';

//创建VueX对象
const store = new Vuex.Store({
  actions,
  state,
  getters,
  mutations,
  // 开启严格模式,线上不使用会有性能损耗 只在开发阶段使用
   // 调试工具,判断state是不是通过mutation去修改的 不是的话就报错
  strict: debug,
  // 使用vuex自带的createLogger plugin,是一个数组,可以有别的plugin
  plugins: debug ? [createLogger()] : []
});

export default store;

创建需要维护属性状态的文件-state.js

//存放的键值对就是所要管理的状态
const state = {
  // 所有资源图片
  resource: [],
  // 主要表单数据
  main: {},
  // 专题发布的状态
  overt: false
};

export default state;

创建定义修改属性操作的名称文件-mutations_types.js

export const SET_RESOURCE = 'SET_RESOURCE';

export const SET_MAIN = 'SET_MAIN';

export const SET_OVERT = 'SET_OVERT';

创建修改state中属性的方法-mutations.js

import * as types from './mutations_types';

const mutations = {
  [types.SET_RESOURCE](state, resource) {
    state.resource = resource;
  },
  [types.SET_MAIN](state, main) {
    state.main = main;
  },
  [types.SET_OVERT](state, ztStatus) {
    state.overt = ztStatus;
  }
};

export default mutations;

创建从vuex中获取属性值的方法文件-getters.js

export const resource = state => state.resource;
export const main = state => state.main;
export const overt = state => state.overt;

创建用于向vuex中存储数据的操作函数文件-actions.js

以我的一个真实项目为例:

import * as types from './mutations_types';

// 由于不能直接修改在vuex中的数据,所以必须要先把原来对象、数组进行深复制
function copyObj(obj) {
  let copy = JSON.parse(JSON.stringify(obj));
  return copy;
}

// 初始化数据 在获取数据后先向vuex中推送
export const initData = function ({ commit }, { resource, main, overt }) {
  commit(types.SET_RESOURCE, resource);
  commit(types.SET_MAIN, main);
  commit(types.SET_OVERT, overt);
};

// 向资源中插入图片资源
export const resourceInsert = function ({ commit, state }, imgUrls) {
  // 注意,这里必须取一个副本,要修改它的状态,必须在mutations中修改
  let resource = state.resource.slice();
  resource.unshift(...imgUrls);
  commit(types.SET_RESOURCE, resource);
};

// 删除资源
export const resourceDelete = function ({ commit, state }, imgUrl) {
  let resource = state.resource.slice();
  // 找到项在数组中的索引
  let delIndex = resource.indexOf(imgUrl);
  resource.splice(delIndex, 1);
  commit(types.SET_RESOURCE, resource);
};

// 对main中的属性进行修改
/* 第二个参数对象使用的时候采用了解构赋值,传的时候也要穿一个对象 */
export const mainBaseUpdate = function ({ commit, state }, { attr, inputVal }) {
  // 对main进行深拷贝,严格模式下,不允许直接修改mutations中的内容
  let main = copyObj(state.main);
  main[attr] = inputVal;
  commit(types.SET_MAIN, main);
};


// 清空所有Imgs
export const mainImgsClear = function ({ commit, state }) {
  let main = copyObj(state.main);
  main.imgs = [];
  commit(types.SET_MAIN, main);
};


export const mainImgsUpdate = function ({ commit, state }, { index, attr, value }) {
  let main = copyObj(state.main);
  // main.imgs[3]['alt'] = ...
  main.imgs[index][attr] = value;
  commit(types.SET_MAIN, main);
};

// 修改专题的发布状态
export const overtUpdate = function ({ commit, state }, overt) {
  // 同时也要修改main中的overt发布状态
  let main = copyObj(state.main);
  main.overt = overt;
  // 提交多个属性的修改
  commit(types.SET_OVERT, overt);
  commit(types.SET_MAIN, main);
};

有几点需要特别注意:

对于vuex中的数据,不能直接修改,必须要进行复制后再修改:

对象的复制

function copyObj(obj) {
  let copy = JSON.parse(JSON.stringify(obj));
  return copy;
}

数组的复制

// 先从vuex中复制数组
let resource = state.resource.slice();
// 向复制的数组中插入
resource.unshift(...imgUrls);
// 将值进行提交到修改mutations中
commit(types.SET_RESOURCE, resource);

执行修改操作

对于像:const mainBaseUpdate =function({ commit, state }, { attr, inputVal }) {....}

这样的进行传参的时候,必须要传一个对象,且属性名要与参数中对应起来,多个参数要放在一个对象中。

this.mainBaseUpdate({
      attr: 'shuxing',
      inputVal: event.target.value
});

commit,state

commit就是提交的意思,修改完属性,要执行提交操作。

state:就是用来获取vuex中的属性对应的值的。

固定操作,牢记即可。

在main.js中注册store

import store from "./store";
new Vue({
  store,
  render: h => h(App),
}).$mount('#app');

在vue组件中使用

获取vuex中的属性

<template>
    <p>{{ main.title }}</p>       
</template>

export default {
  name: "main-form",
  computed: {
    ...mapGetters([
        'main'
    ])
  },
  ...
}

使用...mapGetters这个魔术方法,利用组件的计算属性,将vuex中的值获取到。之后像平常使用计算属性一样,在模板中使用即可。切记,对这些属性,只能get,不能set修改。

修改vuex中属性的值

在methods中使用...mapActions,引入actions.js中的方法。

export default {
  name: "main-form",
  methods: {
    setZtLogo(logo) {
      this.mainBaseUpdate({
        attr: 'zt_logo',
        inputVal: 'www.wubin.work'
      });
    },
    ...mapActions([
      'mainBaseUpdate'
    ])
  }
  ...
}

之后像在组件中定义的方法一样使用即可。切记,修改一切vuex的操作,都要通过actions中的方法进行操作。

在uniapp中使用

在uniapp的Vue2中,使用vuex,需要打印调试功能,那么:

import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
//dev 环境打印vuex相关log
//如果vuex版本为3.6.2及以上,则只用Vuex.createLogger
const plugins = process.env.NODE_ENV === 'development'?[Vuex.createLogger()]:[]
//如果vuex版本低于3.6.2,导入createLogger,再使用
// import createLogger from 'vuex/dist/logger.js';
//const plugins = process.env.NODE_ENV === 'development'?[createLogger()]:[]
const store = new Vuex.Store({
  plugins,//添加插件
//...其他内容state,mutations,actions等
});

需要使用Vuex.createLogger() 执行即可。

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:vuex
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    9094次阅读 588人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    3845次阅读 287人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14071次阅读 914人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    12908次阅读 442人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    11469次阅读 920人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    15588次阅读 1244人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    14795次阅读 1205人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    28950次阅读 2273人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    24982次阅读 1925人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录