Vue 3中直接给组件声明标签添加class属性是否合理?
嘿,这个问题问得特别到位!直接给Vue组件标签加class属性完全没问题,而且这其实是Vue官方推荐的优秀实践,我来给你掰扯清楚为什么:
Vue原生支持,设计初衷就是如此
Vue从2.x到3.x都原生允许给组件传递class和style属性,这些属性会自动合并到组件的根元素的class列表中。就像你示例里的代码,父组件传的extra class from parent会和子组件内部定义的.my-component类一起作用在根元素上,根本不需要额外定义props来接收,省了不少冗余代码,非常高效。更灵活的组件定制与复用
当你复用组件时,不同场景往往需要微调样式,直接在外层加class比在组件内部堆一堆条件判断或者额外props要灵活得多。比如你的MyComponent是个通用组件,在页面A需要加个顶部外边距,页面B需要改文字颜色,直接在外层标签加对应的class就能搞定,完全不用修改组件内部代码,完美契合开闭原则。scoped样式隔离依然有效
你用了scoped样式,子组件的.my-component只会作用在自己的根元素上,不会影响其他组件。如果父组件传的是全局class,会直接生效;如果父组件也是scoped样式,需要用:deep()来穿透,但这都是正常的样式隔离逻辑,不会因为直接传class就打乱样式结构。
当然也有个小注意点:如果你的组件是多根元素,Vue默认不知道该把class加到哪个元素上,这时候需要在子组件里通过$attrs手动指定,比如在目标根元素上写:class="$attrs.class",但单根组件的话就完全不用操心这点。
备注:内容来源于stack exchange,提问作者V S Vuca

