Vuex新手的理解与使用详解


Posted in Javascript onMay 31, 2019

1 vuex的概念理解

提到vuex,就不能不先提vue.

我个人开始尝试学习使用vue,是因为此前总是遇到页面逻辑数据与视图的一致性问题.在使用vue之前,我们使用jQuery插件的时候,一桩麻烦事就是既要在每个数据变更后,写代码去改变视图,又要考虑html上各种输入改变时监听各种事件以改变页面逻辑数据.当然最早的时候,我们使用html内部的value来记载各种数据,但这种方式在今日看来就有些简单粗暴了,难以使用复杂的页面逻辑.这也正是我开始使用vue的初衷--数据双向绑定.

但对于vue而言,还有一项很强大的功能,就是组件功能.对于这项功能,有两种使用理解:其一是制作一些简单轻便的轮子,很难适用于其他项目但很适用于项目内部的多个页面;其二是路由页面,理解起来就是将每个页面看做是一个组件,而不是一个单独的html页面;

再开始使用vue的时候,我在每个页面都会new一个新的vue来实现页面内部的数据双向绑定,这种用法本来无可厚非,也能兼容老项目,但仅有一点不足(或者说是老项目的通用不足之处),即逻辑数据的管理是以html页面为单位的,页面之间的数据没有什么可关联的太好方法(html页面之间是通过iframe实现连接的,但相互之间的数据交流却没有太好的api,且也容易出现兼容性问题).

vuex就是为此准备的,当然有一个前提,就是页面关联方式,要通过vue组件的方式关联起来.使用此种方式后,在使用前台vue进行编程的一些思想,就要发生一些转变.这里列举一下我们可通过数据交流所做的一些事情:

大多数经常调用的基础数据,可在所有页面公用,这是适用于技术场合的;

对于组件,常用的有两种属性,一是data,一是prop.就我的理解而言,data负责组件内部的逻辑,prop负责与内外部数据之间的数据关联,如最常见的value.但对于路由页面组成的框架而言(如iview),如果切换路由页面,会导致原路由页面data清空,此时使用vuex.store来存储数据就可避免这种情况,这是适用于vue组件页面场合的;

2 vuex的使用

对于一个前台项目而言,vue组件一定有很多,但vuex只能有一个('/src/store/index.js').当然,可以通过import的方式将vuex开枝散叶(modules),使得不同的module存储不同的业务数据.以下为vuex的主干内容:

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

import user from './module/user'
import app from './module/app'
import basedata from './module/basedata'

Vue.use(Vuex)

export default new Vuex.Store({
 state: {
  //
 },
 mutations: {
  //
 },
 actions: {
  //
 },
 modules: {
  user,
  app,
  basedata
 }
})

以下为其中的一个枝叶:/module/basedata.js,用来存储基础数据的module:

import { getCusData, getSupSelect } from '../../api/public'

/**
 * 常用基础数据读取,注意有以下限制:
 * 1.必须只能是读取!!!
 * 2.必须只能是在基础模块的数据!!!
 * 3.目前仅是通过数据的有无来判断是否作为缓存,后续可能会通过更加合理和复杂的逻辑来判断.
 * @author YangYishe
 */
export default {
 state: {
  // 客户集合
  arrCustomer: [],
  // 供应商集合
  arrSupplier: [],
  
  nowTimes: 0
 },
 mutations: {
  setNowTimes (state, times) {
   // 测试vuex state的方法
   console.log('set now times')
   state.nowTimes = new Date().getTime() + times
  },
  // 重置客户数据
  setCustomerData (state, arrCustomer) {
   state.arrCustomer = arrCustomer
  },
  // 重置供应商数据
  setSupplierData (state, arrSupplier) {
   state.arrSupplier = arrSupplier
  },
  
 },
 getters: {

 },
 actions: {
  // 测试改变方法
  handleChangeTimes ({ state, commit }, { times }) {
   commit('setNowTimes', times)
  },
  // 读取客户数据(支持mapState和return两种用法)
  loadCustomer ({ state, commit }) {
   // 读取客户数据(Promise以支持异步操作)
   if (state.arrCustomer.length === 0) {
    return new Promise((resolve, reject) => {
     getCusData().then(res => {
      commit('setCustomerData', res.data)
      resolve(res.data)
     }).catch(err => reject(err))
    })
   } else {
    return state.arrCustomer
   }
  },
  // 读取供应商数据(支持mapState和return两种用法)
  loadSupplier ({ state, commit }) {
   if (state.arrSupplier.length === 0) {
    return new Promise((resolve, reject) => {
     getSupSelect().then(res => {
      commit('setSupplierData', res.data)
      resolve(res.data)
     }).catch(err => reject(err))
    })
   } else {
    return state.arrSupplier
   }
  },
  
 }
}

