我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue3.2中的expose有什么作用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue3.2中的expose有什么作用

这篇文章主要讲解了“Vue3.2中的expose有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3.2中的expose有什么作用”吧!

Vue3.2中的expose有什么作用

随着Vue 3.2的发布,一个新的组合工具提供给我们,叫做 expose

你是否曾经创建过一个需要向模板提供一些方法和属性的组件,但又希望这些方法对组件是私有的,不能被父类调用?

如果你在开发一个开源的组件或库,你有可能想保持一些内部方法的私有性。在Vue 3.2之前,这并不容易实现,因为所有在选项API中声明的方法或数据等都是公开的,所以模板可以访问它。

组合API也是如此。我们从setup方法中返回的所有东西都可以被父类直接访问。

组合 API

让我们看一个实际的例子。想象一下,我们有一个组件,它创建了一个计数器,每一秒都会更新这个计数器。

** MyCounter.vue**

<template>    <p>Counter: {{ counter }}</p>    <button @click="reset">Reset</button>    <button @click="terminate">☠️</button></template><script>import { ref } from 'vue'export default {  setup () {    const counter = ref(0)    const interval = setInterval(() => {      counter.value++    }, 1000)    const reset = () => {      counter.value = 0    }    const terminate = () => {      clearInterval(interval)    }    return {      counter,      reset,      terminate    }  }}</script>

从组合的角度来看,我希望父级组件能够在需要时直接调用reset方法--但我希望保持terminate 函数和 counter 的引用只对组件可用。

如果我们把这个组件实例化到一个父类中,例如 App.vue,并给它附加一个 ref 引用,我们可以很容易地让父类调用 reset 方法,因为当我们从 setup 中返回它时,它已经和 terminate 一起被暴露了。

App.vue

<template>  <MyCounter ref="counter" />  <button @click="reset">Reset from parent</button>  <button @click="terminate">Terminate from parent</button></template><script>import MyCounter from '@/components/MyCounter.vue'export default {  name: 'App',  components: {    MyCounter  },  methods: {    reset () {      this.$refs.counter.reset()    },    terminate () {      this.$refs.counter.terminate()    }  }}</script>

如果现在运行这个,并单击重置或终止按钮,两者都可以工作。

让我们明确说明我们要向父类暴露(expose)的内容,以便只有 reset 函数可用。

** MyCounter.vue**

<script>import { ref } from 'vue'export default {  setup (props, context) {    const counter = ref(null)    const interval = setInterval(() => {      counter.value++    }, 1000)    const reset = () => {      counter.value = 0    }    const terminate = () => {      console.log(interval)      clearInterval(interval)    }    context.expose({ reset })    return {      counter,      reset,      terminate    }  }}</script>

这里,我们在setup函数中加入了 propscontext 参数。我们需要有可用的上下文,因为这是 expose 函数的位置。我们也可以像这样使用重构: { expose }

接下来,我们使用 context.expose 来声明一个我们想要向实例化这个组件的父类公开的元素对象;在这个例子中,我们只打算让 reset 功能可用。

如果我们再次运行这个例子,并点击 "Terminate from parent" 按钮,我们会得到一个错误。

Uncaught TypeError: this.$refs.counter.terminate is not a function

terminate 功能不再可用,我们的私有API现在也无法访问了。

选项API

上面我们在 composition API 使用 exponse,但在options API中也可以使用这个方法。我们可以把它改写成如下。

//  MyCounter.vueexport default {  created () { ... },  data: () => ({ counter: null }),  methods: {    reset () { ... },    terminate () { ... }  },  expose: ['reset']}

注意,我们添加了一个新的选项API属性expose,允许我们传入一个数组,其中字符串'reset'是我们公开的函数的名称。

组合API 渲染功能

创建一个强大脸灵活的组件的方法是利用渲染函数的力量。这对Vue 3来说并不新鲜,但是随着composition API的建立,我们现在可以灵活地从setup方法中直接返回组合API h 函数。

这就产生了一个问题,因为在我们的setup函数中,整个return语句只是包含组件正在创建的节点的 h 方法。

如果在这个时候我们选择向父类 expose 一些东西,我们就会遇到与我们之前看到的相反的问题。没有任何东西被暴露,因为除了DOM元素,没有任何东西被返回。

