vue3组件传值

vue3组件传值

父传子:

1.插槽传值

在子组件模板中加入

<slot></slot>

在父组件模板调用的子组件标签中

<my-com>直接输入文本内容</my-com>

2.props自定义属性传值

父组件在子组件里面定义一个动态绑定的属性 :data="fatherData"

<my-com :data="fatherData"></my-com>

然后在子组件父传子的自定义属性在props中声明

  props:['data'],//父传子的自定义属性在props中声明
      //然后在setup函数里面传入参数props,在里面即可以调用
console.log(props,props.data);

子传父:

emits自定义事件传值

首先在子组件模板里面emits属性里面声明传值的事件名称

 emits:["myEvent"],//子传父的自定义事件在emits中声明

然后在setup的第二个参数context里面调用事件emit发射

 context.emit("myEvent","子组件数据")//事件名,传入数据

然后在子组件模板里面加入事件

 <my-com  @my-event="getInfo"></my-com>

在父组件里面定义函数getInfo,函数的参数就是传入的数据

 setup() {
              function getInfo(data){
                console.log("父组件接收到了子组件数据",data);
              }
              return{
                  getInfo
              }
            }

附源码

<body>
    <script src='https://unpkg.com/vue@next'></script>
    <div id='myApp'>
        <my-com :data="fatherData" age="99" @my-event="getInfo">插槽数据</my-com>
    </div>
    <template id="mytemp">
        <!-- vue要求组件模板有且只有一个根标签,vue3可以有多个根标签 -->
        <div>这组件是子组件</div>
        <input type="text">
        <button>点我</button>
        <slot></slot>
        <b>{{data}}</b>
    </template>
    <script>
​
        var myCom = {
            template:'#mytemp',
            props:['data'],//父传子的自定义属性在props中声明
            emits:["myEvent"],//子传父的自定义事件在emits中声明
            setup(props,context) {
                // setup函数的第一个参数就是props字段传值
                console.log(props,props.data);
                // setup函数的第二个参数是context,上下文对象,并不是当前组件对象,其中attrs这个字段用于接收没有在props字段声明的属性(会有警告,但是不会报错)
                console.log(context,this);
                // context对象的emit字段用于子传父发射自定义事件,事件名可以用小驼峰,绑定时用小写
                context.emit("myEvent","子组件数据")
                return{
                    
                }
            }
        }
        var vm = { 
            components:{
                myCom 
            },
            setup() {
              const fatherData = Vue.ref('父组件数据')
              function getInfo(data){
                console.log("父组件接收到了子组件数据",data);
              }
              return{
                  fatherData,
                  getInfo
              }
            }
        } 
        Vue.createApp(vm).mount('#myApp')
​
        // 总结:
        // 1.vue3中组件使用字面量方式创建,不再使用Vue.commponent()
        // 2.vue3子组件创建后不能直接使用,需要在父组件的comments中注册才能使用
        // 3.vue3组件模板中可以有多个根标签
        // 4.vue3中父组件向子组件传值,插槽传值和props传值与v2基本一致
        // 5.vue3中子组件向父组件传值,用setup第二个参数调用emit发射自定义事件,事件名可以用小驼峰,在组件标签上绑定时用小写
        // 6.vue3子组件向父组件传值发射的自定义事件名需在emits字段中声明,否则有警告
    </script>
</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值