vuex在用 vue一年之后就不怎么用了,搭建项目会预留,但是几乎不用了。之前也说过vuex使用场景,vue是单项数据流,所以多组件直接共享状态的时候可以使用,另外就是做一些缓存,减少请求。
只是刷新就会初始化的问题,配合本地存储,所以很多使用vuex和本地缓存,总觉得有点矛盾,甚至有些场景用本地缓存之后就不需要vuex了。除非这个数据是需要响应式的。虽然不怎么用,简单了解一下核心原理还是需要的。
Vue.use(Vuex)
new Vuex.Store({})
所以暴露出去两个方法,install(vue.use会调用install)和Store方法,且vuex是个类或者构造函数:
let Vue;
export class Store {
constructor(options){}}
export const install = (_Vue) =>{
Vue = _Vue;
applyMixin(Vue);
}
看vuex源码,调用了applyMixin方法,然后执行Vue.mixin({ beforeCreate: vuexInit });通过mixin方法获取实例。所以执行vuexInit的时候就能通过this获取实例是否有store属性(new Vue的时候把store传入),有就给vue实例添加$store:
function vuexInit () {
var options = this.$options;
if (options.store) {
this.$store = typeof options.store === 'function'
? options.store()
: options.store;
} else if (options.parent && options.parent.$store) {
this.$store = options.parent.$store;
}
}
this.$store = options.parent.$store;主要是给组件加$store,当前组件的this上面没有,父组件有,就把父组件的给当前组件也添加$store。
最核心的部分就是通过产生一个单独的vue实例实现vuex的响应式:
this._vm = new Vue({
data:{
$$state:state,
}
});
源码是store._vm,代码里面搜索new Vue就能看见。官网也有文档:
以 _ 或 开 头 的 p r o p e r t y 不 会 被 V u e 实 例 代 理 , 因 为 它 们 可 能 和 V u e 内 置 的 p r o p e r t y 、 A P I 方 法 冲 突 。 你 可 以 使 用 例 如 v m . 开头的 property 不会被 Vue 实例代理,因为它们可能和 Vue 内置的 property、API 方法冲突。你可以使用例如 vm. 开头的property 不会被Vue实例代理,因为它们可能和Vue内置的property、API方法冲突。你可以使用例如 vm.data._property 的方式访问这些 property(官网 学习/api/data里面有介绍)。但其实我不明白为什么要两个$。
实现getter、mutations、actions就比较简单了:
this.mutations = {};
forEachValue(options.mutations, (fn, key) => {
this.mutations[key] = (payload) => fn.call(this, this.state, payload)
});
差不多就是发布订阅,把所有的方法都放到一个对象里面,只是getter还加了computed做缓存。
然后我们调用commit的时候调用mutations:
commit = (type, payload) => {
this.mutations[type](payload);
}
actions也差不多。
今天主要是知道vuex是通过mixin判断vue实例是否有store,然后挂载$store,通过单独创建一个vue实例实现响应式,mutations和actions用发布订阅的方法实现。至于模块就不说了,看了有些复杂。
辅助函数也还好,就是返回一个函数,然后函数里面调用this.$store.emit:
const mapMutations = (mutationList) => {
let res = {};
for (let i = 0; i < mutationList.length; i++) {
let name = mutationList[i]
res[name] = function(payload){
this.$store.commit(name,payload);
}
}
return res
}
这跟函数切片编程一样,这边只是简写了。
其实突然发现,最近分享源码的都只能自己看懂,别人应该都看不懂,只是里面有一些可以稍微提取一下,比如通过单独创建一个vue实例实现响应式这样的。
文章浏览阅读2.7k次,点赞13次,收藏97次。0.工厂制作PCB线路板流程1.PCB的结构铜层阻焊丝印本质(PCB画电路板到底在画什么)基础工艺指标2.PCB图中的元素元素布局布线叠层设计3.PCB的设计依据原理图原理图元件库4.PCB的设计流程——总结_pcb端子设计基础知识
文章浏览阅读4.5k次,点赞5次,收藏19次。Python读取Excel内容;将读取的数据转换为list类型便于切片处理;列表的操作方法;pandas处理DataFrame类型数据_pandas excel list
文章浏览阅读4.6k次。在分析服务器运行情况和业务数据时,nginx日志是非常可靠的数据来源,而掌握常用的nginx日志分析命令的应用技巧则有着事半功倍的作用,可以快速进行定位和统计。下面是自己在分析nginx日志时常用命令的一些总结。1.利用grep ,wc命令统计某个请求或字符串出现的次数比如我要统计GET /task/showContent接口在某天的调用次数,则可以使用如下命令: cat _nginx的日志分析
文章浏览阅读5.4w次,点赞64次,收藏262次。使用Echarts绘制中国地图,其中地图点信息由JSON文件编写,前端html直接从JSON文件中读取地区数据,渲染到前端即可。详细介绍用到的各个功能!代码直接复制运行即可!_echarts中国地图
文章浏览阅读343次,点赞9次,收藏10次。使用函数tolist()之后数据发生变化,从小数点后4位变成小数点后16位,如何才能让数据不变化?list:包含3608个[128,100]的张量。使用for循环将张量都转化成二维数组列表。
文章浏览阅读5.9k次。提示信息被遮盖解决方法 可以给form-item加一个特定的class,不影响其他的提示框,然后设定width,可以把所有内容显示。代码vue的template代码<el-form-item label="用户微信" prop="userWeChat" class="weixinError"> <el-input v-model="userInfo.userWeChat" maxlength="20"></el_el-form-item_error文字过长
文章浏览阅读2k次。很多小伙伴都遇到过win7系统因0xc0000005错误导致应用程序无法正常启动的困惑吧,一些朋友看过网上零散的win7系统因0xc0000005错误导致应用程序无法正常启动的处理方法,并没有完完全全明白win7系统因0xc0000005错误导致应用程序无法正常启动是如何解决的,今天小编准备了简单的解决办法,只需要按照1、右键点击要运行的软件或游戏,在右键菜单中选择“兼容性疑难解答”; 2、让系..._mysql 0xc0000005
文章浏览阅读492次。unix环境高级编程笔记_标准io创建空头文件
文章浏览阅读1.3k次。环境:ubuntu 16.04在执行apt-get update时直接报错了,错误信息如下:从返回的错误信息可以看出,问题出在“appstreamcli”上。通过以下命令可以解决:sudo apt install appstream/xenial-backportssudo appstreamcli refresh –force亲测可行。..._sudo apt-get update error in appstreamcli
文章浏览阅读9.5k次,点赞3次,收藏20次。很多时候我们需要把代码发给别人,而运行的代码可能包含路径。例如,你在你的电脑上需要加载一个mat文件,你的代码中包含了这个mat文件的具体的路径。例如,load('C:\Users\ncf\Desktop\计算机视觉大作业\program\xixi.mat'),当你把这个代码文件夹压缩发给别人时,别人一运行就会报错,这时我们需要自动识别,mat文件的路径。mfilename函数可以返回当前..._matlab里面打开文件找不到main
文章浏览阅读22次。Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。2. 前端:L ayui+css+javascript+jQuery+ElemenUI+highcharts。SSM + mybatis + Maven + JSP 等等组成,B/S模式 + Maven管理等等。2. 使用IDEA/Eclipse/MyEclipse导入项目,修改配置,运行项目;
文章浏览阅读733次,点赞3次,收藏8次。Windows命令行下载文件的方法_windows 命令提示符下载网页文件命令