Привет всем, я Оуян!
Эта статья о1400+
Характер,Чтение всей статьи занимает около 6 минут.
как мы все знаем,Когда подкомпонент использует настройку,Родительский компонент не может быть такимvue2Таким образом, вы можете напрямую получить доступ к свойствам и методам внутри подкомпонента.。На данный момент вам необходимо использовать его в подкомпонентеdefineExpose
Макросфункциячтобы указать свойства и методы, которые вы хотите предоставить。Давайте поговорим об этой статьеdefineExpose
Макросфункция Как предоставить эти свойства и методы родительскому компоненту?。Примечание:использовано в этой статьеvueВерсия3.4.19
。
родительский компонентindex.vue
из Код выглядит следующим образом:
<template>
<ChildDemo ref="child" />
<button @click="handleClick">Вызов дочернего компонентаизvalidateметод</button>
</template>
<script setup lang="ts">
import ChildDemo from "./child.vue";
import { ref } from "vue";
const child = ref();
function handleClick() {
console.log(child.value.validate);
child.value.validate?.();
}
</script>
Приведенный выше код очень прост,проходитьref
Получить подкомпонентиз Примерназначен наchild
переменная。РанназадсуществоватькнопкаизclickРаспечатка подкомпонентов в событияхизvalidate
методиосуществлятьvalidate
метод。
Давайте еще раз посмотрим на подкомпонентыchild.vue
Не используетсяdefineExpose
Макросизпример,Код выглядит следующим образом:
<template></template>
<script setup>
function validate() {
console.log("Выполнить метод проверки подкомпонента");
}
</script>
Нажмите кнопку родительского компонента в Браузере.,Вы можете увидеть его напечатанным в консоли.издаundefined
,ивнутри подкомпонентаизvalidate
метод Ни одиносуществлять。Поскольку подкомпонент используетsetup,По умолчанию свойства и методы, определенные в настройке, не будут доступны. Как показано ниже:
яих Давайте еще раз посмотрим на подкомпонентыchild.vue
использоватьdefineExpose
Макросизпример,Код выглядит следующим образом:
<template></template>
<script setup>
function validate() {
console.log("Выполнить метод проверки подкомпонента");
}
defineExpose({
validate,
});
</script>
Нажмите кнопку родительского компонента в Браузере.,Вы можете увидеть его напечатанным в консоли.из不再даundefined
,внутри подкомпонентаизvalidate
методтакжеосуществлять Понятно。Как показано ниже:
Сначала вам нужно Браузернайден вкомпилироватьназадизиспользоватьdefineExpose
Макросизchild.vue
документ,существоватьnetworkпанельнайден вchild.vue
,Затем щелкните правой кнопкой мыши Открыть in Sources panelВот и всесуществоватьsourceпанельнайден вкомпилироватьназадизchild.vue
。Как показано ниже:
Для отладки в браузере нам также необходимо отключить карту исходного кода JavaScript браузера в настройках, как показано ниже:
сейчассуществоватьяих来看看компилироватьназадизchild.vue
документ,Код выглядит следующим образом:
const _sfc_main = {
__name: "child",
setup(__props, { expose: __expose }) {
function validate() {
console.log("Выполнить метод проверки подкомпонента");
}
__expose({
validate,
});
const __returned__ = { validate };
return __returned__;
},
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
return null;
}
_sfc_main.render = _sfc_render;
export default _sfc_main;
видно сверху_sfc_main
объектсерединаизsetup
переписыватьсяиз就даяих源代码<script setup>
серединаизсодержание,иdefineExpose
Макросфункциятакже不существовать Понятно,стал__expose
метод(defineExpose
Макросфункциякаккомпилироватьстановиться__expose
методяих会существовать В следующей статье речь пойдет о)。Как показано ниже:
expose
методДавать__expose
метод Сделать точку останова,Обновите страницу, и точка останова останется.существовать__expose
методвыше。Нажмитеstep into
войти в__expose
методвнутренний,Как показано ниже:
войти в__expose
методвнутренний,мы нашли__expose
методдасуществоватьодинcreateSetupContext
функциясередина定义из。существоватьяих这个场景серединаcreateSetupContext
функцияупрощатьназадиз Код выглядит следующим образом:
function createSetupContext(instance) {
const expose = (exposed) => {
instance.exposed = exposed || {};
};
return Object.freeze({
// ... упущение
expose,
});
}
Давайте сначала посмотримфункциясерединаизinstance
переменная,я Скучаю по тебепроходитьимя Характер应该已经猜到Понятно他就дакогда前vueПримеробъект。Как показано ниже:
В объекте экземпляра vue есть знакомые методы данных, атрибуты директив и компонентов и т. д.
существоватьexpose
функциявнутренний做из事情также很简单,Назначьте объект, состоящий из свойств или методов, которые субкомпонент должен предоставить экземпляру vue.exposed
свойство.
validate
методВ vue3, если вы хотите получить доступ к подкомпонентам, вам нужно использовать специальные ref
attribute,существоватьяих这个примерсередина就даиспользовать<ChildDemo ref="child" />
。такиспользоватьназад Вот и всеиспользоватьchild
переменная Доступ к дочерним компонентам,на самом делесуществоватьздесьchild
переменнаяиз值就даодинимя为getExposeProxy
функцияизвозвращаемое значение(назадлапшаиз文章середина会去详细讲解ref
атрибут — это способ доступа к дочерним компонентам).
getExposeProxy
функцияиз Код выглядит следующим образом:
function getExposeProxy(instance) {
if (instance.exposed) {
return (
instance.exposeProxy ||
(instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {
get(target, key) {
if (key in target) {
return target[key];
} else if (key in publicPropertiesMap) {
return publicPropertiesMap[key](instance);
}
},
has(target, key) {
// ... упущение
},
}))
);
}
}
前лапшаяих讲过ПонятноdefineExpose
Макросфункциясередина定义Понятно想要незащищенный出来изсвойствоиметод,пройтикомпилироватьназадdefineExpose
Макросфункция Изменятьстановиться Понятно__expose
метод。осуществлять__expose
методназад Отобразит дочерний компонентизсвойствоилиметод Группастановитьсяизобъектназначен наvueПримерначальствоизexposed
свойство,То естьinstance.exposed
。
существоватьвышеизgetExposeProxy
функцияя возвращаюсьinstance.exposed
изProxy
объект,когдаяихиспользоватьchild.value.validate
Доступ к дочерним компонентамизvalidate
метод,на самом деле就дадоступиздаinstance.exposed
объектсерединаизvalidate
метод,иinstance.exposed
серединаизvalidate
метод就даdefineExpose
Макросфункциянезащищенныйизvalidate
метод。Как показано ниже:
родительский компонент想要Доступ к дочерним компонентамнезащищенныйизvalidate
метод主要分为下лапша四步:
defineExpose
Макросфункциязаявить о желании быть разоблаченнымvalidate
метод。defineExpose
Макросфункцияпройтикомпилироватьназад Изменятьстановиться__expose
метод。__expose
метод将子Группа件需要незащищенныйизсвойствоилиметод Группастановитьсяизобъектназначен на子Группа件vueПримерначальствоизexposed
свойство,То естьinstance.exposed
。validate
метод,То естьдоступchild.value.validate
。на самом деледоступиз就даначальство一步изinstance.exposed.validate
метод,最终доступиз就даdefineExpose
Макросфункциясерединанезащищенныйизvalidate
метод。Нажмите на карточку ниже, сосредоточьтесь ная,Дайте себе продвижениеvue
из Шанс。