首页 > 其他分享 >vue3父子组件传值defineProps、defineEmits、defineExpose

vue3父子组件传值defineProps、defineEmits、defineExpose

时间:2022-08-24 19:45:33浏览次数:71  
标签:const defineExpose exposeStr 组件 defineProps defineEmits ref 传值 result

一、前言

本文介绍父子组件传值defineProps、defineEmits、defineExpose

二、语法

在 script setup 中必须使用 defineProps 和 defineEmits API 来声明 props 和 emits ,它们具备完整的类型推断并且在 script setup 中是直接可用的

2.1、defineProps

适用于父组件向子组件传递属性

2.1.1、子组件

    // 定义Props
    const props = defineProps<{
        result: number,
        name: string
    }>()

2.1.2、父组件

<Detail name="结果" :result="1"></Detail>

2.2、带默认值的defineProps

适用于带默认值的Props,经测试不能与defineProps在同一组件同时定义。

2.2.1、子组件

    interface IProps {
        labels?: string[]
        result: number,
        name:string     
    }

    // 定义带默认值的Props
    const defaultProps = withDefaults(defineProps<IProps>(), {
        name: 'hello',
        result:0,
        labels: () => ['one', 'two']
    })

2.2.2、父组件

<!-- 没传的Props会使用子组件的默认值 -->
<Detail name="结果"></Detail>

2.3、defineEmits

适用于父组件向子组件传递方法

2.3.1、子组件

    <button @click="btnAdd">添加</button>
    <hr />
    <button @click="btnReset">重置</button>
    <hr />
    // 定义Emits
    const emits = defineEmits<{
        (e: 'add', id: number): void
        (e: 'reset', value: number): void
    }>()

    const btnAdd = () => {
        emits('add',2)
    }
    const btnReset = () => {
        emits("reset",0)
    }

2.3.2、父组件

<!-- 传入Emits -->
<Detail @add="add" @reset="reset"></Detail>
const result = ref<number>(0);

const add = (num:number)=>{
    result.value+=num
}

const reset = (num:number)=>{
    result.value = num
}

2.4、defineExpose

适用于子组件向父组件暴露方法和属性,父组件通过子组件示例进行调用。

2.4.1、子组件

    // 定义Expose
    const exposeStr = ref<string>("")
    defineExpose({
        exposeStr
    })

2.4.2、父组件:

 <!-- 传入Props和Emits -->
<Detail ref="detail"></Detail>
// 必须跟组件ref保持一致
const detail = ref()

setTimeout (() => {
    detail.value.exposeStr = "exposeStr"
},1000)

三、完整代码

3.1、子组件:detail.vue

<template>
  <div>
    <!-- {{props.name}} - {{props.result}} -->
    <hr />
    {{defaultProps.name}} - {{defaultProps.result}} - {{defaultProps.labels}}
    <hr />
    <button @click="btnAdd">添加</button>
    <hr />
    <button @click="btnReset">重置</button>
    <hr />
    {{exposeStr}}
  </div>
</template>

<script setup lang="ts">
    import { ref,defineProps ,defineEmits,defineExpose} from "vue"

    // 定义Props
    // const props = defineProps<{
    //     result: number,
    //     name: string
    // }>()

    interface IProps {
        labels?: string[]
        result: number,
        name:string     
    }

    // 定义带默认值的Props
    const defaultProps = withDefaults(defineProps<IProps>(), {
        name: 'hello',
        result:0,
        labels: () => ['one', 'two']
    })

    // 定义Emits
    const emits = defineEmits<{
        (e: 'add', id: number): void
        (e: 'reset', value: number): void
    }>()

    const btnAdd = () => {
        emits('add',2)
    }
    const btnReset = () => {
        emits("reset",0)
    }

    // 定义Expose
    const exposeStr = ref<string>("")
    defineExpose({
        exposeStr
    })

</script>
<style lang="scss" scoped></style>

3.2、父组件:main.vue

<template>
    <div>
        <!-- 传入Props和Emits -->
        <Detail ref="detail" name="结果" :result="result" @add="add" @reset="reset"></Detail>
    </div>
</template>

<script setup lang="ts">
import Detail from './detail.vue'

import {ref} from 'vue'

const result = ref<number>(0);

const add = (num:number)=>{
    result.value+=num
}

const reset = (num:number)=>{
    result.value = num
}

// 必须跟子组件ref名保持一致
const detail = ref()
setTimeout (() => {
    // 调用子组件属性并修改值
    detail.value.exposeStr = "exposeStr"
},1000)
</script>

标签:const,defineExpose,exposeStr,组件,defineProps,defineEmits,ref,传值,result
From: https://www.cnblogs.com/gaozejie/p/16621333.html

相关文章

  • 父子组件的传值
         父子组件的传值关系。刚开始开发页面时,我总是避开,很少写组件,原因是我总是理不清父子组件之间的传值关系,但渐渐地我发现我写的代码是非常冗余的,复用性也很差......
  • Vue中bus传值的理解
      说起bus你会想到什么?公交车?总线?在Vue中,对于任意两个组件之间的传值,就可以使用事件总线—bus。简单描述  在任意两个组件传值中,可以创建一个bus类负责事件派发、监听......
  • react中父子组件相互传值或方法
    这个老师写的不错,写在这样方便自己以后的查看。详见原创作者的链接地址:https://blog.csdn.net/sinat_36359516/article/details/120011005......
  • layui父子间传值
    原文地址:https://www.cnblogs.com/meiqiyuanzi/p/13476296.html子传父值1.html(父页面)<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><me......
  • Angular父子组件传值
    Angulr Core内置的@input @output方法可以完成父子组件之间的传值。配置子组件要使用 @Input() 装饰器,首先要导入 Input,然后用 @Input() 装饰该属性。后面用 @O......
  • JSP和servlet之间的相互传值
    1.从一个jsp页面跳转到另一个jsp页面时的参数传递(1)使用request对象获取客户端提交的信息login.jsp页面代码如下:点击查看代码<%@pagelanguage="java"import="java......
  • 前后端传值总结
    先讲下后端给前端传值,也就是controller跳到html页面时,向html传值的过程,一般2种方法。1.用Model//举个例子@RequestMapping("/toAgentInput")publicStringtoA......
  • Vue Router与Vue组件传值
    实战使用Vue.js创建一个具有2个页面的应用,要求:有两个页面:首页和二级页运行项目后默认进入首页,首页显示“跳转中”三秒后,自动跳转到二级页写两个页面,利用传值;改变......
  • vue 父子组件传值方法总结
    1、父组件向子组件传参:(1)父组件直接绑定在子组件的标签上,子组件通过props接收传递过来的参数。(2)父组件主动获取所有的参数和方法this.$refs.childrenName.(参数或方法名)......