`
iaiai
  • 浏览: 2180029 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多
最近在学习vuex时,照着官网最基本的 Vuex 记数应用示例敲的时候遇到了这样一个问题
想实现的效果:

点击加号、减号实现数字增减
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 状态变量,从而使得依赖追踪生效
  • 大小: 614 Bytes
分享到:
评论

相关推荐

    Vuex 在Vue 组件中获得Vuex 状态state的方法

    在Vue.js应用中,Vuex是一个强大的状态管理库,它遵循单一状态树原则,将所有应用层级的状态集中管理,提供了一种有序、可预测的方式来处理组件间的共享状态。Vuex的状态存储是响应式的,这意味着当状态改变时,依赖...

    详解vuex 中的 state 在组件中如何监听

    在使用Vue.js框架开发过程中,Vuex是一个不可或缺的状态管理库,用于在不同组件之间共享和管理状态(state)。然而,在组件中正确监听Vuex中的state变化,并作出相应处理,却是一个需要仔细处理的环节。 首先,理解...

    vuex提交state&&实时监听state数据的改变方法

    例如,在父页面中使用WebSocket发送数据,并在子页面中使用websocket_data这个mutation来更新状态,然后通过计算属性或watch来获取最新的状态信息。 总结来说,本文介绍了如何使用Vuex提交state和实时监听state数据...

    vuex直接赋值的三种方法总结

    首先需要明确的是,在Vue组件中直接读取Vuex中的状态,通常的做法是在模板中使用双大括号{{}}包裹表达式来直接访问状态,例如:{{ $store.state.num }}。但是这样的写法会使得模板中嵌入了太多与业务逻辑无关的代码...

    实现vuex与组件data之间的数据同步更新方式

    在Vue.js应用中,Vuex是一个集中管理状态的库,它允许我们在多个组件之间共享和同步数据。...在实际开发中,还需要注意遵循最佳实践,如使用`getters`来获取`state`中的数据,以保持Vuex的整洁和可维护性。

    vuex 实现getter值赋值给vue组件里的data示例

    在某些场景中,我们可能需要将Vuex中的getter获取到的值赋值给Vue组件的data属性,以便于组件内部使用。 首先,我们要了解什么是getter。在Vuex中,getter的作用类似于计算属性(computed properties)在Vue组件中...

    父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法

    解决父组件中Vuex方法更新state子组件不能及时更新并渲染的问题,我们可以使用传值的方法将父组件的状态值传递给子组件,然后在子组件中使用watch或computed属性来监听页面的变化,并获取最新的状态值。

    Vuex中的State使用介绍

    本文将详细探讨Vuex中的State使用方法以及相关的实现细节。 首先,Vuex使用单一状态树来管理应用的所有状态。这种设计模式使得状态的管理和调试变得简单明了,因为整个应用的状态都存储在一个对象中。例如,我们有...

    Vuex之理解state的用法实例

    在Vuex中,`state`是数据的源头,它类似于Vue组件中的`data`选项,但其作用范围更广,适用于整个应用。`state`存储的应用级别的共享数据是响应式的,这意味着当`state`中的数据发生变化时,所有依赖该数据的Vue组件...

    Vuex 使用 v-model 配合 state的方法

    在这个例子中,我们使用`mapState`将Vuex的`state`映射到组件的计算属性(computed properties)。然后,在`input`元素上,我们用`:value`绑定`name`计算属性,并监听`input`事件,当输入框的值发生变化时,调用`...

    vuex全家桶.pdf

    结合 Vuex,我们可以通过 getters 获取复选框的状态,然后在模板中使用 `:checked` 绑定。 总之,Vuex 作为 Vue.js 应用的状态管理工具,提供了一套完善的机制来组织和管理共享状态,使得大型应用的状态管理变得...

    解决VUEX的mapState/…mapState等取值问题

    `mapState`是用来简化从Vuex store中获取state值的过程。在示例中,原本需要在组件的`data`对象中逐个定义并初始化状态,如`showLoading0`到`showLoading9`,每个都需要通过`this.$store.getters.getStore....

    vuex全局变量的几种实现方式

    在Vue.js应用中,Vuex是一个非常重要的状态管理库,它提供了一种集中式的状态管理模式,使得组件之间共享和管理状态变得更为规范和便捷。在本文中,我们将深入探讨Vuex全局变量的几种实现方式,特别是在uni-app这个...

    vue.js中引入vuex储存接口数据及调用的详细流程

    5. **从store中获取数据**:当需要在组件中使用存储在Vuex中的数据时,可以使用计算属性(computed)或者mapState辅助函数来映射到局部计算属性中。 ```javascript // 使用mapState辅助函数 import { mapState }...

    vuex与组件联合使用的方法

    在 Vue 组件中,可以使用 `mapState`, `mapGetters`, `mapMutations` 和 `mapActions` 辅助函数,它们能将 Vuex 的 state、getters、mutations 和 actions 映射到组件的计算属性和方法中,简化代码并提高可读性。...

    vuex store登录

    如果登录状态需要在非Vue组件中使用,可以在`src`目录下创建一个`utils`文件夹,提供一个公共的API接口,如`auth.js`,包含登录和登出的方法,这些方法可以直接调用Vuex的actions。 8. **公共头部组件** 创建一个...

    写给新手同学的vuex快速上手指北小结

    如果你想在组件的 `data` 中引用 `state`,直接赋值给 `data` 的属性只会获取初始值,当 `state` 变化时不会自动更新。正确做法是将 `state` 放入 `computed`,这样 Vue 将会监听 `state` 的变化并自动更新视图: `...

    解决vuex数据异步造成初始化的时候没值报错问题

    首先,我们需要理解为什么会出现“Vuex数据异步造成初始化时没值报错”这个问题。通常,当我们尝试从Vuex store获取数据来渲染组件时,如果这些数据尚未从API请求中返回,Vue组件可能就已经进行了初次渲染。这会导致...

    vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作

    在这个教程中,我们将探讨如何使用Vue、Vuex和axios从后台获取数据并存储到Vuex中,以便在组件之间共享。 首先,为了在Vue项目中使用Vuex,我们需要安装它。在终端中,执行`npm install vuex --save-dev`来安装依赖...

Global site tag (gtag.js) - Google Analytics