花一个月时间为 vue3 重制了 vue-styled-components
花一个月时间为 vue3
重制了 vue-styled-components
前言
styled-components
在 React 是一个超级热门的 css in js
工具库。其实 styled-components
也有 Vue 版本(vue-styled-components
),可惜的是只支持 Vue2,并且该项目已有几年没有更新,作者大概率不会发布 Vue3 版本了。
因此我决定重制一个支持 Vue3
版本的 vue-styled-components
,该项目前前后后大概花费了一个月的业余时间,基本实现了 styled-components
的大部分核心功能,不过可能存在部分场景考虑不全面的问题,这个需要拜托广大朋友测试检验一下了,因为不是照搬 原styled-components
的 api,大部分是自己重新实现了的。
大家觉得可以的话点点star支持下😄
项目地址:https://github.com/v-vibe/vue-styled-components
✨特性
✅ 样式化 Vue 组件或样式化组件
✅ 添加默认属性
✅ 传递属性
✅ 支持主题化
✅ 生成关键帧
✅ 生成 CSS 混合
✅ 创建全局样式
✅ 添加或覆盖Attrs
✅ 支持 CSS 嵌套。(仅支持 web: https://drafts.csswg.org/css-nesting/#nesting)
📦安装
npm i @vvibe/vue-styled-components
yarn add @vvibe/vue-styled-components
pnpm i @vvibe/vue-styled-components
🔨使用
样式化组件
<script setup lang="ts">import { styled } from '@vvibe/vue-styled-components';
import OtherComponent from './VueComponent.vue';const StyledDiv = styled('div')`width: 100px;height: 100px;background-color: #ccc;color: #000;
`;const StyledStyledDiv = styled(StyledDiv)`width: 100px;height: 100px;background-color: #000;color: #fff;
`;const StyledOtherComponent = styled(OtherComponent)`width: 100px;height: 100px;background-color: red;color: #fff;
`;</script><template><StyledDiv>Styled Div</StyledDiv><StyledStyledDiv>Styled Styled Div</StyledStyledDiv><StyledOtherComponent>Styled Other Vue Component</StyledOtherComponent>
</template>
Attributes 设置
<script setup lang="ts">import { styled } from '@vvibe/vue-styled-components';const StyledDiv = styled.div.attrs({class: 'styled-div'
})`width: 100px;height: 100px;background-color: #ccc;color: #000;
`;
</script><template><StyledDiv>Styled Div</StyledDiv><!-- <div class="styled-div">Styled Div</div> -->
</template>
通过 Props 动态控制样式
<script setup lang="ts">import { styled } from '@vvibe/vue-styled-components';const StyledDiv = styled('div', {color: '#fff'
})`width: 100px;height: 100px;background-color: #ccc;color: ${(props) => props.color};
`;
</script><template><StyledDiv>Styled Div</StyledDiv>
</template>
主题
<script setup lang="ts">import { styled, ThemeProvider } from '@vvibe/vue-styled-components';const StyledDiv = styled.div`width: 100px;height: 100px;background-color: #ccc;color: ${(props) => props.theme.color};
`;
</script><template><ThemeProvider :theme="{ color: '#fff' }"><StyledDiv>Styled Div</StyledDiv></ThemeProvider>
</template>
生成 keyframes
您可以使用 keyframes
函数来定义关键帧动画,然后使用 keyframes
的返回值将其应用于样式化组件。
<script setup lang="ts">import { styled, keyframes } from '@vvibe/vue-styled-components';const rotate = keyframes`from {transform: rotate(0deg);}to {transform: rotate(360deg);}
`;const translate = keyframes`0 {transform: translateX(0);}50% {transform: translateX(250%);}60% {transform: rotate(360deg);}
`;const StyledBaseDiv = styled.div`display: inline-block;width: 100px;height: 100px;
`; const StyledRotateDiv = styled(StyledBaseDiv)`background-color: skyblue;animation: ${rotate} 2s linear infinite;
`;const StyledTranslateDiv = styled(StyledBaseDiv)`margin-left: 10px;background-color: darkred;animation: ${translate} 2s ease infinite alternate;
`;
</script><template><StyledRotateDiv /><StyledTranslateDiv />
</template>
Create Global Style
一个用于创建全局样式的函数。
<script setup>import { createGlobalStyle } from '@vvibe/vue-styled-components';const GlobalStyle = createGlobalStyle`body {color: ${(props) => props.color};}
`;
</script><template><GlobalStyle color="white" />
</template>
Generate CSS Mixin
一个用于从带有插值的模板字符串生成 CSS 的函数。
<script setup lang="ts">import { styled, css } from '@vvibe/vue-styled-components';const mixin = css`color: red;background-color: blue;
`;const DivWithStyles = styled('div')`${mixin}
`;
</script><template><DivWithStyles>Div with mixin</DivWithStyles>
</template>
添加或覆盖 Attributes
一个向 ComponentInstance
or HTMLElements
添加或覆盖 Attributes
的函数.
<script setup lang="ts">import { withAttrs } from '@vvibe/vue-styled-components';const DivWithAttrs = withAttrs('div', {class: 'div-with-attrs'
});const DivWithAttrs2 = withAttrs(DivWithAttrs, {class: 'div-with-attrs-2'
});
</script><template><DivWithAttrs>Div with attrs</DivWithAttrs><DivWithAttrs2>Div with attrs 2</DivWithAttrs2>
</template>
<style scope>
.div-with-attrs {color: red;
}.div-with-attrs-2 {color: blue;
}
</style>
更多细节请查看 官方文档
相关文章:

花一个月时间为 vue3 重制了 vue-styled-components
花一个月时间为 vue3 重制了 vue-styled-components 前言 styled-components 在 React 是一个超级热门的 css in js 工具库。其实 styled-components 也有 Vue 版本(vue-styled-components),可惜的是只支持 Vue2,并且该项目已有…...

API接口调用|京东API接口|淘宝API接口
什么是电商API接口: 电商API接口是电商服务平台对外提供的一种接口服务,允许第三方开发者通过编程方式与电商系统进行数据交互和功能调用。 这些接口提供了一种标准化的方法来获取、更新或处理电商平台上的商品信息、订单状态、用户数据、支付信息、物流…...

pgsql和mysql比较
pgsql相对于mysql的优势主要体现在以下几个方面: 稳定性和可靠性:PostgreSQL的稳定性极强,即使在崩溃、断电等灾难场景下也能表现出很好的抗打击能力。相比之下,很多MySQL用户都遇到过Server级的数据库丢失的情况。此外ÿ…...

【太赫兹偏振保持亚波长波导链路功率预算分析】
在进行太赫兹(Terahertz,THz)偏振保持亚波长波导链路的功率预算分析时,我们需要考虑多个因素,包括波导的传输损耗、耦合损耗、偏振保持性能、以及可能存在的其他系统损耗。以下是一个基本的分析框架: 传输…...

json-server的安装和使用
json-server介绍 json-server是可以把本地当做服务器,然后axios向本地区发送请求,并且不会出现跨域的问题,若是等不及后端数据,可以用这个模拟假数据 json-server安装及使用 【json-server网址】https://www.npmjs.com/package/…...

Unity射击游戏开发教程:(10)创建主界面
主界面开发 玩游戏时,主菜单是事后才想到要做的。实际上几乎每个游戏都有一个主界面。如果你点击打开游戏并立即开始游戏,你会感到非常惊讶。本文将讨论如何创建带有启动新游戏的交互式按钮的主界面/主菜单。 主菜单将是一个全新的场景。我们将添加一个 UI 图像元素,并在图像…...

Microsoft 365 for Mac v16.84 office365全套办公软件
Microsoft 365 for Mac是一款功能丰富的办公软件套件,为Mac用户提供了丰富的功能和工具,提高了工作效率和协作能力。Microsoft 365 for Mac是一款专为Mac用户设计的订阅式办公软件套件,旨在提高生产力和效率。 Microsoft 365 for Mac v16.84正…...

交易复盘-20240507
仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 蔚蓝生物 (5)|[9:25]|[36187万]|4.86 百合花…...

面试题: malloc与new的区别
malloc, free是C语言中的库函数, new, delete是C中的运算符new自动计算分配内存的大小,malloc需要手动计算分配内存的大小new返回对象类型的指针,malloc返回的是void*类型,需要显式类型转换new分配失败抛出异常,malloc…...

欧鹏RHCE 第五次作业
unit5.DNS域名解析服务的部署及优化方案 1. (问答题) 1.配置2台服务器要求如下: a)服务器1: 主机名:dns-master.timinglee.org ip地址: 172.25.254.100 配置好软件仓库 b)服务器2: 主机名&…...

