vue3:语法糖内的defineProps及defineEmits、defineExpose

defineProps

获取组件传值

<template>
  <h1>{{ msg }}h1>
  <div @click="clickThis">1111div>
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.vuediv>
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,defineProps,defineEmits,defineExpose)