返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3.2 中新出的Expose用法一览
  • 576
分享到

Vue3.2 中新出的Expose用法一览

2024-04-02 19:04:59 576人浏览 薄情痞子
摘要

目录组合 apiApp.Vue** MyCounter.vue**选项API组合API 渲染功能总结随着Vue 3.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​函数中加入了 props​ 和 context​ 参数。我们需要有可用的上下文,因为这是 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.vue
export 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 deleted
import { 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的调用,使其再次可用。

总结

新的 expose 方法是非常直观的,而且很容易在我们的组件中实现。它清除了一些非常重要的组成问题,这些问题在过去甚至需要重写一个完整的组件,所以即使它不是你日常使用的API,它也是值得收藏在我们文件夹中吃灰。

到此这篇关于vue3.2 中新出的 Expose 是做啥用的?的文章就介绍到这了,更多相关Vue3.2 Expose 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue3.2 中新出的Expose用法一览

本文链接: https://lsjlt.com/news/153613.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue3.2 中新出的Expose用法一览
    目录组合 APIApp.vue** MyCounter.vue**选项API组合API 渲染功能总结随着Vue 3.2的发布,一个新的组合工具提供给我们,叫做 expose...
    99+
    2024-04-02
  • Vue3.2中的expose有什么作用
    这篇文章主要讲解了“Vue3.2中的expose有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3.2中的expose有什么作用”吧!随着Vue 3.2的发布,一个新的组合工具...
    99+
    2023-07-02
  • 一文搞懂Vue3.2中setup语法糖使用
    目录前言一、如何使用setup语法糖二、data数据的使用三、method方法的使用四、watchEffect的使用五、watch的使用六、computed计算属性的使用七、prop...
    99+
    2024-04-02
  • Vue3.2中的setup语法怎么使用
    本篇内容主要讲解“Vue3.2中的setup语法怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3.2中的setup语法怎么使用”吧!vue3.2 到底更新了什么?根据原文内容的更新...
    99+
    2023-06-29
  • Win10 Mobile预览版14905应用更新出现0x80073cf9错误的解决方法
    微软今天推送了Win10 Mobile上首个RS2预览版更新14905,面向Windows Insider快速通道,本次更新微软为Win10 Mobile带来新的手机铃声设置,还有其他改进等等,但部分网友在商店应用更新时...
    99+
    2023-05-21
    Win10 预览版14905 0x80073cf9
  • vue3.2+ts如何实现在方法中可调用的拟态框弹窗
    这篇“vue3.2+ts如何实现在方法中可调用的拟态框弹窗”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue3.2+ts如...
    99+
    2023-07-04
  • Win10一周年更新预览版商店中下载安装Edge浏览器的教程
    Win10内置Edge浏览器的一大特点就是能够使用扩展程序,这可以为该浏览器增加用户所需要的功能。目前这项功能还没有完全准备好,但最近的一些迹象表明,Windows Insider用户可能很快就能体验到在Windows1...
    99+
    2023-05-20
    Win10 Edge浏览器
  • Win10一周年更新预览版中怎么使用Linux Bash命令?
    微软已经在Win10一周年更新预览版中加入了Ubuntu Bash命令支持,我们也曾经介绍过如何安装和开启Win10版linux Bash命令。不过还是有用户在开启后不太会用,这次我们就介绍一下Windows10版Bas...
    99+
    2023-05-21
    Win10 Linux Bash命令
  • win11更新中途取消退出的方法
    这篇文章主要介绍“win11更新中途取消退出的方法”,在日常操作中,相信很多人在win11更新中途取消退出的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”win11更新中途取消退出的方法”的疑惑有所帮助!...
    99+
    2023-07-02
  • Win10创造者更新预览版15031新bug 下载的主题无法使用
    根,甚至不会出现在主题设置中。 ▲已下载安装的主题并没有出现在主题设置中,点击“启动”不会更换新主题 这种情况多发生在64位系统用户中,而部分32位15031用户却遇到了新主题导致设置应用崩溃的...
    99+
    2023-05-22
    Win10 预览版15031
  • PHP8中的新函数:array_key_first()的新应用方法
    随着PHP8的发布,新函数也随之而来。其中,array_key_first()是在PHP7.3中已经出现,但其却在PHP8中得到了新的应用方法,让我们一起来了解一下。array_key_first()的定义首先,让我们来看看array_ke...
    99+
    2023-05-18
    PHP 新函数 array_key_first()的新应用方法
  • win8.1更新过程中出现黑屏的解决方法
    更新win8.1过程中出现黑屏是因为你的显卡驱动不兼容win8.1,这时候我们应该更新显卡驱动,但是黑屏了进不去了,怎么样才能更新显卡驱动呢 1、进入安全模式 开机的时候按住F8,然后选择安全模式。 2、卸...
    99+
    2022-06-04
    解决方法 过程中 黑屏
  • Win10一周年更新预览版14391推送 修复我的游戏应用
    我们讯 相比于PC和手机,Xbox One版Win10一周年更新预览版似乎更为积极,或者说“心急”,目前已经推送了14391版(rs1_xbox_rel_1608.160714-2120...
    99+
    2023-05-21
    Win10 一周年更新
  • Win10一周年更新版中浏览器正式放弃认证SHA-1算法签署的TLS证书
    早在2015年的11月,微软就往外放风微软计划提前结束Win10 Edge对SHA-1签名证书的支持,如今过去了将近半年的时间,微软今日再度发声:2017年2月起,微软的Edge浏览器(仅支持Win10)和IE浏览器将双...
    99+
    2023-05-20
    Win10
  • vue3中watch和watchEffect的新用法
    目录一、watch新用法1.1、watch使用语法1.2、watch监听多个属性值1.3、watch监听引用数据类型二、watchEffect三、watch与watchEffect区...
    99+
    2024-04-02
  • Win8/8.1系统metro应用中使用IE浏览器出现闪退问题的解决方法
      解决方法:   1、控制面板—>打开或关闭Windows功能—>Internet Explorer 10/11 取消勾选,点确定,按照提示重启;   2、打开ccl...
    99+
    2022-06-04
    解决方法 浏览器 系统
  • XP系统中重装IE浏览器弹出一个无法继续运行的提示框该怎么办
    这期内容当中小编将会给大家带来有关XP系统中重装IE浏览器弹出一个无法继续运行的提示框该怎么办,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  当windows xp系统中的InternetExplore...
    99+
    2023-06-14
  • Android开发中实现一个弹出框的方法
    本篇文章给大家分享的是有关Android开发中实现一个弹出框的方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。截图:动画效果介绍:点击ActionBar上“+”按钮,菜单从上...
    99+
    2023-05-31
    android roi
  • Win10一周年更新版中应用商店将增加游戏视频片段预览
    此前我们报道过在Win10一周年更新预览版中,微软将为Win10应用商店带来众多新功能,完善细节,比如应用商店下载页面可以打开应用。另外随着Windows10独占游戏《极限竞速6:巅峰》发布,另一项正测试功能也已曝光。 ...
    99+
    2023-05-20
    Win10 商店
  • GORM 无法更新一对多关系中的数据
    php小编苹果在使用GORM框架时,可能会遇到一个常见问题:无法更新一对多关系中的数据。在一对多关系中,我们通常会有一个主表和一个从表,但是在进行更新操作时,GORM可能无法正确处理从...
    99+
    2024-02-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作