Michael
Привет! А может все-таки кто-нибудь упражнялся с вынесением отдельных кусков шаблона в render-функции?
Уже который раз натыкаюсь на задачу такого типа, но хз как это гуглить.
Короче, есть такой код:
<div>
Тут может быть слот:
<div v-if="hasSlotData('after-input')" class="form-row__slot form-row__slot_after-input">
<slot name="after-input"></slot>
</div>
</div>
Часть с v-if, как видно, шаблонная, хочется ее вынести в какой-то метод. В JSX мы бы сделали так:
function drawSlot(name) {
if (hasSlotData(name)) {
return <div class="...">...</div>
}
}
И в шаблоне:
<div>Тут может быть слот: {drawSlot('after-input')}</div>
Для Vue я в прошлый раз решил, просто добавив компонент-прослойку.
Но это как-то много писанины, лишняя сущность и лишняя магия внутри (например, прокинуть vnode-ы из слотов вниз оказалось нифига не просто).
Тащить JSX не особо хочется, да и не очень понятно, поможет ли он. Есть идеи?
в реакте самый тру вариант создать компоненту. Во вбю, в прицнипе, тоже. Но вроде бы можно создать метод с jsx
Michael
или что-то в этом роде
Michael
ну тащить-то не очень надо
Michael
он уже есть)
Илья
разве? вроде надо бабель-плагин доставлять
Илья
ну ок, не тащить, а начинать юзать +1 технологию в проекте
Victor
Создай прямо там функциональный компонент
Michael
Michael
Michael
👍
Илья
хм, ща попробую ) еще не освоил этот раздел доки )
Victor
Там все то же самое, только functional: true добавь
Vue.component('my-component', {
functional: true,
// Для компенсации отсутствия экземпляра,
// мы теперь передаем 2-й аргумент context.
render: function (createElement, context) {
// ...
},
Michael
Michael
Или всё же template)
Rafael 🌵
Привет! А может все-таки кто-нибудь упражнялся с вынесением отдельных кусков шаблона в render-функции?
Уже который раз натыкаюсь на задачу такого типа, но хз как это гуглить.
Короче, есть такой код:
<div>
Тут может быть слот:
<div v-if="hasSlotData('after-input')" class="form-row__slot form-row__slot_after-input">
<slot name="after-input"></slot>
</div>
</div>
Часть с v-if, как видно, шаблонная, хочется ее вынести в какой-то метод. В JSX мы бы сделали так:
function drawSlot(name) {
if (hasSlotData(name)) {
return <div class="...">...</div>
}
}
И в шаблоне:
<div>Тут может быть слот: {drawSlot('after-input')}</div>
Для Vue я в прошлый раз решил, просто добавив компонент-прослойку.
Но это как-то много писанины, лишняя сущность и лишняя магия внутри (например, прокинуть vnode-ы из слотов вниз оказалось нифига не просто).
Тащить JSX не особо хочется, да и не очень понятно, поможет ли он. Есть идеи?
почекай исходники vuetify , там все это дело так и выносят
Stanislav
render функции можно и с обычными компонентами фигачить. Не обязательно делать его функциональным. Но если можно, то стоит
Илья
vuetify это типа материал юай кит или путаю?
Michael
Илья
ага, вижу. пасиб, буду вникать
Stanislav
Илья
ну в этом случае мне не очень принципиально, будет ли шаблон или рендер-функция - задача просто вынести кусок шаблона в функцию, не создавая компонента
Илья
функциональный компонент вроде по виду похож на то что надо
Stanislav
Возможно, функциональный компонент тебе подойдет, да.
Если тебе не нужно отслеживать локальное состояние
Michael
хотим решить такую проблему во вью.
Илья
мне хочется, чтобы можно было вынести кусок шаблона куда-то, при этом чтобы там сохранились ссылки на контекст (доступ к пропертям-методам)
Stanislav
Michael
Илья
то есть компонент вот он, у него поведения-проперти-лайфсайкл, а кусок шаблона - это типа просто кусок шаблона =)
Michael
пихни ее куда угодно в жсх, и оно отрендерится
Rafael 🌵
Илья
если весь шаблон оторажается через рендер-функцию, это вроде довольно просто реализуется
Rafael 🌵
потому что не имеет экземпляра
Илья
вот мне хочется раскидать )))
Rafael 🌵
Michael
остальное предполагается можно решить через v-for
Rafael 🌵
Michael
Stanislav
Ты можешь создать функциональный компонент с шаблоном (vue 2.5)
Внутри шаблона у тебя будут доступны только пропсы и слоты.
Подходит только для отрисовки html
Rafael 🌵
Илья
ну да, я буду ща изучать функциональные компоненты, по смыслу вроде похоже
Michael
Илья
если бы у меня весь шаблон был в рендер-функции, такая декомпозиция делалась бы тривиально:
render(createElement) {
return createElement(
'div',
[renderOne(createElement), renderTwo(createElement)]
)
},
renderOne(ce) {return ...},
renderTwo(ce) {return ...}
Илья
и не особо важно, где лежать renderOne() и renderTwo()
Michael
будет даже пизже чем в реакте
Илья
ок )))
Michael
а в аргумент ей шаблон передаёшь или типа того
Michael
Илья
вообще есть ощущение, что это надо решать директивой для компайлера
Илья
короче придумаю чо расскажу
Michael
Stanislav
Всем привет , я новый в Vue но уже в восторге , есть такой глупый вопрос , когда появляется компонент , в каком lifecycle хуке лучше загружать данные из API? Created?
Michael
Michael
бефомаунт*
Michael
ну типа у тебя пока маунтится уже пошёл запрос
Michael
хотя более надёжно mounted, если компонент не висит спрятанный)
Michael
и вообще даже
Michael
и там метод дёргаешь типа this.fetchData()
Michael
https://forum-archive.vuejs.org/topic/4106/what-is-the-best-vue-html-way-to-fetch-data-from-external-servers/2
Michael
https://router.vuejs.org/en/advanced/data-fetching.html
Michael
а вообще вопрос оч сложный)) из предложенного нужно понимать, что все что маунт, не испоняется на серваке
Michael
Michael
как думаешь?)
Stanislav
Аааа, огромное благодарствую
Stanislav
И ещё, подскажите, как сделать props динамическими , например если я меняю значение в родителе и оно до этого было передано дочернему компоненту , то в дочернем оно автоматически обновляется
Alex
Что значит динамические) если вы поменяете в родительском значение которое передается в props другому компоненту - туда тоже автоматом прокинется новое
Stanislav
Спасибо ) я просто думал что props работают по принципу 'once'
Alex
В документации о подобном ни слова)
Nikita
Что такое плохой ui.
Это когда человек оставляет комментарий к гугл музыки с просьбой добавить перемотку.
Kostya
Ребят всем привет, возник тут вопрос по поводу компонентов модулей, где отдельно js и css файлы, есть ли смысл а таком подходе если можно во .vue компоненте все это делать?
Stanislav
Michael