Vue3  defineExpose要在方法声明定义以后使用的教程

 更新时间:2023年02月18日 10:11:46   作者:feixianxing  
这篇文章主要介绍了Vue3  defineExpose要在方法声明定义以后使用的教程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

defineExpose要在变量和方法声明定义之后再使用,否则浏览器的控制台会输出很多警告,并且最终将该页面卡死。

[Vue3] defineExpose要在方法声明定义以后使用

Vue3中的setup默认是封闭的,如果要从子组件向父组件暴露属性和方法,需要用到defineExpose.

defineProps, defineEmits一样,这三个函数都是内置的,不需要import.

不过defineProps, defineEmits都会返回一个实例,而defineExpose是无返回值的.

const props = defineProps({})
const emit = defineEmits([])
defineExpose({})

defineExpose的使用

子组件Child.vue

<template>
	{{ name }}
</template>

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

const name = ref("Nicholas.")
const sayName = ()=>{
    console.log("my name is "+name.value)
}

defineExpose({
	name,
	sayName
});
</script>

父组件Father.vue

<template>
	<Child ref="child"></Child>
</template>

<script setup>
import { ref, onMounted } from 'vue'
const child = ref(null)
onMounted(()=>{
    console.log(child.value.name)	// "Nicholas"
    child.value.sayName()			// "my name is Nicholas"
})
</script>

总结

向外暴露的时候变量会自动解包,比如上面子组件的name:ref<String>暴露到父组件的时候自动变成了name:String.

注:defineExpose一定要在变量和方法声明定义之后再使用。

不知道以后会不会有修改,不过在2023/02/17,如果defineExpose写在变量和函数前面,那么浏览器的控制台会输出很多警告,并且最终将该页面卡死。

扩展:vue3 defineExpose

vue3使用 setup 语法糖后如何在父组件用ref调用子组件的方法

什么是setup语法糖

  • 更少的样板内容,更简洁的代码。
  • 能够使用纯 Typescript 声明 props 和抛出事件。
  • 更好的运行时性能 (其模板会被编译成与其同一作用域的渲染函数,没有任何的中间代理)。
//要使用这个语法,需要将 setup attribute 添加到 <script> 代码块上:
<script setup>
console.log('hello script setup')
//里面的代码会被编译成组件 setup() 函数的内容。这意味着与普通的 <script> 只在组件被首次引入的时候执行一次不同,<script setup> 中的代码会在每次组件实例被创建的时候执行。
</script>

当我们的组件使用这种语法时,是不可以用setup()这种语法的写法获取子组件的数据或方法
为了在 script setup 组件中明确要暴露出去的属性,使用 defineExpose 编译器宏:

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

const a = 1
const b = ref(2)

defineExpose({
  a,
  b
})
//当父组件通过模板 ref 的方式获取到当前组件的实例,获取到的实例会像这样 { a: number, b: number } (ref 会和在普通实例中一样被自动解包)

</script>

下面是vue3 使用setup()后 父组件获取子组件的方法

1、父组件

template中

<Table ref="eleTable" @handle="handleFun"></Table>
import {  ref  } from 'vue'

2、子组件

setup() { 
   //ref方法
    const eleTable = ref()  //eleTable是页面ref后面对应的名字
    const clickSon = () => {
      eleTable.value.changeShowText() //调用子组件的方法
      let arr = eleTable.value.tableData //获取子组件 setup 里面定义的变量
    }
}

使用语法糖之后的写法

父组件

<FastreplySettingTable
              ref="FastreplySettingTableRef"
              v-if="sysStore.msgList"
              :groupType="Math.abs(state.currentTab - 1)"
              :currentTab="state.currentTab"
            ></FastreplySettingTable>


<script>
   const FastreplySettingTableRef = ref();
   
   //该方法是一个点击事件
   function sendEvent(action) {
     if (FastreplySettingTableRef) {
     //拿到FastreplySettingTableRef组件里的dispatchEvent方法 并且穿一些参数
    FastreplySettingTableRef.value.dispatchEvent({ action, groupType: Math.abs(state.currentTab - 1) })
  }
}
</script>