让我们重写 MyCounter.vue 组件来使用这个方法。

<script>// The template has been deletedimport { ref, h } from 'vue'export default {  setup (props, context) {    const counter = ref(0)    const interval = setInterval(() => {      counter.value++    }, 1000)    const reset = () => {      counter.value = 0    }    const terminate = () => {      clearInterval(interval)    }    // context.expose({ reset })    return () => h('div', [      h('p', `Counter: ${counter.value}`),      h('button', { onClick: reset }, 'Reset'),      h('button', { onClick: terminate }, 'Terminate')    ])  }}</script>

注意,我们在顶部从Vue导入了 h,因为我们需要用它来创建我们的DOM元素。

为了说明问题,暂时注释了context.expose方法。

现在的 return 语句复制了我们之前的 <template> 的DOM结构,如果我们运行这个例子,我们能够正确点击元素上的重置和终止按钮。

然而,如果我们现在点击 "Reset from parent"按钮,我们会遇到一个错误。

Uncaught TypeError: this.$refs.counter.reset is not a function

reset方法不再被暴露,因为它没有被setup函数返回。为了解决这个问题,我们需要取消对context.expose的调用,使其再次可用。

感谢各位的阅读,以上就是“Vue3.2中的expose有什么作用”的内容了,经过本文的学习后,相信大家对Vue3.2中的expose有什么作用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue3.2中的expose有什么作用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue3.2中的expose有什么作用

这篇文章主要讲解了“Vue3.2中的expose有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3.2中的expose有什么作用”吧!随着Vue 3.2的发布,一个新的组合工具
2023-07-02

vue3.2中的vuex怎么使用

这篇文章主要介绍“vue3.2中的vuex怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue3.2中的vuex怎么使用”文章能帮助大家解决问题。Vuex 中有以下几个核心概念:State:
2023-07-06

Vue3.2中的setup语法怎么使用

本篇内容主要讲解“Vue3.2中的setup语法怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3.2中的setup语法怎么使用”吧!vue3.2 到底更新了什么?根据原文内容的更新
2023-06-29

什么是语法糖?Vue3.2中怎么使用语法糖?

Vue中怎么使用语法糖?下面本篇文章带大家了解一下语法糖,并介绍一下Vue3.2语法糖的使用方法,希望对大家有所帮助!
2022-11-28

Linux Shell中()、(())、[]、[[]]、{}的有什么作用

这篇文章主要介绍“Linux Shell中()、(())、[]、[[]]、{}的有什么作用”,在日常操作中,相信很多人在Linux Shell中()、(())、[]、[[]]、{}的有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好
2023-06-15

linux中的lo有什么作用

本篇内容主要讲解“linux中的lo有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux中的lo有什么作用”吧!在linux中,lo是local的简写,是指本地环回接口;利用这个接
2023-06-29

Tomcat中的Connector有什么作用

Tomcat中的Connector是用来处理客户端与服务器之间的通信的组件。它负责监听客户端请求,并将请求转发给适当的处理器,然后将处理器的响应返回给客户端。Connector可以根据不同的协议(如HTTP、AJP等)来处理不同类型的请求,
Tomcat中的Connector有什么作用
2024-03-07

Tomcat中的Realm有什么作用

在Tomcat中,Realm的作用是用来处理用户认证和授权的。Realm负责验证用户的身份和权限,以便在应用程序中进行访问控制。通过配置Realm,Tomcat可以支持多种不同的用户认证方式,例如基于数据库、LDAP、JDBC等。Realm
Tomcat中的Realm有什么作用
2024-03-08

Python中的Dask有什么作用

本篇内容主要讲解“Python中的Dask有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的Dask有什么作用”吧!前言Python由于其易用性而成为最流行的语言,它提供了
2023-06-16

Vue中的Hooks有什么作用

本篇内容介绍了“Vue中的Hooks有什么作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Hooks 对于 Vue 意义着什么?Hooks
2023-06-29

python中的tokenize有什么作用

在Python中,tokenize的作用是将文本分解为独立的词或符号,称为“标记”。这些标记可以是单词、句子、段落或更大的文本单位,具体取决于应用程序的需求。tokenize的主要作用有:1. 分词:将文本分解为单词(token),以便进行
2023-08-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录