Vuer们 ,关于Vue中computed定义的计算属性 返回 一个函数的疑惑?

code

<template>
  <div>computedPropA:{{ computedPropA("oup") }}</div>
  <el-button @click="handleClick">点击</el-button>

</template>

<script>
  //响应式属性
  const beforeData = ref("")

  //计算属性
  const computedPropA = computed(() => {
    console.log("执行计算函数,重新计算 计算属性:computedPropA")
    //直接返回一个函数对象
    return (data) => {
      
      return data + beforeData.value
    }
  })

  function handleClick() {
    //随机生成字符串
    let randomString = $utils.randomString(5);
    beforeData.value = randomString;
  }

  //监听计算属性
  watch(computedPropA,(newVal, oldVal) => {
    console.log("computedPropA watch ", newVal, oldVal)
  })
</script>

问题

在这个场景中, 计算属性返回了一个函数对象,在dom模板中 使用这个计算属性需要以函数的形式使用。
对于上面的场景有几个问题:

  1. 计算属性返回了函数对象,函数对象内部使用到了响应式数据,那么响应式数据更新的时候,该计算属性computed函数的参数getter函数是否会被重新执行?
  2. 响应式数据更新时 ,是否会引起dom中 重新执行 computedPropA("oup") 这个函数,重新计算。
  3. 响应式数据更新时 ,watch 计算属性是否 会执行。

实际测试结果:
1.计算属性只会被定义一次,computed函数的参数getter函数 不会随着beforeData的变化而重新执行。
这一点理解起来还凑合。简单理解computed的参数函数中没有使用到响应式属性,所以beforeData的变化不会引起 计算属性被重新计算。 但是深究起来 这个计算属性到底有没有依赖到响应式属性?

2.dom 会重新计算,这个不理解。

3.watch不会执行。原因见1.

各位vuer来帮忙解答一下,拜托了.

补充一个关联问题

在上面的问题中是 返回了一个函数,如果 computed 返回一个 普通的对象

const computedPropB = computed(() => {

  return {
    data: "abc",
  }
})

然后 通过 按钮点击的时候 给这个 computedPropB 随机增添属性名和属性值。

function handleClick() {
  //随机生成字符串
  let randomString = $utils.randomString(5);
  // beforeData.value = randomString;
  let propName = $utils.randomString(5);
  let propvalue = $utils.randomString(3);
   //随机新增属性
  computedPropB.value[propName] = propvalue
 
}

dom模板中 <div>computedPropB:{{ computedPropB }}</div> 是否会实时更新?

补充问题 新开了 一个问题:
https://segmentfault.com/q/1010000044258428

阅读 1.8k
2 个回答

1、不会被重新执行,vue的依赖收集过程,是看computed运行的过程中哪些响应式变量被使用到了,在这个例子中computed运行到return就结束了,收集不到下面的beforeData
2、整个template是一个watch,里面也是存在依赖收集的,无论是computedPropA还是其他响应式变量发生变化,这个watch都会重新运行,所以更新是整个组件的更新,只是里面有些内容没变化,所以运行到computedPropA位置处,会执行这个函数
3、见1,其实没有收集到beforeData这个依赖

同意楼上的,
computed 计算属性你输出函数干嘛?
不是输出 String | Number | Object | Boolean 这些的吗?

// 标准用法
computedPropA = computed(() => `A${beforeData.value}`)
computedPropB = computed(() => `${computedPropA}${beforeData.value}`)
// 这样写不香吗?
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题