首页 > 其他分享 >为什么要使用computed而不是data获取vuex中的state

为什么要使用computed而不是data获取vuex中的state

时间:2023-02-06 17:01:07浏览次数:39  
标签:count computed vuex state data store


最近在学习vuex时,照着官网最基本的 Vuex 记数应用示例敲的时候遇到了这样一个问题
想实现的效果:
[img]http://dl2.iteye.com/upload/attachment/0130/7904/05459391-8e5f-3828-afcd-658d9c388024.png[/img]
点击加号、减号实现数字增减
vuex设置:

Vue.use(Vuex);
//这里直接把vuex写入vue的原型链,实际上还有更加规范的写法,这里只是方便演示
Vue.prototype.$store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment: state => state.count++,
decrement: state => state.count--
}
});


vue组件:


<template>
<div>
<div>
{{count}}
</div>
<div>
<button v-on:click="add()">+</button>
<button v-on:click="reduce()">-</button>
</div>
</div>
</template>

<script type="text/javascript">
export default {
data(){
return {
count: this.$store.state.count
}
},
methods: {
add(){
this.$store.commit('increment');
console.log(this.count);
},
reduce(){
this.$store.commit('decrement');
console.log(this.count);
}
}
}
</script>


发现点击按钮页面上的数字并没有发生变化,最后参考官网示例发现应该这样在vue组件中获取vuex的state


<script type="text/javascript">
//其余部分和上一段代码一样
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
add(){
this.$store.commit('increment');
console.log(this.count);
},
reduce(){
this.$store.commit('decrement');
console.log(this.count);
}
}
}
</script>


那为什么要使用computed而不是data获取vuex中的state呢?


这是因为data 中的内容只会在 created 钩子触发前初始化一次,具体来说就是data中设置count: this.$store.state.count 则count的值是created钩子执行前this.$store.state.count的值,赋值之后属性的值就是纯粹的字面量,之后this.$store.state.count 如何变化均影响不到count的取值。就如同下面这段代码


var b = 1;
var a = b;
b = 2;


执行之后a的值依然是1,如此一来我们通过this.$store.commit() 方法来改变state状态就不会改变count的取值。而且一般我们使用data时也是直接将data赋予一个新值,vue的双向绑定机制会更新视图。


而 computed 则是通过【依赖追踪】实现的,计算属性在它的相关依赖发生改变时会重新求值(可参考vue官方教程对计算属性的描述),所以你可以使用 computed 去引用 Vuex 状态变量,从而使得依赖追踪生效


标签:count,computed,vuex,state,data,store
From: https://blog.51cto.com/u_15955464/6039838

相关文章

  • vuex,state,mutations,actios,getters,mdoules
    vuex是做什么的vue组件之间进行数据传递还是比较麻烦的,所以我们使用一个vuex仓库,统一管理数据和状态通俗来说vuex就是专门为vue应用程序开发的状态管理模式,采用了集中式......
  • <statement>or DELIMITER expected, got ‘id‘)的原因及解决办法
    Ideamybatis的xml报错可能的原因:在idea里,sql节点有语言注入有检测,你在sql节点写sql语句都不会报错,那么判断检测是根据sql的语言来进行相关判断的,而我们通常在sql节点内......
  • Converting Boolean-Logic Decision Trees to Finite State Machines 如何将布尔表达
    ConvertingBoolean-LogicDecisionTreestoFiniteStateMachinesforsimpler,high-performancedetectionofcybersecurityevents将布尔逻辑决策树转换......
  • pytorch net.state_dict问题
    pytorch使用中发现net.state_dict只保存所有module层的偏置与权重值,不保存零散变量值。验证代码#encoding:utf-8importtorchimporttorch.nnasnnimporttorch.op......
  • 调度器42—p->state的取值与含义
    一、TASK_DEAD1.赋值调用路径do_exit//的最后调用do_task_dead//sched/core.cset_special_state(TASK_DEAD);WRITE_ONCE(current->__sta......
  • Qml类型:State 状态
    Qml类型:State状态1、定义一个状态2、状态名称3、绑定目标4、触发状态改变我们来写一个状态转换器。1、定义一个状态一个状态的定义可以声明为states:State{...},也......
  • VUEX 使用学习六 : modules
    转载请注明出处:当Store中存放了非常多非常大的共享数据对象时,应用会变的非常的复杂,Store对象也会非常臃肿,所以Vuex提供了一个Module模块来分隔Store。通过对Vuex中的S......
  • VUEX 使用学习五 : getter
    转载请注明出处:Getter对Store中的数据进行加工处理形成新的数据。他不会修改state中的原始数据,起到的是包装数据的作用;有时我们需要从store中的state中派生......
  • 深入理解flutter中的state
    flutter中如果使用widget,那么无可避免的就要接触到StatelessWidget和StatefulWidget这两样东西,这两样东西表示什么呢?首先我们需要明白flutter中的编程范式,flutter......
  • Vue3 封装扩展并简化Vuex在组件中的调用
    如果你在项目中使用了vuex模块化,并且在项目中使用actions中函数调用频率高,推荐了解一下这种方式。比如下面两种方式调用,第一个是直接传参设置,第二个是添加了异步ajax......