Передать ссылку в слот по умолчанию в компоненте без рендеринга
Я пытаюсь создать компонент без рендеринга в vue 3 и хочу передать ссылку в слот по умолчанию.
Когда я использую
h
функцию рендеринга, я могу просто передать ссылку:
return h('div', {ref: someRef}); // works
Если я попытаюсь сделать то же самое со слотом по умолчанию, это не сработает:
return slots.default({ ref: someRef}) // does not work
return slots.default({ someRef}) // also does not work
Есть ли способ сделать это без переноса слота по умолчанию в другой div или аналогичный?
Уже проверил документацию и другие ресурсы, но не смог найти никакого решения.
1 ответ
Прямой ответ
Да вернуть функцию из вашегоsetup
крюк!
setup(_, slots) {
const someRef = ref()
return () => slots.default({ ref: someRef })
}
Контекстный ответ для тех, кто в разделе комментариев сомневается в шаблоне без рендеринга / без головы.
Да, иногда вы просто хотите безрендеринговую (или безголовую, как говорят дети в наши дни) оболочку для функциональности (логики), не ограничивая HTML, который могут использовать потребители.
Но для того, чтобы эта функциональность работала, компонент без рендеринга/безголового по-прежнему должен идентифицировать часть HTML-кода, который потребители отображают в слоте по умолчанию, чтобы, например, обеспечить функциональность, связанную с DOM.
У меня та же проблема при использовании этого шаблона, и я полагался на «хак»: передачу определенных атрибутов данных через область слота, которую потребители должны привязать к нужным элементам (не только корневому), а затем использовать старый добрыйdocument.querySelector
схватить их
Я хорошо послужил мне в vue2, и я без проблем использовал его в производстве, но мне было интересно, если с новой динамикой:ref
атрибут vue3, мы можем сделать это по-другому: возможно, передав реактивныйref
переменная, а затем выполняет простое назначение, и, по-видимому, это работает.
<renderless #default="{ someRef }">
<some-consumer-comp :ref="(el) => someRef.value = el" />
</renderless>
Обратите внимание, что если вы хотите обрабатывать крайние случаи, такие как обработка условного рендеринга содержимого слота, вам, вероятно, потребуется проделать немного больше работы и добавить несколько наблюдателей.
Этот шаблон немного вышел из моды в наши дни, с введением vuecomposables
поскольку вы можете абстрагировать логику вuseSomeFunctionality
и используйте его непосредственно на компоненте, который вы хотите, но он все еще действителен IMO.
Ваше здоровье!