当前位置: 首页 > news >正文

前端学习笔记(四)自定义组件控制自己的css

1、前言及背景

自己写的一个组件有至少3个页面在使用,组件中的部分文字颜色需要统一修改需要根据一个状态字段来显示不同颜色且不希望受父组件影响
注意:博主学习vue截止目前也就半年,如有知识错误之处还请指出不胜感激,祝学习开心快乐哈哈

2、deepseek查询

提问:vue3中使用插槽时如果通过子组件统一设置父组件中的插槽的class
答案:
方案有2个
一、插槽包裹层样式穿透
通过在子组件中为插槽‌添加包裹容器‌并设置class,利用CSS作用域穿透特性控制插槽内容样式

<!-- 子组件 ChildComponent.vue -->
<template><div class="child-wrapper"><div class="slot-container"> <!-- 定义插槽容器 --><slot></slot></div></div>
</template><style scoped>
.slot-container :deep(div) { /* 穿透父组件插槽内容 */color: red;padding: 12px;
}
</style>

二、作用域插槽传递参数
通过‌作用域插槽‌将class参数传递给父组件,父组件动态绑定插槽元素的class

<!-- 子组件 ChildComponent.vue -->
<template><slot :slotClass="'custom-class'"></slot> <!-- 传递class参数 -->
</template>
<!-- 父组件 ParentComponent.vue -->
<child-component><template #default="{ slotClass }"><div :class="slotClass"> <!-- 动态绑定接收的class -->插槽内容</div></template>
</child-component>

方案对比
选择方案时,若需‌完全由子组件控制样式‌,优先使用包裹层穿透方案;若需‌保留父组件样式调整灵活性‌,则采用作用域插槽传递参数。

3、具体实现方案

1)给插槽外面包装一个div
2)通过动态计算来设置slot外面div的class名字
3)不同的class里面通过deep选择到父组件可能用到的span和a并控制颜色

4、具体代码

<!--代码片段-->
<template v-if="$slots.edit || $slots.view || $slots.publish"><div :class="classStatusColor"><slot v-if="!!$slots.edit" name="edit" :model="modelEdit"></slot></div>
<template>
  const statusColor = ref(getStatusColor());const classStatusColor = computed(() => ({'slot-edit-container-draft': statusColor.value === STATUS_DRAFT,'slot-edit-container-waiting-approve': statusColor.value === STATUS_WAITING_APPROVE,'slot-edit-container-reject': statusColor.value === STATUS_REJECT,'slot-edit-container-publish': statusColor.value === STATUS_PUBLISH,}));
// 代码片段按照优先级设置颜色STATUS_REJECT > STATUS_DRAFT > STATUS_WAITING_APPROVE > STATUS_WAITING_APPROVE > STATUS_PUBLISH
function getStatusColor() {let values: DataValue[];//values = ............//自己处理逻辑// 空值处理if (values === undefined) {return STATUS_UNKNOWN;}let statusList: number[] = [];for (let i of values) {if (i.value.status === undefined) {statusList.push(STATUS_UNKNOWN);} else {statusList.push(i.value.status);}}if (statusList.includes(STATUS_REJECT)) {return STATUS_REJECT;}if (statusList.includes(STATUS_DRAFT)) {return STATUS_DRAFT;}if (statusList.includes(STATUS_WAITING_APPROVE)) {return STATUS_WAITING_APPROVE;}if (statusList.includes(STATUS_PUBLISH)) {return STATUS_PUBLISH;}return STATUS_UNKNOWN;}
<style lang="less" scoped>// 红色是草稿状态.slot-edit-container-draft :deep(a) {color: rgb(238 102 102);}// 蓝色是待审核状态.slot-edit-container-waiting-approve :deep(a) {color: rgb(84 112 198);}// 橙色是驳回状态.slot-edit-container-reject :deep(a) {color: rgb(250 200 88);}// 黑色是已发布状态.slot-edit-container-publish :deep(a) {font-weight: black;}
</style>

相关文章:

  • 写了一个关于SpringAop记录用户操作的功能
  • 从入门到精通汇编语言 第七章(高级汇编语言技术)
  • goweb项目结构以及如何实现前后端交互
  • 【GoChat】密码处理与实现JWT+进行功能单测
  • MuJoCo 关节角速度记录与可视化,监控机械臂运动状态
  • 【特殊场景应对9】视频简历的适用场景与风险分析
  • 测试模板x
  • AI 与高性能计算的深度融合:开启科技新纪元
  • 【互联网架构解析】从物理层到应用层的全栈组成
  • 前端开发本地配置 HTTPS 全面详细教程
  • Java 自定义TCP协议:【特点编码字符串<=>字节<=>特点编码16进制】16进制字符串和编码的转换 (各种编码通过字节向16进制的互转)| XOR计算
  • 在华为云平台上使用 MQTT 协议:构建高效可靠的物联网通信
  • crossOriginLoading使用说明
  • gradle-缓存、依赖、初始化脚本、仓库配置目录详解
  • 【锂电池剩余寿命预测】GRU门控循环单元锂电池剩余寿命预测(Matlab完整源码)
  • 发布-订阅模式应用场景及示例说明
  • 桥接模式(Bridge Pattern)详解
  • Eigen矩阵操作类 (Map, Block, 视图类)
  • 系统设计(2)—Redis—消息队列—数据库—熔限降
  • babel核心知识点
  • 新希望去年归母净利润4.74亿同比增逾九成,营收降27%
  • 央行25日开展6000亿元MLF操作,期限为1年期
  • 广西北海市人大常委会副主任李安洪已兼任合浦县委书记
  • 岭南非遗大IP来上海了,舞剧《英歌》在文化广场连演两场
  • 低轨卫星“千帆星座”已完成五批次组网卫星发射,未来还有这些计划
  • IMF将今年美国经济增长预期下调0.9个百分点至1.8%