Vuex的实战使用详解


Posted in Javascript onOctober 31, 2019

写在前面

我是一个看技术的文档不喜欢官方的人,觉得官方写的任何东西都是比较正式的,让人有点不想看的赶脚,我这里也不贴官方的那个图了,这里也不解释了(其实是我也不想研究)所以我一般都是百度一些别人的经验之谈,看别人的经验之谈可以让你少踩一些坑,而且是可以直接看到效果的,所以这里也是,我们不按照官方的来,那么有利有弊,利就是好理解,弊就是可能写的不够专业,会让一些人误会,总之我权衡之后还是选择看着官方的一些东西然后结合自己的使用来说一下怎么玩这个vuex的。说实话我开始使用的时候觉得这个东西还是很好的,毕竟结合自己的需求,如果您的项目一直没有用到这个的地方可能体会不到,这里就开始写玩法。

什么是vuex

说白了就是一个可以全局管理状态的东西,用官方的话说是它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,说人话就是可以时刻监听一个值的状态改变,同时项目里面别的组件也可以使用这个变量。做出相应的处理。

安装

这个是万年不变的,没什么好说的。直接在项目里面运行下面这行代码

npm install vuex --save

我的业务场景

首先说一下业务场景,不然看代码是没有意义的,毕竟代码是为了解决业务的问题,我的业务是需要做一个机器的管理项目,那么这个机器有很多台,例如机器1、机器2等,那么想管理就需要将所有的机器先拿到,然后根据需要切换想设置的机器,view显示对应的机器的配置信息,需求是很明确的,我语言表达能力不行,直接看图。

Vuex的实战使用详解

这里简单的解释一下,有人说,这个不是很简单嘛,直接将切换的函数写到select的控件里面,直接点击切换的函数的时候直接给后端对应的uuid,拿到值就可以了,是的,如果只有这一个页面是可以的,但是仔细看布局,select组件是在一个公共组件里面的,你选择的时候你的uuid是不可以直接给到当前页面的,即时给到他,别的配置怎么办呢?而且我们要做的是切换的时候直接整个项目里面的uuid全部改掉,然后重新渲染整个数据,才是合理的解决方案。说一下我开始的想法,我开始是准备使用缓存做,每次用户切换的时候我都将最新的uuid放到缓存里面,但是有一个问题解决不了就是在别的页面怎么实时监听这个值改变了呢?所以,使用vuex是一个比较合理的解决方案,看代码

使用

新建一个store.js

引入

  • 在store.js里面直接将下面的代码复制到里面
  • 声明一个您需要监听的变量(store.js)
/**
 * created by ClearLove
 * @aim 标题栏中需要更改自助机的uuid,所有的返回值都需要是该自助机下的数据,所以需要声明一个全局的可以监听uuid的变化
 * @params machine_uuid_flag 全局uuid
 */
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)


const state = {
 machine_uuid_flag: '', //机器uuid
}

const getters = {
 getters_mac_uuid() {
  return state.machine_uuid_flag
 }
};
const mutations = {
 mutations_mac_uuid(state, mac_uuid) {
  state.machine_uuid_flag = mac_uuid
 }
};
const actions = {
 actions_mac_uuid(state, mac_uuid) {
  state.commit('mutations_mac_uuid', mac_uuid)
 }
};

export default new Vuex.Store({
 state,
 getters,
 mutations,
 actions
})

页面使用

首先我们子啊公共组件也就是展示select组件的地方将切换事件处理一下

/**
    * @change_machine 更改自助机
    */
   change_machine(machine_mac_uuid) {
    this.machine_id = machine_mac_uuid;
    // 这里是将最新的更换的机器的uuid,将store里面的uuid更换掉,这样才可以保证别的地方使用这个uuid的地方也会同时改变
    this.$store.dispatch('actions_mac_uuid',machine_mac_uuid);
    sessionStorage.setItem('machine_mac_uuid', this.machine_id)
   },

