Vue3中的props和emit

文章详细介绍了Vue3中两种父子组件通信的方式:通过props从父组件向子组件传递数据,以及使用事件从子组件向父组件传递数据。在props的使用中,提到了defineProps的数组和对象写法,以及如何保持响应式。对于子组件向父组件传递数据,文章展示了defineEmits的用法和事件触发的三种形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue3父子组件之间的相互通信

1.第一种写法:父组件向子组件传递数据

  有<script setup></script>进行父组件向子组件传值
  
  father组件
  <template>
   <son :count='count'></son>
  </template>
  <script setup>
      import {ref} from 'vue'
      import son from './son.vue'
      let count = ref(0)
  </script>
  
  son组件
  <template>
  <span>{{count}}</span>
  </template>
  <script setup>
      // 不导入直接使用defineProps直接提示错误
      import {defineProps,} from 'vue'
      // defineProps() 这个方法不能打印不然浏览器报错
         如果想打印看看是什么
         let props = defineProps(['count'])
         // 打印的是proxy响应式对象,因为defineProps()函数内部自动处理,返回回来是一个proxy响应式对象
         console.log(props) 
         
         如果只读可以不用存储在声明props变量,可以直接使用,如果需要写逻辑(并且传过来值是复杂数据类型)就需要保存到props中
         defineProps(['count']) //defineProps()函数已经接收父组件传递子组件数据内部处理好了直接在模板使用即可
      
         defineProps(['count'])这是数组写法(不常用)
      
        下面是对象写法
         defineProps({ // 数据不复杂可以这样使用
             count:Number
         })
      
         defineProps({ //常用 
             count:{
                 type:Number
             }
         })
      
      ----------------------------------------------------------------------
      注意
      如果声明一个props变量保存defineProps()函数进行使用的话
      let props = defineProps({
                  count:{
                      type:Number
                  }
      })
      
      // 不能使用解构,失去响应式,并且会提示报错信息
      let {count} = props
      // 不能使用赋值方式,失去响应式,并且提示错误信息
      let num = props.count
      
      可以使用toRef、toRefs解决上面两个问题具体看Vue官网API中的setup如果访问props
  </script>

2.第二种写法:父组件向子组件传递数据

     father组件
    <template>
      <son :count='count'/>
    </template>
    <script setup>
        import son from 'vue'
        import {ref} from 'vue'
        let count = ref(0)
    </script>
    
    son组件
    <template>
    <span>{{props.count}}</span>
    </template>
    <script>
      import {toRefs,toRef} from 'vue'
      export default{
          props:{
             count:{
                 type:Number
             }  
          }
      },
         setup(props){
          问题
          // 不能使用解构,失去响应式,并且会提示报错信息
           let {count} = props
         // 不能使用赋值方式,失去响应式,并且提示错误信息
           let num = props.count
           
           解决
           let { count } = toRefs(props) 
           console.log(count) // 结构出来是一个count的ref的响应式
    
           let count = toRef(props,'count') // 赋值出来是一个count的ref的响应式
           return {
             props,
           }
      }
    </script>
    ```

 4.事件传参(子组件传递父组件)

第一种写法:子组件向父组件传递参数

```vue
<script setup></script>写法

 father组件
<template>
  第一种写法
  <son @count='fn'/>
  第二种写法
  <son @count='count = $event'/>
  第三种写法
  <son @count='n = > count = n'/>
</template>
<script setup>
    import son from 'vue'
    import {ref} from 'vue'
    let count = ref(0)
    第一种写法
    let fn = val =>{
        count.value = val
    }
</script>

son组件
<template>
<el-button @click='btn'></el-button>
</template>
<script setup>
    import {defineEmits} from 'vue'
    // defineEmits必须写在最上面,不能写在方法中
    // defineEmits就是声明子组件传递父组件的事件
    let emit = defineEmits(['count'])
    let btn = () =>{
        emit('count',10) // 事件和值
    }
</script>

第二种写法:子组件向父组件传递数据

 father组件
<template>
  第一种写法
  <son @count='fn'/>
  第二种写法
  <son @count='count = $event'/>
  第三种写法
  <son @count='n = > count = n'/>
</template>
<script setup>
    import son from 'vue'
    import {ref} from 'vue'
    let count = ref(0)
    第一种写法
    let fn = val =>{
        count.value = val
    }
</script>

son组件
<template>
<el-button @click='btn'></el-button>
</template>
<script>
   export default{
      setup(props,content){
          function btn(){
              content.emit('count',10)
          }
      }
   }
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值