美文网首页
组件props引用类型的字面量传值触发computed和watc

组件props引用类型的字面量传值触发computed和watc

作者: 陆志均 | 来源:发表于2018-01-16 14:39 被阅读72次

2018.1.17补充说明

纠结的问题终于被解决了

引起这个坑的原因是父组件,父组件foo的数据更新后,模板里调用了foo,导致子组件虚拟节点被 re-render

坑终于被填上了。

之前的内容

标题很绕,我也不知道我在说什么

先来看两个父子组件:

父组件

<template>
  <child-component :foo.sync="foo" :bar="[]"/>
</template>
data () {
  return {
    foo: []
  }
}

子组件

<template>
  <Button @click="$emit('update:foo', [])">emit</Button>
</template>
props: {
  foo: Array,
  bar: Array
}
  • 子组件接受foobar两个props,类型都是Array(引用类型)
  • 子组件通过点击按钮向父组件emit事件,给父组件的foo重新赋值一个空数组
  • 父组件bar是通过字面量传值

于是乎,坑爹的地方来了

此时,我们在子组件里watch bar的变化

watch: {
  bar (val) {
    console.log(val)
  }
}

bar是父组件通过字面量传入进来的,理论上不会有任何变化,但每点击一次,都会触发watch,控制台会打印bar的值,每次都是一样的空数组

我们修改下父组件,不通过字面量,而是data里显式声明了bar

<template>
  <child-component :foo.sync="foo" :bar="bar"/>
</template>
data () {
  return {
    foo: [],
    bar: []
  }
}

这时watch没有被触发(计算属性同理)

总结:

  • 组件props尽量用值类型
  • 引用类型不要用字面量
  • props其它的引用类型的改变会触发字面量prop的计算和watch(foo改变了但却触发了bar的重新计算)
  • 这算不算是vue的底层bug?

相关文章

  • 组件props引用类型的字面量传值触发computed和watc

    2018.1.17补充说明 纠结的问题终于被解决了 引起这个坑的原因是父组件,父组件foo的数据更新后,模板里调用...

  • Vue3——组件传值 & v-model & 异步组件 & te

    一、父子组件传值 父组件通过props向子组件传值,子组件通过emit触发自定义事件传递新值给父组件。props:...

  • vue传值(Ⅰ)---父子组件传值

    父子组件传值 (Parent/Child) 1、 props/$emit (1)父传子,props 在父组件中引用...

  • react 父子组件之间的方法调用

    父子组件之间传值通过props、触发事件调用props的方法对父组件的state进行修改; 类似于vue中子组件通...

  • 组件间传值

    1. 父子组件传值 接收父组件传值props:['name','age']子传父触发一个自定义事件this.$em...

  • 2018-09-05

    组件传值问题 父组件给子组件传值应该使用props。子组件要给父组件传值,需要调用父组件传递的方法。props传值...

  • 父组件通过props传Array/Object类型

    当在父组件通过props传Array/Object类型值给子组件的时候,如果子组件的props接收default为...

  • vue组件传值

    父组件向子组件传值 props ①父组件内设置要传的数据『data(){ id: value}』 ②在父组件中引用...

  • Vue--基本使用

    基本使用,组件使用 1、指令、插值2、computed和watchcomputed有缓存watch不能监听引用类型...

  • vue-props(1)

    props 父组件给子组件传值 父组件:在组件元素中配置要传递的属性和值 子组件,配置props数据,接收父组件传...

网友评论

      本文标题:组件props引用类型的字面量传值触发computed和watc

      本文链接:https://www.haomeiwen.com/subject/zrmsoxtx.html