当前位置: 首页 > 知识库问答 >
问题:

vue.js - vue3中computed的如下使用方式是否有不妥?

闻人高卓
2023-12-26

使用的 pinia
按官方的说法,getter相当于computed

那么我这样用:

const curr_data = computed(() => {    return store[`curr_${props.name}_data`].children})

是不是嵌套computed?
我这样写唯一的目的就是简化 template 中的代码,这样做有什么缺点吗?

谢谢。

共有2个答案

井斌斌
2023-12-26

这样做其实没有什么太大的意义,你这样写的目的是为了监听store的值,如果store的值发生变化则触发computed事件,其实getter中获取的值已经是一个响应式的了,你这里写的computed事件只是监听了一个store的数据变化并返回一个新的数据,内部没有做任何逻辑操作,那为何不直接使用getter呢

葛子昂
2023-12-26

首先,你提供的代码片段确实使用了嵌套的computed属性。computed属性在Vue中用于计算数据,其值是基于其依赖的数据进行计算的。

对于你的问题,这样做确实可以简化模板中的代码,因为你可以在模板中直接使用curr_data来代替原来可能复杂的引用。然而,这样做也存在一些潜在的问题和缺点:

  1. 性能问题:由于computed属性是响应式的,当其依赖的数据发生变化时,computed属性会重新计算。如果你的store[curr_${props.name}_data].children数据在多个地方或频繁地发生变化,那么你的curr_data computed属性也可能会被频繁地重新计算,这可能会导致性能问题。
  2. 可读性问题:虽然你的代码简化了模板,但使用了嵌套的computed属性可能会使代码更难阅读和理解。其他开发者可能需要花更多的时间来理解你的代码。
  3. 可维护性问题:如果以后需要修改curr_data的计算逻辑,你需要在多个地方进行修改,这可能会增加代码的维护成本。
  4. 可能的bug:如果你不小心改变了store[curr_${props.name}_data].children的值,但忘记了重新计算curr_data,可能会导致数据不一致的问题。

因此,虽然使用嵌套的computed属性可以达到代码简化的目的,但在实际使用时还是需要权衡这些潜在的问题。如果性能问题成为一个问题,或者代码的可读性和可维护性受到了影响,你可能需要考虑其他的方案,比如使用methods或者使用其他的状态管理方案等。

 类似资料:
  • 代码复现地址 上面的代码和我的另一个项目都可以正常运行; 但我现在的这个项目中这样使用就不行, console.log(value); 只会触发一次; 需要修改为这样才行: 这是为什么?是什么影响的? 版本都是 vue:3.3.4

  • 以上,我需要将my-component渲染进id为app的div内, 但是以上代码行不通,请问我该如何做?

  • 比如,我切换图片时,触发以下method: 这里自动切换到当前图片对象 最后在watch时使用到了computed后的对象,但是computed是在watch之后执行的,activeImage数据就不对,有没有什么办法解决?

  • 问题内容: 我有一个带有序列ID的postgres表。 插入通常发生在Web应用程序中。 我手动插入了两个新记录,将id设置为max(id)+1 **** 在这2次插入之后,当Web应用程序插入2条记录时,它会给出重复的键错误。 仅用于2条记录。之后,一切正常。 问题是-为什么我的手动插入没有增加序列号? 自动递增和串行是否不同? 我在这里想念什么?MySQL或任何其他SQL是否存在相同的问题?

  • 本文向大家介绍深入浅析Vue.js中 computed和methods不同机制,包括了深入浅析Vue.js中 computed和methods不同机制的使用技巧和注意事项,需要的朋友参考一下 在vue.js中,有methods和computed两种方式来动态当作方法来用的 1.首先最明显的不同 就是调用的时候,methods要加上() 2.我们可以使用 methods 来替代 computed,效

  • 为什么同样是对Props的类型声明,当组件缺少应有的props的时候,vue不会提示,但react会呢?请问是我哪里设置有误还是本身就是这样? Vue 父组件: 子组件: React 问题已解决。见 https://github.com/vuejs/core/issues/8524 vue3.3.4,切换vscode的volar插件为预发布版本(1.7.13)即可