美文网首页
vue3.2中的defineProps、defineEmits、

vue3.2中的defineProps、defineEmits、

作者: 硅谷干货 | 来源:发表于2021-12-23 10:47 被阅读0次

    前言

    大家都听说了v3.2中的 script setup 语法糖,当开发中用到组件传值,事件传递的时候突然发现不知所措,不必恐慌,或查官网或记住以下3个api,大部分问题又迎刃而解了。

    defineProps

    获取组件传值

    <template>
      <h1>{{ msg }}</h1>
      <div @click="clickThis">1111</div>
    </template>
    
    <script setup lang="ts">
      defineProps<{ // 采用ts专有声明,无默认值
        msg: string,
        num?: number
      }>()
         // 采用ts专有声明,有默认值
        interface Props {
            msg?: string
            labels?: string[]
        }
        const props = withDefaults(defineProps<Props>(), {
            msg: 'hello',
            labels: () => ['one', 'two']
        })
        
      defineProps({ // 非ts专有声明
        msg: String,
        num: {
          type:Number,
          default: ''
        }
      })
    </script>
    
    <style scoped lang="less">
    </style>
    

    defineEmits

    子组件向父组件事件传递

    <template>
      <div @click="clickThis">点我</div>
    </template>
    
    <script setup lang="ts">
        /*ts专有*/
      const emit= defineEmits<{
        (e: 'click', num: number): void
      }>()
        /*非ts专有*/
      const emit= defineEmits(['click'])
      
      const clickThis = () => {
        emit('click',2)
      }
    </script>
    
    <style scoped lang="less">
    </style>
    

    defineExpose

    子组件暴露自己的属性

    <template>
      <div>子组件helloword.vue</div>
    </template>
    
    <script setup lang="ts">
    import { ref } from 'vue'
    const count = ref(123456)
    defineExpose({
      count
    })
    </script>
    
    <style scoped lang="less">
    </style>
    

    父组件获取属性

    <template>
      <div @click="helloClick">父组件</div>
      <helloword ref="hello"></helloword>
    </template>
    
    <script setup lang="ts">
    import { ref } from 'vue'
    import helloword from './components/HelloWorld.vue'
    const hello = ref(null)
    const helloClick = () => {
      console.log(hello.value.count) // 123456
    }
    </script>
    
    
    <style lang="less" scoped>
    </style>
    

    点赞加关注,永远不迷路

    相关文章

      网友评论

          本文标题:vue3.2中的defineProps、defineEmits、

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