목차
组合 API
选项API
组合API 渲染功能
Composition API
옵션 API
API 렌더링 기능 결합
요약
웹 프론트엔드 View.js Vue3.2에서 노출이란 무엇입니까? 무슨 소용이 있나요?

Vue3.2에서 노출이란 무엇입니까? 무슨 소용이 있나요?

Jul 08, 2022 am 11:06 AM
vue vue.js vue3

Vue3.2의 새로운 노출은 무엇에 사용되나요? 다음 기사는 Vue3.2의 노출 도구에 대한 좋은 이해를 제공할 것입니다. 도움이 되기를 바랍니다!

Vue3.2에서 노출이란 무엇입니까? 무슨 소용이 있나요?

Vue 3.2 출시와 함께 expose라는 새로운 구성 도구가 제공됩니다. (학습 영상 공유: vue 영상 튜토리얼) expose。(学习视频分享:vue视频教程

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

如果你在开发一个开源的组件或库,你有可能想保持一些内部方法的私有性。在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.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

템플릿에 일부 메서드와 속성을 제공해야 하는 구성 요소를 생성했지만 이러한 메서드를 구성 요소에만 비공개하고 상위 클래스에서 호출할 수 없도록 하려는 적이 있습니까? 🎜🎜오픈 소스 구성 요소나 라이브러리를 개발하는 경우 일부 내부 메서드를 비공개로 유지하고 싶을 수도 있습니다. Vue 3.2 이전에는 옵션 API에 선언된 모든 메소드나 데이터 등이 공개되어 템플릿이 액세스할 수 있었기 때문에 이를 달성하기가 쉽지 않았습니다. 🎜🎜컴포지션 API도 마찬가지입니다. setup 메서드에서 반환하는 모든 항목은 상위 클래스에서 직접 액세스할 수 있습니다. 🎜

Composition API

🎜실용적인 예를 살펴보겠습니다. 카운터를 생성하고 매초마다 이 카운터를 업데이트하는 구성 요소가 있다고 상상해 보십시오. 🎜🎜** MyCounter.vue** 🎜rrreee🎜 구성 관점에서 부모 구성 요소가 필요할 때 reset 메서드를 직접 호출할 수 있기를 원하지만 는 유지하고 싶습니다. 종료 함수 및 <code>counter에 대한 참조는 구성 요소에만 사용할 수 있습니다. 🎜🎜이 구성 요소를 App.vue와 같은 상위 클래스로 인스턴스화하고 참조 참조를 연결하면 상위 클래스가 reset 메서드를 호출하도록 쉽게 할 수 있습니다. setup에서 반환되었으며 terminate와 함께 노출되었습니다. 🎜🎜App.vue🎜rrreee🎜지금 실행하고 재설정 또는 종료 버튼을 클릭하면 둘 다 작동합니다. 🎜🎜reset 함수만 사용할 수 있도록 상위 클래스에 노출하려는 내용(expose)을 명시적으로 지정해 보겠습니다. 🎜🎜** MyCounter.vue**🎜rrreee🎜여기서 setup 함수에 propscontext 매개변수를 추가했습니다. expose 함수가 있는 곳이므로 컨텍스트를 사용할 수 있어야 합니다. { 노출 }과 같은 리팩토링을 사용할 수도 있습니다. 🎜🎜다음으로, 이 예제에서는 context.expose를 사용하여 이 구성 요소를 인스턴스화하는 상위 클래스에 노출하려는 요소 개체를 선언합니다. /code> 기능을 사용할 수 있습니다. 🎜🎜이 예제를 다시 실행하고 "부모에서 종료" 버튼을 클릭하면 오류가 발생합니다. 🎜rrreee🎜 종료 기능은 더 이상 사용할 수 없으며 이제 비공개 API에 액세스할 수 없습니다. 🎜

옵션 API

🎜위에서는 composition API에서 exponse를 사용하지만 이 방법은 옵션 API에서도 사용할 수 있습니다. 다음과 같이 다시 작성할 수 있습니다. 🎜rrreee🎜'reset' 문자열이 우리가 노출하는 함수의 이름인 배열을 전달할 수 있는 새로운 옵션 API 속성 expose를 추가했습니다. . 🎜

API 렌더링 기능 결합

🎜 강력하고 유연한 구성 요소를 만드는 방법은 렌더링 기능의 힘을 활용하는 것입니다. 이는 Vue 3의 새로운 기능은 아니지만 구성 API의 설정으로 이제 setup 메서드에서 직접 구성 API h 함수를 반환할 수 있는 유연성을 갖게 되었습니다. 🎜🎜setup 함수에서 전체 return 문에 구성 요소가 생성하는 노드의 h만 포함되어 있기 때문에 문제가 발생합니다. . 🎜🎜이 시점에서 부모 클래스에 무언가를 노출하기로 선택하면 이전에 본 것과 반대되는 문제에 직면하게 됩니다. DOM 요소 외에는 아무것도 반환되지 않으므로 아무것도 노출되지 않습니다. 🎜🎜이 메서드를 사용하도록 MyCounter.vue 구성 요소를 재정의해 보겠습니다. 🎜rrreee🎜 DOM 요소를 생성하는 데 필요하기 때문에 상단의 Vue에서 h를 가져왔습니다. 🎜🎜문제를 설명하기 위해 context.expose 메서드에 일시적으로 주석을 달았습니다. 🎜🎜이제 return 문은 이전 <template>의 DOM 구조를 복사하며 이 예제를 실행하면 요소의 재설정 및 종료 버튼을 올바르게 클릭할 수 있습니다. 🎜🎜그러나 지금 "부모로부터 재설정" 버튼을 클릭하면 오류가 발생합니다. 🎜rrreee🎜 reset 메소드는 setup 함수에 의해 반환되지 않기 때문에 더 이상 노출되지 않습니다. 이 문제를 해결하려면 context.expose 호출을 취소하여 다시 사용할 수 있도록 해야 합니다. 🎜

요약

새로운 expose 메서드는 매우 직관적이고 구성 요소에서 구현하기 쉽습니다. 과거에 전체 구성 요소를 다시 작성해야 했던 몇 가지 매우 중요한 구성 문제를 해결하므로 매일 사용하는 API가 아니더라도 폴더에 수집하고 먼지를 모을 가치가 있습니다.

원문 영문 텍스트: https://www.vuemastery.com/blog/understanding-vue-3-expose/

[추천 관련 비디오 튜토리얼: vuejs 입문 튜토리얼, 웹 프론트엔드 시작하기 ]

위 내용은 Vue3.2에서 노출이란 무엇입니까? 무슨 소용이 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

vue.js vs. React : 프로젝트 별 고려 사항 vue.js vs. React : 프로젝트 별 고려 사항 Apr 09, 2025 am 12:01 AM

vue.js는 중소형 프로젝트 및 빠른 반복에 적합한 반면 React는 크고 복잡한 응용 프로그램에 적합합니다. 1) vue.js는 사용하기 쉽고 팀이 불충분하거나 프로젝트 규모가 작는 상황에 적합합니다. 2) React는 더 풍부한 생태계를 가지고 있으며 고성능 및 복잡한 기능적 요구가있는 프로젝트에 적합합니다.

