по типу
<template #activator="{ showModal }">
<button @click="showModal = true">Showme {{ showModal }}</button>
</template>
Клик не отрабатывает, а вот в текстовой части выводит все верно
в скопед слоте возвращай не стейт, а функцию которая стейт поменяет и засовывай её в клик
Это получается обязательно в методы её объявить когда байндишь в слот? А если да, то насколько это нормальная практика? Либо лучше через ref и @click="$refs.name.toggle"?
передать в скопед метод, лучше того, что пытались сделать вы
Не обязательно, маленькую функцию можно сразу в параметр передать.
А как тебе такое решение: <template #activator="{ obj }"> <button @click="obj.showModal = true">Showme {{ obj.showModal }}</button> </template> =D
Я имею ввиду про дергать метод ref'ом vs дергать так, как вы подсказали. Что более vue-way
разные кейсы решаются, и то и другое норм
Через реф у вас получается странное решение. Есть рендер функция, которая рендерит кнопку. Кнопка зависит от параметра. Но изменяете вы параметр, используя обращение к компоненту персонально через родителя, и который предоставляет публичный метод для этого изменения. Не понятно, зачем здесь выходить за рамки слота. Передать сеттер - нормальное решение. Данные и изменение данных пойдут вместе
Примерно так, получается? <slot name="activator" :showModal="() => {visible = true}"> Попытался вчитаться почему когда я пытался через showModal = true не отрабатывало, я правильно понял, что слот возвращает функция, соответственно ссылки на showModal в слоте и самом компоненте выходили разные?
Слот - это место, где в компонент рендерится некоторое содержимое. То, что передаётся через слот - это шаблон, а в итоге рендер функция, которая на вход принимает параметры слота и по ним рендерит содержимое слота. Соответственно showModal = true - это просто внутри функции присваивание нового значение в аргумент этой функции. Изменение значения аргумента в теле функции не влияет на то, что передали в качестве значения аргумента
<slot name='name' :param="value" /> - это аналог render this.$scopedSlots.name({ param: this.value }) А передача шаблона в слот <template #name="{ param }"> <button @click="param = x"> это аналог передачи рендер функции ({ param }) => h('button', listeners: { click: () => param = x } ) Т.е. просто присваивается внутри тела рендер функции новое значение в параметр. Никак не влияет на переданное значение
Большое спасибо! Надо было мне сразу функцию задебажить чтобы посмотреть что под капотом он локально в функцию копирует значения, тогда и пояснение не понадобилось бы. Изначально подумал, что там контекст компонента сохраняется через что-то наподобие ref.showModal в теле функции на клик 😢
Обсуждают сегодня