Из правил могут быть исключения, но они должны быть документированы рядом с местом их возникновения.
Виджеты должны использовать Bootstrap-совместимые классы для оформления.
Виджет (в частности его корневой элемент) должен вести себя либо как блочный элемент, либо как строковый элемент.
Обычно это достигается простым правилом: на корневом элементе виджета не должно быть CSS свойств position, top/right/bottom/left, width/height, flex/flex-*, margin/margin-*.
Виджет не должен иметь внутреннего состояния, его состояние должно быть полностью выражаемо значениями его пропов.
Когда внутри виджета происходит что-то, что должно поменять его пропы, он должен бросить событие с новым значением. Затем родитель может на свое усмотрение поменять проп, на изменение которого виджет должен отреагировать.
Если виджет отвечает за одно единственное изменяемое значение, тогда это должна быть пара:
- Vue: проп
valueи событиеinput. Сокращается доv-model. - React: пропы
valueиonChange.
Если виджет отвечает за несколько независимых значений, тогда для каждого значения (на примере photo) должна быть пара:
- Vue: проп
photoи событиеupdate:photo. Сокращается доphoto.sync(см. sync props). - React: пропы
photoиonChangePhoto.
Vue $slots не использовать в computed, ибо $slots нереактивны. Но можно использовать условную отрисовку слотов, опираясь на вычисление has в $slots в методах, т.к. vue компонент ререндерится каждый раз при изменении родителя, если у него есть хоть 1 слот, задекларированный в родителе.