把引入组件的代码也贴上来吧,这样好理解

<el-select v-model="machine_name" placeholder="自助机列表" size="mini" @change="change_machine">
       <el-option
        v-for="item in machine_list"
        :key="item.mac_uuid"
        :label="item.machine_name"
        :value="item.mac_uuid">
       </el-option>
</el-select>

这个时候下面的页面怎么接收这个值做出相应的改变呢?

created: function () {
   this.machine_mac_uuid = sessionStorage.getItem('machine_mac_uuid');
   this.machine_name = sessionStorage.getItem('machine_name');
   //将最新的uuid拿到
   this.update_mac_uuid = this.$store.state.machine_uuid_flag;
   this.get_settings_info()
  },
  /**
   * 接收store的改变的值
   */
  computed:{
   machine_uuid_flag(){
    //将接收到的最新的uuid return出去 
    return this.$store.state.machine_uuid_flag
   }
  },
  /**
   * 监听该store里面值的变化
   */
  watch: {
   //监听这个值是不是接收到,改变的话直接重新执行获取机器的方法
   machine_uuid_flag: function (newvalue , oldvalue) {
    this.update_mac_uuid = newvalue; //将最新的值传递给更新的对象
    this.get_settings_info();
   }
  },
  methods: {
   /**
    * @get_settings_info 获取某一台自助机的详情
    */
   get_settings_info() {
    this.$axios({
     method: 'post',
     url: this.api.api_zzj_9006 + 'manager_back/get_main_info/',
     data: {
      machine_uuid: this.update_mac_uuid ? this.update_mac_uuid : this.machine_mac_uuid
     }
    }).then((res) => {
     let machine = res.data.data;
     this.machine_name = machine.machine_name;
     this.machine_mac_uuid = machine.machine_mac_uuid;
     this.location = machine.location;
     this.mac_uuid = machine.mac_uuid;
     this.machine_uuid = machine.machine_uuid;
     this.mac_uuid_two = machine.mac_uuid_two;
     this.expire_data = machine.expire_data;
     this.environmental_state_dec = machine.environmental_state_dec;
     this.machine_type_des = machine.machine_type_des;
     this.system_version = machine.system_version;
    }).catch((err) => {
     console.error(err)
    })
   }
  },

我在想你们是不是心里一万句cnm飘过,写那么多做什么?装逼吗?其实不是的,是我在看别人的博客的时候发现一个问题,就是很多人贴代码的时候因为贴的是一部分,导致很多人摸不着头脑,也不知道每一个方法是怎么传递的,我不想我的博客别人看了以后也有这样的疑问,所以才整个直接贴出来,当然我会做出详细的解释,。

解释一下上面的代码:首先我们在页面加载的时候也就是created的阶段将最新的uuid也就是store里面的全局变量的值拿到,有人说你拿到, 为什么还要写下面的,那么问题就来了,如果用户在当前页面直接切换了机器的uuid,那么他没有刷新页面,也没有切换页面,这个时候created是不会执行的,是不是,那么最新的uuid怎么更新呢?你即使监听了但是由于createrd不执行,导致的问题就是你监听的值一直没有变化,所以我们需要将页面里面的uuid变化时刻监听,所以我们需要在computed里面接收最新的uuid,然后我们监听这个里面的值,只要改变,就做出相应的改变,这样就满足了我们的需求,

问题1:为什么使用computed不直接使用watch?

有人看到以后就会觉得我们直接监听这个值不行吗?我们这里要明白的是watch是只可以监听data里面声明的变量或者对象,除此之外是监听不到的,而computed用来监控自己定义的变量,该变量不在data里面声明,直接在computed里面定义,然后就可以在页面上进行双向数据绑定展示出结果或者用作其他处理。

问题2:为什么使用缓存?