Vue 용 버튼에 기능을 추가하는 방법 Vue 용 버튼에 기능을 추가하는 방법 Apr 08, 2025 am 08:51 AM

HTML 템플릿의 버튼을 메소드에 바인딩하여 VUE 버튼에 함수를 추가 할 수 있습니다. 메소드를 정의하고 VUE 인스턴스에서 기능 로직을 작성하십시오.

Vue에서 부트 스트랩을 사용하는 방법 Vue에서 부트 스트랩을 사용하는 방법 Apr 07, 2025 pm 11:33 PM

vue.js에서 bootstrap 사용은 5 단계로 나뉩니다 : Bootstrap 설치. main.js.의 부트 스트랩 가져 오기 부트 스트랩 구성 요소를 템플릿에서 직접 사용하십시오. 선택 사항 : 사용자 정의 스타일. 선택 사항 : 플러그인을 사용하십시오.

Vue에서 시계를 사용하는 방법 Vue에서 시계를 사용하는 방법 Apr 07, 2025 pm 11:36 PM

vue.js의 시계 옵션을 사용하면 개발자가 특정 데이터의 변경 사항을들을 수 있습니다. 데이터가 변경되면 콜백 기능을 트리거하여 업데이트보기 또는 기타 작업을 수행합니다. 구성 옵션에는 즉시 콜백을 실행할지 여부와 DEEP를 지정하는 즉시 포함되며, 이는 객체 또는 어레이에 대한 변경 사항을 재귀 적으로 듣는 지 여부를 지정합니다.

vue.js로 JS 파일을 참조하는 방법 vue.js로 JS 파일을 참조하는 방법 Apr 07, 2025 pm 11:27 PM

vue.js에서 JS 파일을 참조하는 세 가지 방법이 있습니다. & lt; script & gt; 꼬리표;; mounted () 라이프 사이클 후크를 사용한 동적 가져 오기; Vuex State Management Library를 통해 수입.

Vue 다중 페이지 개발은 무엇을 의미합니까? Vue 다중 페이지 개발은 무엇을 의미합니까? Apr 07, 2025 pm 11:57 PM

VUE 멀티 페이지 개발은 vue.js 프레임 워크를 사용하여 응용 프로그램을 구축하는 방법입니다. 여기서 응용 프로그램은 별도의 페이지로 나뉩니다. 코드 유지 보수 : 응용 프로그램을 여러 페이지로 분할하면 코드를보다 쉽게 ​​관리하고 유지 관리 할 수 ​​있습니다. 모듈 식 : 각 페이지는 쉬운 재사용 및 교체를 위해 별도의 모듈로 사용할 수 있습니다. 간단한 라우팅 : 페이지 간의 탐색은 간단한 라우팅 구성을 통해 관리 할 수 ​​있습니다. SEO 최적화 : 각 페이지에는 자체 URL이있어 SEO가 도움이됩니다.

Vue가 이전 페이지로 돌아 오는 방법 Vue가 이전 페이지로 돌아 오는 방법 Apr 07, 2025 pm 11:30 PM

vue.js는 이전 페이지로 돌아갈 수있는 네 가지 방법이 있습니다. $ router.go (-1) $ router.back () 사용 & lt; router-link to = & quot;/quot; Component Window.history.back () 및 메소드 선택은 장면에 따라 다릅니다.

VUE 버전을 쿼리하는 방법 VUE 버전을 쿼리하는 방법 Apr 07, 2025 pm 11:24 PM

Vue DevTools를 사용하여 브라우저 콘솔에서 vue 탭을 보면 VUE 버전을 쿼리 할 수 ​​있습니다. npm을 사용하여 "npm list -g vue"명령을 실행하십시오. package.json 파일의 "종속성"객체에서 vue 항목을 찾으십시오. Vue Cli 프로젝트의 경우 "vue -version"명령을 실행하십시오. & lt; script & gt에서 버전 정보를 확인하십시오. vue 파일을 나타내는 html 파일의 태그.

See all articles