子组件

import {
  getCurrentInstance,
  onMounted,
  reactive,
  onBeforeUnmount,
  defineProps,
  defineEmits,
  computed,
  onBeforeMount,
  onUnmounted,
  watch,
  ref,
  //这里必须引入
  defineExpose
} from "vue";
// 希望被父组件调用到的方法
//这个方法必须写在defineExpose 上面才会生效
const dispatchEvent = ({ action, groupType }) => {
  switch (action) {
    case 'tabClick': {
      state.searchKeyword = '',
        state.activeGroup = 'all'

    }; break;
    case 'addfastMsg': {
      //上报
      openMask('addfastMsg');
      // state.DialogTitle = state.groupType ? "快捷消息管理-添加团队内容" : "快捷消息管理-添加个人内容"
      // spiderReport.paq(props.groupType ? "快捷消息管理-添加团队内容" : "快捷消息管理-添加个人内容");
    }; break;
    default: {
      // state.[action](groupType);
    }
  }
}
defineExpose({
  dispatchEvent
})

到此这篇关于Vue3 defineExpose要在方法声明定义以后使用的教程的文章就介绍到这了,更多相关Vue3 defineExpose内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文带你深入了解V-model实现数据双向绑定

    一文带你深入了解V-model实现数据双向绑定

    这篇文章主要为大家详细介绍了V-model实现数据双向绑定的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • vscode中使用vue的一些插件总结(方便开发)

    vscode中使用vue的一些插件总结(方便开发)

    对于很多使用vscode编写vue项目的新手同学来说,可能不知道使用什么插件,下面这篇文章主要给大家介绍了关于vscode中使用vue的一些插件,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • vue中添加音频和视频的示例详解

    vue中添加音频和视频的示例详解

    这篇文章主要为大家详细介绍了如何vue中添加音频和视频的相关知识,文中的示例代码简洁易懂,具有一定的学习价值,感兴趣的小伙伴可以了解下
    2023-08-08
  • 前端vue如何通过URL访问存储在服务器或磁盘的图片

    前端vue如何通过URL访问存储在服务器或磁盘的图片

    在Vue中,通常需要将图片存储在服务器端,并通过url地址来访问,下面这篇文章主要给大家介绍了前端vue如何通过URL访问存储在服务器或磁盘的图片的相关资料,需要的朋友可以参考下
    2024-02-02
  • vue如何封装Axios的get、post请求

    vue如何封装Axios的get、post请求

    这篇文章主要介绍了vue如何封装Axios的get、post请求,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 深入了解vue2与vue3的生命周期对比

    深入了解vue2与vue3的生命周期对比

    这篇文章主要为大家介绍了vue2与vue3的生命周期对比,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • vue和element上传图片以及进行拖拽图片排序问题

    vue和element上传图片以及进行拖拽图片排序问题

    这篇文章主要介绍了vue和element上传图片以及进行拖拽图片排序问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Vue首评加载速度及白屏时间优化详解

    Vue首评加载速度及白屏时间优化详解

    这篇文章主要介绍了vue项目优化首评加载速度,以及白屏时间过久的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • Vue Router中获取路由传递过来的参数(方法详解)

    Vue Router中获取路由传递过来的参数(方法详解)

    在VueRouter中,可以通过动态路由匹配和查询参数`query`来传递参数,并将路由参数或查询参数作为组件的`props`传递,动态路由匹配使用`route.params`访问参数,查询参数使用`route.query`访问,本文给大家介绍Vue Router中获取路由传递过来的参数,感兴趣的朋友一起看看吧
    2025-02-02
  • 详解Vue中生命周期钩子函数的使用示例

    详解Vue中生命周期钩子函数的使用示例

    这篇文章主要为大家详细介绍了Vue中常见的生命周期钩子函数的使用,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11

最新评论