这里使用缓存的目的是为了你第一次进来的时候,如果用户什么都不切换,不执行change_machine函数的话,那么我们请求接口的参数是空的,所以我们需要默认一个值,你可以直接在store里面默认,也可以我在第一次进来的时候直接判断是不是存在store的值,没有的话就用我默认的缓存里面的值。

问题3: 为什么created里面已经拿到了,还要写监听函数?

这个问题可能有人会问,但是其实很简单,因为用户不刷新页面的时候created是不执行的,那么我们就拿不到最新的uuid进行数据的更新,所以要写监听的函数。

问题4: 为什么使用this.$store.dispatch?

我们这里使用是根据官方文档来的,你可以直接使用commit或者什么也不用,直接this.$store.state.machine_uuid_flag也是可以的,但是我们改变了uuid,那么就要重置一下store里面的原始值,所以这里需要接收我们改变的值,也就是用户选择了别的机器的时候用的值。如果我们不需要重置原始值的话,可以直接定义一个全局变量,然后直接

this.$store.state.machine_uuid_flag(这里格式乱了)就可以了,但是这样的业务场景应该不多。毕竟我们定义了就是为了改变它从而我们可以监听这个变化的值。

总结

写到这里基本上的用法我写完了,可能写的没有那些大神写的详细,也没有什么原理分析,写的也比较浅显,我看很多人写博客的时候喜欢分析一下原理,一方面显的专业性比较高,一方面可以有利于自己的理解和别人的理解,首先我也是不经常使用这个技术栈,其次是我个人觉得用的好要比明白原理强,我不喜欢只讲原理一个例子都不写的人,毕竟例子是最可以发现问题的,也是最直观的,就写到这里吧,以后再更新,我写博客的目的是记录自己写项目的过程,记录用到的东西,以后用到了更深的再更新,希望可以帮助到人更好。写的不对的希望可以直接联系我,我及时纠正,谢谢大家的支持。

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

Javascript 相关文章推荐
javascript获取URL参数与参数值的示例代码
Dec 20 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
Mar 16 Javascript
Javascript生成带参数的二维码示例
Oct 10 Javascript
jQuery 插件实现随机自由弹跳气泡样式
Jan 12 Javascript
JavaScript数组和对象的复制
Mar 21 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
Apr 11 Javascript
利用 spin.js 生成等待效果(js 等待效果)
Jun 25 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
Jul 03 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
JS为什么说async/await是generator的语法糖详解
Jul 11 Javascript
jquery图片预览插件实现方法详解
Jul 18 jQuery
vue select 获取value和lable操作
Aug 28 Javascript
如何在Vue中抽离接口配置文件
Oct 31 #Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
Oct 30 #Javascript
基于Vue中使用节流Lodash throttle详解
Oct 30 #Javascript
Vue最新防抖方案(必看篇)
Oct 30 #Javascript
vue输入节流,避免实时请求接口的实例代码
Oct 30 #Javascript
vue 解决form表单提交但不跳转页面的问题
Oct 30 #Javascript
解决在Vue中使用axios用form表单出现的问题
Oct 30 #Javascript
You might like
php自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python查询mysql中文乱码问题
2014/11/09 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
Python的条件锁与事件共享详解
2019/09/12 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
TensorFlow:将ckpt文件固化成pb文件教程
2020/02/11 Python
Python视频编辑库MoviePy的使用
2020/04/01 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
HTML5标签小集
2011/08/02 HTML / CSS
Gap工厂店:Gap Factory
2017/11/02 全球购物
会计职业生涯规划书
2014/01/13 职场文书
《路旁的橡树》教学反思
2014/04/07 职场文书
《埃及的金字塔》教学反思
2014/04/07 职场文书
实习报告评语
2014/04/26 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
村党支部对照检查材料思想汇报
2014/09/28 职场文书
四风查摆剖析材料
2014/10/10 职场文书
求职自我评价参考范文
2019/05/16 职场文书
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android