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

前端学习笔记(四)自定义组件控制自己的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>
http://www.xdnf.cn/news/2296.html

相关文章:

  • QT跨平台软件开发要点
  • 0803分页_加载更多-网络ajax请求2-react-仿低代码平台项目
  • OSPF中DR/BDR的选举
  • WPF程序使用Sugar操作数据库
  • 从 Vue 到 React:React 合成事件
  • WPF定义扩展属性和依赖属性
  • LeetCode热题100——70. 爬楼梯
  • 解锁生成式AI潜力的金钥匙
  • WSL 中 nvidia-smi: command not found的解决办法
  • OpenAI o3和o4 - mini模型发布:创新乏力与竞争困境
  • 基于物联网的园林防火监测系统
  • 代码随想录算法训练营第二十七天(补)
  • java面向对象编程【高级篇】之继承
  • Android学习总结之kotlin篇(一)
  • 多系统安装经验,移动硬盘,ubuntu grub修改/etc/fstab 移动硬盘需要改成nfts格式才能放steam游戏
  • 论文阅读:2024 arxiv HybridFlow: A Flexible and Efficient RLHF Framework
  • spark总结
  • 论文阅读:2025 arxiv Reward Shaping to Mitigate Reward Hacking in RLHF
  • Jmeter如何取JDBC request响应参数作为下一个接口的值?
  • Maven的概念与初识Maven
  • openAICEO山姆奥特曼未来预测雄文之三个观察
  • Nuxt3中使用UnoCSS指南
  • 【Android】app调用wallpaperManager.setBitmap的隐藏权限
  • 基于 Nginx 的 WebSocket 反向代理实践
  • Android JIT( ART即时编译器),Just In Time Compiler,即时编译技术
  • 科学养生,开启健康生活新方式
  • Vue2+ElementUI实现无限级菜单
  • 物联网安全运营概览
  • STM32F103C8T6裸机多任务编程的问题
  • 【C++】异常