美文网首页vuealready
Vue3 组件传值 props 和 attrs 区别

Vue3 组件传值 props 和 attrs 区别

作者: Yandhi233 | 来源:发表于2021-12-13 21:47 被阅读0次

区别如下:

1、props 要先声明才能取值,attrs 不用先声明

2、props 声明过的属性,attrs 里不会再出现

3、props 不包含事件,attrs 包含

4、props 支持 string 以外的类型,attrs 只有 string 类型

在父组件中我传了三个事件一个属性,在子组件中分别将 props 和 attrs 的值打印出来:

//  父组件
<template>
<Button @click="onClick" @mouseover="onClick" @focus="onClick" size="small">
  hi
</Button>
</template>

<script lang="ts">
import Button from '../lib/Button.vue'
export default {
  components: { Button },
  setup() {
    const onClick = () => {
      console.log('hi')
    }
    return {
      onClick,
    }
  },
}
</script>
//  子组件
<template>
<div>
  <button>
    <slot />
  </button>
</div>
</template>

<script lang="ts">
export default {
  setup(props, context) {
    console.log('props:', {
      ...props,
    })
    console.log('context.attrs:', {
      ...context.attrs,
    })
  },
}
</script>

结果显示 props 是一个空对象,而 attrs 中包含了所有父组件传递的方法和属性


//  子组件中声明 props 
<template>
<div>
  <button>
    <slot />
  </button>
</div>
</template>

<script lang="ts">
export default {
  props: {
    size: String,
  },
  setup(props, context) {
    console.log('props:', {
      ...props,
    })
    console.log('context.attrs:', {
      ...context.attrs,
    })
  },
}
</script>

将 size 属性在 props 中进行声明,再执行打印,果然 size 属性出现在了 props 对象中,而 attrs 中这次却没有再体现:



接下来我们在父组件中增加一个值为 Boolean 的属性

//  父组件中增加一个值为 Boolean 的属性
<template>
<Button @click="onClick" @mouseover="onClick" @focus="onClick" size="small" disabled>
  你好
</Button>
</template>

<script lang="ts">
import Button from '../lib/Button.vue'
export default {
  components: {
    Button,
  },
  setup() {
    const onClick = () => {
      console.log('hi')
    }
    return {
      onClick,
    }
  },
}
</script>

看到出现在 attrs 中的 disabled 是一个 值为空字符串的属性:


我们在 props 中声明 disabled 为 Boolean 类型:

//  子组件 props 中声明 disabled 为 Boolean
<template>
<div>
  <button>
    <slot />
  </button>
</div>
</template>

<script lang="ts">
export default {
  props: {
    size: String,
    disabled: Boolean,
  },
  setup(props, context) {
    console.log('props:', {
      ...props,
    })
    console.log('context.attrs:', {
      ...context.attrs,
    })
  },
}
</script>

重新打印结果:

相关文章

  • Vue3组件传值之props与attrs的区别

    $attrs 属性可以看做 props 的加强版,用来简化 vue 组件传值先说区别: props 要先声明才能取...

  • Vue3 组件传值 props 和 attrs 区别

    区别如下: 1、props 要先声明才能取值,attrs 不用先声明 2、props 声明过的属性,attrs 里...

  • (VUE3) 四、组件传值(父子组件传值 & 祖孙组件传值 &v

    1.父子组件传值 vue2中的父子组件传值:父组件: 子组件: vue3中的父子组件传值: 还是用props接收父...

  • 前端VUE3,JQ,uniapp,综合

    vue3 + ts 子组件更新props 子组件可以直接修改父组件传进来的值子组件定义事件名称update:事件名...

  • vm.$attts的用法

    1、父组件向子组件传值,子组件没有在props中声明时的属性存在$attrs对象中。 2、在多层组件引用时,被引用...

  • 2018-09-05

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

  • vue组件通信

    通常父子组件通信都是用props和$emit进行传递,父组件通过props传值给子组件,子组件通过$emit传值给...

  • vue-props(1)

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

  • vue 组件间传值:父传子 / 子传父 / 子传子 / 祖传孙

    父传子(使用props) 子传父(使用$emit) 子传子(组件传组件,使用$on) 祖传孙(attrs 与 li...

  • Vue CLI——组件间传值

    一、父子组件传值 1、父传子 (1)props 父组件向子组件传值,可以通过绑定属性传值;子组件通过props接收...

网友评论

    本文标题:Vue3 组件传值 props 和 attrs 区别

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