数仓分层——ODS、DW、ADS
一、什么是数仓分层 数据仓库分层是一种组织和管理数据仓库的结构化方法,它将数据仓库划分为不同的层次或级别,每个层次具有特定的功能和目的。这种分层方法有助于管理数据仓库中的数据流程、数据处理和数据访问,并提供一种清晰的结构来支持…...

计算机视觉——OpenCV Otsu阈值法原理及实现
算法简介 Otsu阈值法,也被称为大津算法,是一种在图像处理中广泛使用的自动阈值分割技术。这种方法由日本学者大津展之于1979年提出,旨在根据图像的灰度直方图来自动选择最佳全局阈值。Otsu阈值法的核心思想是最小化类内方差或最大化类间方差…...

个人IP打造孵化运营产业链商业计划书
【干货资料持续更新,以防走丢】 个人IP打造孵化运营产业链商业计划书 部分资料预览 资料部分是网络整理,仅供学习参考。 PPT共90页(完整资料包含以下内容) 目录 个人IP运营方案: 1. 个人IP定位与构建 1.1 人格画像构…...

R语言:卡方检验
χ2检验(Chi-Square Test)是一种用于检验分类变量之间是否存在相关性的统计方法。χ2检验的原理基于观察到的频数与期望频数之间的偏差来判断分类变量之间是否存在显著的关联。 χ2检验的原理可以概括为以下几个步骤: 建立假…...

