Как понять что нужно разделять компонент на новые компоненты (vue)?
К примеру, есть компонент Button и у меня есть необходимость как-то её стилизовать, что бы она стала большой, я же не должен создавать новый компонент BigButton и в нём использовать Button? А логичнее вроде как будет просто пропсом указать что-то вроде size="big" и в Button либо подкрутить стили, либо сделать чёт другое, что требуется.
То есть, в моём понимание, смысл создавать другой компонент (BigButton), используя имеющийся (Button) есть тогда, когда нам нужно только добавить ему какого-то js функционала? Хотя тут можно по сути использовать тот же подход с пропсами и вот тут всё же непонятен немного момент, а когда же создавать новый компонент, а когда просто добавлять разную логику в действующий в зависимости от поступающих пропсов?
Aetae, а к примеру, если есть ситуация : "мне нужно что бы кнопка выглядела как Button, но при нажатии на неё отправлялся запрос на сервер". Т.е. у меня есть дефолтный компонент Button и тут как я понимаю, 2 варианты развития пути :
- просто добавить функционал запроса на сервер к Button и через пропс в случае чего его активировать.
- либо создать компонент RequrestButton в котором будет вложен Button и при клике на него - будет идти запрос и получается если мне нужно использовать кнопку с отправкой запроса - просто юзать RequestButton.
Понимаю что в данном контексте вроде как проще подход с просто пропсами, но в каких ситуациях может быть более удобным вариант с подходом как в случае с созданием RequestButton?
Разделение по функционалу тоже важная часть. "Button" в большинстве случаев не подразумевает по смыслу никаких запросов, так что тут нужен отдельный компонент.
Также в данном случае тут нет 2х вариантов Button. Есть код Button и есть дополнительный код поверх Button.
Если он нужно единожды, то RequestButton оборачивабщий Button - правильный вариант.
Или можно добавить универсальности и сделать компонент Request, которому можно положить в slot Button или любой иной компонент. Или директиву v-request-some. Или компонент, но не в который вкладывается кнопка, а наоборот - который вкладывается в кнопку и что-то делает с родителем. Разные варианты, в зависимости от нужд..)
Вообще компоненты должны быть как можно меньшего размера и собираться из других компонентов.
Золотое правило. Если поймал себя на том, что копипастишь больше 6-7 строк - выноси в отдельную функцию:)
То есть, если эта одна кнопка - класс повесил и забыл. Если ты понимаешь, что именно такую кнопку, с какой то определенной логикой надо где-то использовать еще - то в компонент.
Но тут я плохой советчик. Я почти никогда не делал такие компоненты. Обходился классами. А вот компоненты вроде Header, Footer, Cooments (комментарии) - делаю всегда.
То есть нужно много чего перестроить, отобразить сабтайтл и всякое такое.
Тут как бы вы сделали? В один компонент запихнули оба варианта кнопки и через пропс и v-if отображали какой-то из них? Или делали бы для каждой кнопки отдельный компонент?
Владимир Коротенко, Зачем ему в этом случае slot? Ему нужно передать title, subtitle в кнопку. slot думаю уместнее в других случаях. Ему придется же внутри кнопки писать именованные слоты. Props однозначно проще.
В вашем случае лучше один компонент и через js все делать. Потому что, потом может понадобиться повесить watch на нажатие, например вы будете писать админку и захотите все клики по кнопкам фиксировать - вам придется и в первом и во втором компоненте делать одно и то же, захотите все кнопки задизейблить - опять в двух компонентах и т.д.
Barring, если нужно играть с порядком и вложенностью элементов, то либо разбивать на микрокомпоненты и подключать их в цикле в нужном порядке, либо отказаться от template для данного конкретного компонента и использовать render функцию: не стоит её бояться, функциональный подход бывает весьма удобен.