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
👍
Илья
хм, ща попробую ) еще не освоил этот раздел доки )
Victor
Там все то же самое, только functional: true добавь Vue.component('my-component', { functional: true, // Для компенсации отсутствия экземпляра, // мы теперь передаем 2-й аргумент context. render: function (createElement, context) { // ... },
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 это типа материал юай кит или путаю?
Илья
ага, вижу. пасиб, буду вникать
Victor
render функции можно и с обычными компонентами фигачить. Не обязательно делать его функциональным. Но если можно, то стоит
вопрошающий хотел в одном коде объединять template и render-функцию. Мне кажется, что без ф-компонента так сделать не получится
Илья
ну в этом случае мне не очень принципиально, будет ли шаблон или рендер-функция - задача просто вынести кусок шаблона в функцию, не создавая компонента
Илья
функциональный компонент вроде по виду похож на то что надо
Stanislav
Возможно, функциональный компонент тебе подойдет, да. Если тебе не нужно отслеживать локальное состояние
Michael
Так вообще сделать не получится. Шаблон - это и есть render функция
В реакте можно сделать просто функцию где угодно, возвращающую вноду
Michael
хотим решить такую проблему во вью.
Илья
мне хочется, чтобы можно было вынести кусок шаблона куда-то, при этом чтобы там сохранились ссылки на контекст (доступ к пропертям-методам)
Stanislav
В реакте можно сделать просто функцию где угодно, возвращающую вноду
функция, которая возвращает объект с методом render :)
Илья
то есть компонент вот он, у него поведения-проперти-лайфсайкл, а кусок шаблона - это типа просто кусок шаблона =)
Michael
пихни ее куда угодно в жсх, и оно отрендерится
Stanislav
пихни ее куда угодно в жсх, и оно отрендерится
Это, скорее, фича JSX. Во вью ты тоже можешь так сделать с JSX
Rafael 🌵
Возможно, функциональный компонент тебе подойдет, да. Если тебе не нужно отслеживать локальное состояние
а еще там кучи всего нет и функциональкая компонента вроде как не отображается в devtools
Илья
если весь шаблон оторажается через рендер-функцию, это вроде довольно просто реализуется
Rafael 🌵
потому что не имеет экземпляра
Michael
то есть компонент вот он, у него поведения-проперти-лайфсайкл, а кусок шаблона - это типа просто кусок шаблона =)
предполагается, что у одного компонента только одно место с шаблоном, а не раскиданное по исходникам нечто как у реакта
Илья
вот мне хочется раскидать )))
Rafael 🌵
Michael
остальное предполагается можно решить через v-for
Michael
подробнее, вам hoc нужен?
я про пробелму Ильи)
Stanislav
Ты можешь создать функциональный компонент с шаблоном (vue 2.5) Внутри шаблона у тебя будут доступны только пропсы и слоты. Подходит только для отрисовки html
Michael
можешь в миксины вынести
в миксины можно выносить куски шаблона чтобы потом тыкать в наследуемый компонент?
Илья
ну да, я буду ща изучать функциональные компоненты, по смыслу вроде похоже
Илья
если бы у меня весь шаблон был в рендер-функции, такая декомпозиция делалась бы тривиально: render(createElement) { return createElement( 'div', [renderOne(createElement), renderTwo(createElement)] ) }, renderOne(ce) {return ...}, renderTwo(ce) {return ...}
Rafael 🌵
в миксины можно выносить куски шаблона чтобы потом тыкать в наследуемый компонент?
нет, в мискины можно выносить куски рендер фукнции например getList (), который вернет результат после хелпер фукнцию
Илья
и не особо важно, где лежать renderOne() и renderTwo()
Stanislav
вообще-то не только, как раз с помощью них и scoped slots можно делать полноценный hoc
я про функциональные компоненты с шаблонами. А в обычных делай че хочешь, воруй, убивай.
Michael
ну да, я буду ща изучать функциональные компоненты, по смыслу вроде похоже
Теоритически, ты можешь сделать "компонент", который экспортит функцию, которая возвращает функц.компонент
Michael
будет даже пизже чем в реакте
Илья
ок )))
Michael
а в аргумент ей шаблон передаёшь или типа того
Илья
вообще есть ощущение, что это надо решать директивой для компайлера
Илья
короче придумаю чо расскажу
Stanislav
Всем привет , я новый в Vue но уже в восторге , есть такой глупый вопрос , когда появляется компонент , в каком lifecycle хуке лучше загружать данные из API? Created?
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
Stanislav
если с серверрендерингом, то да. Если нет, то лучше что-то типа beforeMounted
Я делаю клиентский рендеринг , а разве на стадии маунтед уже созданы свойства у компонента ?
Michael
а вообще вопрос оч сложный)) из предложенного нужно понимать, что все что маунт, не испоняется на серваке
Michael
как думаешь?)
Stanislav
Аааа, огромное благодарствую
Stanislav
И ещё, подскажите, как сделать props динамическими , например если я меняю значение в родителе и оно до этого было передано дочернему компоненту , то в дочернем оно автоматически обновляется
Alex
Что значит динамические) если вы поменяете в родительском значение которое передается в props другому компоненту - туда тоже автоматом прокинется новое
Stanislav
Спасибо ) я просто думал что props работают по принципу 'once'
Alex
В документации о подобном ни слова)
Nikita
Что такое плохой ui. Это когда человек оставляет комментарий к гугл музыки с просьбой добавить перемотку.
Kostya
Ребят всем привет, возник тут вопрос по поводу компонентов модулей, где отдельно js и css файлы, есть ли смысл а таком подходе если можно во .vue компоненте все это делать?