基于51单片机的电子钟秒表LCD1602仿真设计( proteus仿真+程序+设计报告+原理图+讲解视频)
基于51单片机的电子钟秒表LCD1602仿真设计( proteus仿真程序设计报告原理图讲解视频) 这里写目录标题 1. 主要功能:2. 讲解视频:3. 仿真4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接 仿真图proteus7.8及以上 程序…...

latex参考文献引用网址,不显示网址问题
以引用UCI数据集为例 1、加入宏包 \usepackage{url} 2、在参考文献bib文件中加入网址文献 misc{UCI, author {{D. Dua, E. Karra Taniskidou}}, year {2024}, title {UCI Machine Learning Repository}, howpublished {\url{http://archive.ics.uci.edu/ml}} } 完成&#x…...

详细分析Mybatis与MybatisPlus中分页查询的差异(附Demo)
目录 前言1. Mybatis2. MybatisPlus3. 实战 前言 更多的知识点推荐阅读: 【Java项目】实战CRUD的功能整理(持续更新)java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全) 本章节主要以Demo为例ÿ…...

nginx--tcp负载均衡
mysql负载均衡 安装mysql yum install -y mariadb-server systemctl start mariadb systemctl enable mariadb ss -ntl创建数据库并授权 MariaDB [(none)]> create database wordpress; Query OK, 1 row affected (0.00 sec)MariaDB [(none)]> grant all privileges o…...

20240506 深度学习高级技术点
1.基于BN层剪枝 基于Batch Normalization (BN)层进行剪枝是一种常用的模型压缩方法,特别是在卷积神经网络(CNNs)中。BN层在训练期间用于加速收敛和提高模型的泛化能力,而在剪枝过程中,BN层提供的统计信息(特别是均值(mean)和方差…...

标准汽车试验铁地板的技术要求
在现代科技化发展的工作中,试验平台被广泛使用。铸铁试验平台(试验铁地板)又叫试验工作平台,听名字大家也不难想象出来这是一款带有箱式体的台面,这是一种有长方形或者圆形又或者正方形的试验工作台。 铸铁试验平台&a…...

【翻译】REST API
自动伸缩 API 创建或更新自动伸缩策略 API 此特性设计用于 Elasticsearch Service、Elastic Cloud Enterprise 和 Kubernetes 上的 Elastic Cloud 的间接使用。不支持直接用户使用。 创建或更新一个自动伸缩策略。 请求 PUT /_autoscaling/policy/<name> {"rol…...

TypeScript学习日志-第十九天(namespace命名空间)
namespace命名空间 一、基本用法 namespace 所有的变量以及方法必须要导出才能访问,如图: 二、 嵌套 namespace 可以进行嵌套使用,如图: 它也必须需要导出才能访问 三、合并 当我们出现两个同名的 namespace 它就会合并这两…...

Mac远程桌面windows11
文章目录 一、Mac安装Microsoft Remote Desktop二、Window11打开远程登录权限三、常见问题 一、Mac安装Microsoft Remote Desktop 下载地址:点击这里官方下载 基本不用看,凭感觉用就行。搞不定详情见:官方说明 二、Window11打开远程登录权…...

GPU术语
SP(Streaming Processor)流处理器 流处理器是GPU最基本的处理单元,在fermi架构开始被叫做CUDA core。 SM(Streaming MultiProcessor) 一个SM由多个CUDA core组成。SM还包括特殊运算单元(SFU),共享内存(shared memory),寄存器文件(Register …...

上海个人购房提取公积金经历和注意事项(收藏不踩坑)
在前一篇文章中,我介绍了 2024 年 4 月 24 日上海个人购房个税退税经历,我于 4 月 27 日周六,顺利办理租房公积金提取业务,资金在业务办理完成后 10 分钟左右到账。通过本文分享办理过程的材料和注意事项,避免大家踩坑…...

阿里云API网关 产品的使用笔记
阿里云的产品虽多,还是一如既往的一用一个看不懂,该模块的文档依旧保持“稳定”发挥,磕了半天才全部跑通。 用阿里云API网关的原因是,在Agent中写插件调用API的时候,需要使用Https协议,又嫌搞备案、证书等事…...

基于H.264的RTP打包中的组合封包以及分片封包结构图简介及抓包分析;FU-A FU-B STAP-A STAP-B简介;
H.264视频流的RTP封装类型分析: 前言: 1.RTP打包原则: RTP的包长度必须要小于MTU(最大传输单元),IP协议中MTU的最大长度为1500字节。除去IP报头(20字节)、UDP报头(8字节)、RTP头&a…...

OPENAI中Semantic Kernel实现原理以及示例代码用PYTHON来实现
OPENAI中Semantic Kernel实现原理以及示例代码用PYTHON来实现 前言 在人工智能领域,自然语言处理是一个非常重要的研究方向。而在自然语言处理中,语义理解是一个非常关键的问题。在这个领域中,OPENAI的Semantic Kernel是一个非常有名的工具…...

关于路由懒加载的实现
在Vue2中,实现路由懒加载可以使用import的动态引入方式。通常,我们可以将组件作为被引入的模块,并在routes配置中使用component: () > import(/components/Example.vue)来实现懒加载。 在Vue3中,懒加载的实现方式稍有不同。Vu…...

如何去官网下载windows10操作系统iso镜像
文章目录 一、先从微软中国官网https://www.microsoft.com/zh-cn/进去二、然后按图示一步步点进去三、点击下载工具这个工具会帮你生成windows操作系统iso文件四、下载好后一步步按图示要求成功操作 一、先从微软中国官网https://www.microsoft.com/zh-cn/进去 二、然后按图示一…...