概述

最近最近做项目的时候总会思考一些大的应用设计模式相关的问题,我把自己的思考记录下来,供以后开发时参考,相信对其他人也有用。

store里面响应数据变化

通常情况下,我们会把数据存在store里面,并且,有时我们也需要跟踪store里面的数据变化,并作出响应。例子如下:

export default {
computed: {
categories: state => state.categories.categories,
},
watch: {
categories() {
this.fetchCardData();
},
},
methods: {
fetchCardData() {
// 请求卡片数据
},
},
}

如上所示,当store里面的categories改变的时候,我们会自动调用api去请求数据

不响应store里面的数据变化

上面的例子里面,每次当categories改变的时候,fetchCardData方法都会被调用。有些时候,这并不是我们想要的,我们想要的是,当xxxx的时候,categories会改变,fetchCardData方法会跟着被调用;当xxxx的时候,categories会改变,fetchCardData方法又不会跟着被调用,怎么办呢?

方法是创造一个标记,但是如何优雅的创造标记呢?我有一个方法如下所示:

// store.js
const state = {
categories: [],
categoriesChanges: 0,
}; const actions = {
updateCategories({ commit }, value) {
// 如果带有shouldNotChange,则表示不要刷新页面
if (value.shouldNotChange) {
commit(types.UPDATE_CATEGORIES, value.data);
} else {
commit(types.UPDATE_CATEGORIES, value);
commit(types.UPDATE_CATEGORIES_CHANGES);
}
},
}; const mutations = {
[types.UPDATE_CATEGORIES](state, value) {
state.categories = value;
},
[types.UPDATE_CATEGORIES_CHANGES](state) {
state.categoriesChanges += 1;
},
}; // component.js
export default {
computed: {
categories: state => state.categories.categories,
categoriesChanges: state => state.categories.categoriesChanges,
},
watch: {
categoriesChanges() {
this.fetchCardData();
},
},
methods: {
fetchCardData() {
// 利用this.categories的部分数据来请求卡片数据
},
},
} // business.js
this.$store.dispatch('updateCategories', value); // 会自动调用fetchCardData方法 const payload = {
shouldNotChange: true,
data: [...value],
};
this.$store.dispatch('updateCategories', payload); // 不会自动调用fetchCardData方法

这样,我们发出同一个action,却能达到2种不同的效果,非常方便。

设计模式(2): 响应store中数据的变化的更多相关文章

  1. 黎活明8天快速掌握android视频教程--21_监听ContentProvider中数据的变化

    采用ContentProvider除了可以让其他应用访问当前的app的数据之外,还有可以实现当app的数据发送变化的时候,通知注册了数据变化通知的调用者 其他所有的代码都和第20讲的一样,不同的地方看 ...

  2. 25、vuex改变store中数据

    以登录为例: 1.安装vuex:npm install vuex --save 2.在main.js文件中引入: import store from '@/store/index.js'new Vue ...

  3. Nutch2.3分布执行过程中Mongodb中数据的变化

    inject $ nutch inject /opt/nutch/runtime/local/urls/ > db.stats() { "db" : "nutch& ...

  4. Vue刷新页面VueX中数据清空了,怎么重新获取?

    Vue刷新页面VueX数据清空了,怎么重新获取? 点击打开视频讲解更详细 在vue中刷新页面后,vuex中的数据就没有了,这时我们要想使用就要重新获取数据了, 怎么在刷新后重新获取数据呢??? 这时我 ...

  5. 使用vuex中的store存储数据

    Vuex是一个专门为Vue.js应用程序开发的状态管理模式,这个状态自管理应用包括三个模式 state 驱动应用的数据源 view 以声明方式将state映射到视图 actions 响应在view上的 ...

  6. Vue2手写源码---响应式数据的变化

    响应式数据变化 数据发生变化后,我们可以监听到这个数据的变化 (每一步后面的括号是表示在那个模块进行的操作) 手写简单的响应式数据的实现(对象属性劫持.深度属性劫持.数组函数劫持).模板转成 ast ...

  7. React-使用imutable.js来管理store中的数据

    reducer.js中store的数据是不能改变的,用原始的方法要手动的保证store不被修改,存在风险.imutable.js可以生成一个不可改变的对象,可以避免掉自己不小心修改掉store的情况. ...

  8. 解决刷新页面vuex store中数据丢失的问题

    **问题背景:**页面刷新后,vuex中的数据丢失.这是因为:js代码是运行在内存中的,代码运行时的所有变量.函数也都是保存在内存中的.进行刷新页面的操作,以前申请的内存被释放,重新加载脚本代码,变量 ...

  9. 解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题

    解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题 当我们改变ListBox的ItemsSource时,会发现这样一个问题:数据源变化时,虽然控件中的内容会跟着 ...

随机推荐

  1. Android中res下anim和animator文件夹区别与总结

    1.anim文件夹 anim文件夹下存放tween animation(补间动画)和frame animation(逐帧动画) 逐帧动画: ①在animation-list中使用item定义动画的全部 ...

  2. 最简洁地说明常用的git指令(1)

    前提条件,在github上面创建一个仓库,注册好git账号,下面开始 首先在项目文件夹下面,如果有安装git则邮件gitbash进入控制台.另一种方式是使用IDEA打开你要上传的工程,在里面的命令行下 ...

  3. Spring框架几种创建bean的方式

    Spring框架下,Bean的创建和装配非常的灵活,提供了三种主要的方式,并且相互见可以互相看见,也就是你可以随意地采用你喜欢且合适的方式创建Bean,而不用担心他们之间的兼容问题. 一.使用XML显 ...

  4. Mysql定时器定时删除表数据

    由于测试环境有张日志表没定时2分钟程序就狂插数据,导致不到1一个月时间,这张日志表就占用了6.7G的空间,但是日志刷新较快,有些日志就没什么作用,就写了个定时器,定期删除这张表的数据 首先先查看mys ...

  5. java课堂动手测试

    课堂实验3 一个Java类文件中真的只能有一个公有类吗? 经过测试,当含有两个public  类时会报错,不能执行,假如删除第二个public则可以正常生成,说明一个java文件只能有一个公有类. 课 ...

  6. Linux系统中的硬件问题如何排查?(3)

    Linux系统中的硬件问题如何排查?(3) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...

  7. MYSQL<四>

    -- ########## 01.ER关系 ########## -- ER关系(逻辑描述) -- A:E---Entity简写,实体,具有相同属性(特征)的对象归为同一实体 -- Attribute ...

  8. 好好理解一下python的函数和python的缩进

    缩进相当于其他语言的括号,括号中的语句才是一起执行的 这一个函数的功能应该是计算平均分 所以d这个dict应该是作为参数传进来的,而不是写到函数内部 正确的写法 d = { 'Adam': 95, ' ...

  9. 浅谈Vue中Slot以及slot-scope

    vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项使用频率.使用先后上的差别,这就有可能造成初次接触插槽的开发者容易产生“算了吧,回头再学 ...

  10. JUnit——单元测试步骤

    步骤: 1. New Package(一般命名为*.Test,测试类与开发类放在不同的包中)2. New JUnit Text Case(一般命名为*Test)3. 选择需要测试的方法 4. 可以下载 ...