vue3 | defineExpose的使用

vue3,defineexpose,使用 · 浏览次数 : 40

小编点评

## 使用<script setup>的组件是默认私有的 <script setup>组件是默认私有的,也就是一个父组件无法访问到一个使用了<script setup> 的子组件中的任何东西,除非子组件在其中通过 defineExpose 宏显式暴露:<script setup>import { ref } from 'vue'const a = 1const b = ref(2)// 像 defineExpose 这样的编译器宏不需要导入defineExpose({ a, b})</script> **示例:** ```html ``` **解释:** 1. 父组件使用<script setup>定义了一个名为 `childeRef` 的 ref 对象。 2. 子组件使用<script setup>定义了 `inputRef` 的 ref 对象,并通过 `defineExpose` 宏显式暴露了它。 3. `handleClick` 方法在父组件中使用 `childeRef` 获取子组件实例上的 `inputRef` 对象,然后调用 `inputRef.focus()` 方法让输入框聚焦。

正文

简介

使用<script setup>的组件是默认关闭的————即通过模板引用或者$parent链获取到的组件的公开实例,不会暴露在任何在<script setup>中声明的绑定

换句话说,如果一个子组件使用的是选项式 API 或没有使用 <script setup>,被引用的组件实例和该子组件的 this 完全一致,这意味着父组件对子组件的每一个属性和方法都有完全的访问权。

但是如果使用了 <script setup> 的组件,这种组件是默认私有的,也就是一个父组件无法访问到一个使用了 <script setup> 的子组件中的任何东西,除非子组件在其中通过 defineExpose 宏显式暴露:

<script setup>
import { ref } from 'vue'

const a = 1
const b = ref(2)

// 像 defineExpose 这样的编译器宏不需要导入
defineExpose({
  a,
  b
})
</script>

举个栗子

父组件获取子组件的实例,去触发子组件实例身上的方法。

defineExpose-demo.gif

父组件

<template>
<div class="p-20 pb-0 mb-4">
  <div>父组件</div>
  <button class="mt-4" @click="handleClick">点我聚焦</button>
</div>
<Child ref="childeRef"></Child>
</template>
  
<script setup lang="ts">
import { ref, provide, onMounted } from "vue";
import Child from "./Child.vue";

const childeRef = ref<HTMLInputElement | null>(null);

const handleClick = () => {
  childeRef.value?.inputRef?.focus();
};
</script>

子组件

<template>
  <hr />
  <div class="p-20 pt-4">
    <div>子组件</div>
    <input
      ref="inputRef"
      placeholder="请输入哈哈哈哈"
      class="border-1 mt-4"
    /><br />
  </div>
</template>

<script setup lang="ts">
import { ref } from "vue";

const inputRef = ref<HTMLInputElement | null>(null);

defineExpose({
  inputRef,
});
</script>

参考文档:

与vue3 | defineExpose的使用相似的内容:

vue3 | defineExpose的使用

简介 使用

vue3 | isRef、unref、toRef、toRefs

isRef 检查某个值是否是ref。是返回true,否则返回false。 const num = ref(10); const num1 = 20; const num2 = reactive({ data: 30 }); console.log(isRef(num)); //true consol

vue3 | slots

一、什么是插槽 插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签,父组件填充的内容称为插槽内容。 子组件不提供插槽时,父组件填充失效 父组件无填充

vue3 | shallowReactive 、shallowRef、triggerRef

shallowReactive 使用 reactive 声明的变量为递归监听,使用 shallowReactive 声明的变量为非递归监听(通俗的讲就是 reactive 创建的对象将会被 vue 内部进行递归监听,可以监听到对象中的对象是否发生了改变从而更新视图,而 shallowReactive

vue3 | readonly、shallowReadonly

readonly 接受一个对象(不管是响应式还是普通的)或者是一个ref,返回的是一个原值的只读代理。 {{ data }}<

vue3 | mitt的基本使用

# 一、安装 npm安装 ``` npm i mitt ``` pnpm安装 ``` pnpm i mitt ``` yarn安装 ``` yarn add mitt ``` # 二、使用 ## (一)、当前组件内使用 ```javascript import mitt from 'mitt' //

uniapp+vue3聊天室|uni-app+vite4+uv-ui跨端仿微信app聊天语音/朋友圈

原创研发uniapp+vue3+pinia2跨三端仿微信app聊天模板Uniapp-Wechat。 uni-vue3-wchat基于uni-app+vue3+pinia2+uni-ui+uv-ui等技术跨端仿制微信App界面聊天项目,支持编译到H5+小程序端+App端。实现编辑框多行消息/emoj混

Vite5+Electron聊天室|electron31跨平台仿微信EXE客户端|vue3聊天程序

基于electron31+vite5+pinia2跨端仿微信Exe聊天应用ViteElectronChat。 electron31-vite5-chat原创研发vite5+electron31+pinia2+element-plus跨平台实战仿微信客户端聊天应用。实现了聊天、联系人、收藏、朋友圈/短

vue3 + mark.js | 实现文字标注功能

页面效果 具体实现 新增 1、监听鼠标抬起事件,通过window.getSelection()方法获取鼠标用户选择的文本范围或光标的当前位置。 2、通过 选中的文字长度是否大于0或window.getSelection().isCollapsed (返回一个布尔值用于描述选区的起始点和终止点是否位于

Vite-Wechat网页聊天室|vite5.x+vue3+pinia+element-plus仿微信客户端

基于Vue3+Pinia+ElementPlus仿微信网页聊天模板Vite5-Vue3-Wechat。 vite-wechat使用最新前端技术vite5+vue3+vue-router@4+pinia+element-plus搭建网页端仿微信界面聊天系统。包含了聊天、通讯录、朋友圈、短视频、我的等功