首页 > 其他分享 >vue3中的defineProps,defineEmits,defineExpose的使用详解

vue3中的defineProps,defineEmits,defineExpose的使用详解

时间:2024-10-14 17:02:23浏览次数:7  
标签:const defineExpose 组件 vue3 defineEmits 默认值 声明 defineProps

defineProps 和 defineEmits 都是只能在 <script setup> 中使用的编译器宏。他们不需要导入,且会随着 <script setup> 的处理过程一同被编译掉。

defineProps 接收与 props 选项相同的值,defineEmits 接收与 emits 选项相同的值,它们具备完整的类型推断并且在 script setup 中是直接可用的。

defineProps 或 defineEmits 要么使用运行时声明,要么使用类型声明。同时使用两种声明方式会导致编译报错

1、defineProps的用法:适用于父组件向子组件传递属性

  基于类型的声明方式:

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

  运行时声明方式:

    const props = defineProps({
      result: Number,
      name: {

        type: String,

        default: 'XXX' // 设置默认值

      }
    })

  设置带默认的声明方式:主要有两种方式:

    一种使用运行声明直接设置默认值,如果有复杂数据,就用函数形式返回数据,见下图:  

   另外一种是:在 3.5 及以上版本中,当使用响应式 Props 解构时,可以自然地声明默认值。但在 3.4 及以下版本中,默认情况下并未启用响应式 Props 解构。为了用基于类型声明的方式声明 props 的默认值,需要使用 withDefaults 编译器宏:,见下图:

 请注意,在使用 withDefaults 时,默认值为可变引用类型 (如数组或对象) 应该封装在函数中,以避免意外修改和外部副作用。这样可以确保每个组件实例都获得默认值的自己的副本。在使用默认值解构时,这不是必要的。

2、defineEmits的用法:适用于父组件向子组件传递方法

  基于类型的声明方式:

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

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

  运行时声明方式:

  const emits = defineEmits(['change','update'])

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

  子组件:

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

  父组件:

    <!-- 传入Props和Emits -->
    <Detail ref="detail"></Detail>

--------------------------------------------------------------------

    // 必须跟组件ref保持一致
    const detail = ref()

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

标签:const,defineExpose,组件,vue3,defineEmits,默认值,声明,defineProps
From: https://www.cnblogs.com/yihuanhuan/p/18464557

相关文章

  • vue3 antvX6的使用源码
    npminstall--save@antv/x6<template><divclass="dashboard-container"><p>选择节点</p><button@click="save">保存</button><divclass="antvBox"><divclass="m......
  • vue3 做个点击拖拽的的按钮
    //视图层<divclass="regularAI"ref="draggableDiv":style="{top:`${position.y}px`,left:`${position.x}px`}"> <span@mousedown="startDrag">{{isDragging?'拖拽中':'点击拖拽'}}</span&......
  • adminPage-vue3依赖 v1.2.0新增组件 DetailsModule说明文档
    adminPage-vue3依赖v1.2.0新增组件DetailsModule说明文档引入思路介绍DetailsModuleAPI汇总属性插槽自定义对象config(array<object\>/object类型)config.list(array<object\>类型)使用基础使用范例config-titleconfig-moduleKeyconfig-listconfig-list-slotNamec......
  • 看不懂来打我!让性能提升56%的Vue3.5响应式重构
    前言在Vue3.5版本中最大的改动就是响应式重构,重构后性能竟然炸裂的提升了56%。之所以重构后的响应式性能提升幅度有这么大,主要还是归功于:双向链表和版本计数。这篇文章我们来讲讲使用双向链表后,Vue内部是如何实现依赖收集和依赖触发的。搞懂了这个之后你就能掌握Vue3.5重构后的响......
  • vue-cropper图片裁剪(vue2与vue3)
    在项目中,前端开发经常会遇到有图片上传的需求,而别人的组件大多都满足不了当下产品的需求,这是往往我们得去依靠组件自己自定义一个项目通用的裁剪组件一、vue-cropper安装依赖:vue2:npminstallvue-cropper 或 yarnaddvue-croppervue3:npminstallvue-cropper@next 或......
  • [vue3 JavaScript CSS]实现电商网站商品预览,图片放大镜功能
    da效果预览:当鼠标浮在图片上时,灰色小框跟随鼠标运动。右侧大图显示。灰色框不会跑出图片,鼠标移动,右侧大图相应跟随移动。实现思路在实现前,我们想梳理一下我们要实现什么功能灰色框跟随鼠标移动,注意处理边界情况当鼠标进入时右侧大图出现,鼠标移出时右侧大图消失鼠标向左......
  • vue3中监视 Reactive对象中的属性
      watch 的第一个参数可以是不同形式的“数据源”:它可以是一个ref(包括计算属性)、一个响应式对象、一个 getter函数、或多个数据源组成的数组一、框架:<template><divclass="divBox"><h2>姓名:{{person.name}}</h2><h2>年龄:{{person.age}}</h2>......
  • vue3 路由文件配置
    //通过模板路由配置import{createRouter,createWebHistory}from"vue-router";//创建路由器constroutes=[//登录路由{path:"/login",component:()=>import("../views/login/index.vue"),name:"......
  • 利用Vue3的axios+Python的flask实现前后端交互功能
    1功能实现1.1功能在网页中输入两个数字后,点击计算按钮在线计算(注意不是在浏览器端)获得两数之和。1.2思路前端使用vue3的axios向服务器发送post请求,利用flask框架使python服务器返回计算后的数值,赋给前端的变量,最终在浏览器上显示。2前端部分:2.1html<div><inputv-mod......
  • Vue3组件通讯方式
    1.父子传参个人概括:《  其实vue3的很多方法都跟vue2相似也几乎可以说是一样只不过调用方式不同,父子传参,之前父传子子接受用的是props现在呢换成了defineProps,跟props用法差不多里面一个数据和它的类型然后就调用就可以了》importZifrom'./views/Index.vue'  ......