从这个module/basedata.js中,我们很容易看出这个module的大致逻辑.

  • state存储的全局的客户和供应商集合;
  • mutations一般是用来同步改变state中的数据,类似于setters;
  • getters用来根据state计算各种属性值;
  • actions则是异步接收数据(不一定必须是异步方法,如第一个方法,只是外界调用接口都是从这里调用的),然后调用mutations内部方法来改变state的值;

外界调用方式,可参考如下(这里仅列举必要代码):

<template>
  ...
  <!-- 这里采用的是iview框架,所以Select和Option都是首字母大写 -->
  <Select v-model="mCondition.customerId" clearable filterable>
   <Option v-for="mCustomer in arrCustomer" :key="mCustomer.id" :value="mCustomer.id">{{mCustomer.name}}</Option>
  </Select>
  ...
</template>
<script>
import { mapState, mapActions } from 'vuex'
export default{
  name:'test-temp',
  data(){
    return {
      //
      mCondition:{}
    }
  },
  computed:{
    //这里因为是采用vuex.store的分支,不确定采用字符串数组的方式是否可以
    ...mapState({
      arrCustomer:state=>state.basedata.arrCustomer
    })
    
  },
  created(){
    //这里调用的就是mapActions的方法,如果原方法有参数,则默认从第二个参数开始,不需考虑{state}
    this.loadCustomer();
  },
  methods:{
    //这里采用的是字符串数组的方式
    ...mapActions([
     'loadCustomer',
    ]),
  }
  
}

</script>

以上即是vuex的使用方式,个人认为比较中的说明,已经放在代码中的注释里了.

3 其他注意点

本文更偏向于让新手去理解和上手,故代码偏向于更简单的方案.

实际使用中,对于缓存更替的考虑可能要更复杂.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于Jquery的简单&amp;简陋Tabs插件代码
Feb 09 Javascript
JavaScript极简入门教程(二):对象和函数
Oct 25 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
Jan 23 Javascript
浅谈Javascript中Object与Function对象
Sep 26 Javascript
jquery validate demo 基础
Oct 29 Javascript
JS判断字符串字节数并截取长度的方法
Mar 05 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
Jun 24 Javascript
JavaScript 数组的深度复制解析
Nov 02 Javascript
三种方式实现瀑布流布局
Feb 10 Javascript
JS实现身份证输入框的输入效果
Aug 21 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
Aug 22 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
一文快速了解JQuery中的AJAX
May 31 #jQuery
gulp构建小程序的方法步骤
May 31 #Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
May 31 #jQuery
自定义javascript验证框架示例【附源码下载】
May 31 #Javascript
vue spa应用中的路由缓存问题与解决方案
May 31 #Javascript
JS实现处理时间,年月日,星期的公共方法示例
May 31 #Javascript
一文了解vue-router之hash模式和history模式
May 31 #Javascript
You might like
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
多广告投放代码 推荐
2006/11/13 Javascript
小议Javascript中的this指针
2010/03/18 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
2015/03/04 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
基于node.js依赖express解析post请求四种数据格式
2017/02/13 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
小程序云开发实战小结
2018/10/25 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
详解jquery和vue对比
2019/04/16 jQuery
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
Pycharm远程调试openstack的方法
2017/11/21 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
Django Rest framework认证组件详细用法
2019/07/25 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
Python二元算术运算常用方法解析
2020/09/15 Python
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
阿里云:Aliyun.com
2017/02/15 全球购物
关于Assembly命名空间的三个面试题
2015/07/23 面试题
毕业自我鉴定总结
2014/03/24 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
小组名称和口号
2014/06/09 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
测量员岗位职责
2015/02/14 职场文书
Redis三种集群模式详解
2021/10/05 Redis
利用Redis实现点赞功能的示例代码
2022/06/28 Redis