likes
comments
collection
share

Vue 3 + ts 掌握 defineExpose:项目实践!

作者站长头像
站长
· 阅读数 76

最近学习vue3的一些项目,对其中一些常用的东西和一些踩坑来做一些记录,本文是对DefineExpose的一些记录。

DefineExpose

默认情况下,通过模板引用或者 $parent 链获取到的组件的公开实例,并不会暴露任何在 <script setup> 中声明的绑定。使用 <script setup> 的组件默认关闭了这个功能。

要显式指定在 <script setup> 组件中要暴露出去的属性,可以使用 defineExpose 编译器宏。下面是一个示例:

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

const a = 1
const b = ref(2)

defineExpose({
  a,
  b
})
</script>

当父组件通过模板引用的方式获取到当前组件的实例时,获取到的实例将包含暴露的属性,例如:{ a: number, b: number }。注意,ref 会像在普通实例中一样被自动解包。

项目中实践

在vue3+ts中 子组件声明一个函数但是不使用defineExpose暴露,ts会提示语法错误

//子组件
//新增、编辑逻辑 
const type = ref<string>('edit');
const typeChange = (value:string)=>{
  drawerActive.value = true;
  type.value = value
}
 Vue 3 + ts 掌握 defineExpose:项目实践!

这里提示声明了但是没有使用,因为我们没有把它暴露出去也没有使用,并且这个情况下父组件是无法访问到该方法的,以下是使用报错

 Vue 3 + ts 掌握 defineExpose:项目实践!

父组件代码如下

<template>
  <div class="h-full">
    <n-card>
      <n-tabs type="segment">
        <n-tab-pane name="chap1" :tab=myVNode>
          <WorkExp  ref="workExpRef" />
        </n-tab-pane>
        <n-tab-pane name="chap2" tab="项目经历">
          <ProjectExp />
        </n-tab-pane>
        <n-tab-pane name="chap3" tab="教育经历">
        </n-tab-pane>
        <n-tab-pane name="chap5" tab="社团/组织经历">
        </n-tab-pane>
      </n-tabs>
    </n-card>
  </div>
</template>

<script setup lang="ts">
import WorkExp from './components/workExp.vue';
const workExpRef = ref<any>(null); //使用any 不然会出现“never”上不存在属性“typeChange”
const handleClick = ()=>{
  const {value:workExp} = workExpRef
  if(workExp){
    workExp.type = 'add'
    workExp.typeChange('add')
  }
}

所以我们需要用 DefineExpose 来解决该问题

首先是ts报错的没有使用的问题,以下是解决方法

import { defineExpose} from 'vue';
const type = ref<string>('edit');
const typeChange = (value:string)=>{
  drawerActive.value = true;
  type.value = value
}
defineExpose({
  typeChange
})

此时typeChange就在子组件中暴露,父组件可以正常通过ref的方式访问到暴露出的方法

转载自:https://juejin.cn/post/7241057191003340860
评论
请登录