vue2父传子与子传父 (附$attrs与$listeners)

772 阅读1分钟

一. 父传子

本文以input双向数据绑定为例

  • 首先在components中创建一个MyInput组件,组件中放一个input输入框

image.png

  • 父组件在页面引入注册后,以标签的形式在页面中使用

image.png

  • 父组件在标签上定义自定义属性,用于给子组件传递数据
  • :自定义属性名="变量名"
  • 子组件可传递变量与固定值,固定值不带引号即可,此处不做演示
<MyInput :msg="9" :data="str"></MyInput>

父组件通过props进行接收 ( 数组版与对象版 )

export default {
    name: 'MyInput',
    //数组接收 通过this.msg || this.data接收传递的值
    // props:['msg','data'],
    //对象接收  type为数据类型,defaulf为默认值,通过this.msg || this.data接收传递的值
    props: {
        msg: {
            type: Number,
            default: 0
        },
        data: {
            type: String,
            default: ''
        }
    },
    data() {
        return {
            value: ''
        };
    },
    methods: {},
    created() {
        console.log(this.msg);
        console.log(this.data)
    },
    computed: {},
    components: {},
};
</script>

父传子接收进阶版

  • 在子组件上通过v-bind="$attrs"接收父组件传递的值
  • 通过this.$attrs可以获取所有的值,数据类型为对象 (具体见下图)

image.png

二. 子传父

  • 子组件定义事件,通过this,$emit('事件名','要传递的值')进行传值

image.png 父组件在标签上对应传递的事件名定义事件,以默认参数(此处以e为形参,形参名字随意)接收传递的值

image.png

子传父进阶版

  • 子组件定义 v-on="$listeners"

image.png

  • 父组件可直接接收

image.png