React Native支持Tailwind CSS 语法

React Native支持Tailwind CSS 语法


在这里插入图片描述

一、前沿背景

回想下我们平时按照官方的规范进行书写样式是什么样?
是像下面这样:

const MyComponent =  () => {return (<View><Text style={{ fontSize: 20 }}>开发者演示专用</Text></View>)
}

上面类似写法,我们会发现当样式很复杂的情况下,文件结构会变的很臃肿,而且在一定程度上降低开发效率。

Tailwind CSS 语法是什么?

形如下面class语法,通过语义化符号代替一系列css样式

w-24表示width:24px; 
h-24表示height:24px;
p-8表示padding: 8px;
.......
<figure class="md:flex bg-slate-100 rounded-xl p-8 dark:bg-slate-800"><img class="w-24 h-24 rounded-full mx-auto" src="/sarah-dayan.jpg" alt="" width="384" height="512"><div class="pt-6 text-center space-y-4"><blockquote><p class="text-lg font-medium">React Native支持Tailwind CSS 语法</p></blockquote><div class="text-sky-500 dark:text-sky-400">Sarah</div><div class="text-slate-700 dark:text-slate-500">Staff</div></div>
</figure>
  1. Tailwind CSS是一个实用优先(utility-first)的CSS框架,它与传统的CSS框架如Bootstrap、Element UI等有所不同。

  2. Tailwind CSS的核心理念是提供一套完整的、最小单位的工具类CSS,开发者可以直接在HTML中组合这些工具类来快速构建页面,而无需编写自定义的CSS。

  3. 使用Tailwind CSS,开发者可以直接在HTML中使用诸如"p-4"、“bg-white”、"flex"等语义化的工具类,这些类会被自动转换为对应的CSS属性。这种方式比传统的CSS编写更加直观和高效。

  4. Tailwind CSS还提供了对响应式设计的良好支持,开发者可以在工具类中添加前缀如"sm:"、"md:"等,来针对不同屏幕尺寸设置不同的样式。这比传统的媒体查询写法更加简单。

  5. Tailwind CSS还支持诸如hover、focus等状态类,以及深色模式等特性,使得样式的编写和维护更加方便。

总的来说,Tailwind CSS是一个新型的CSS框架,它通过提供大量的工具类来帮助开发者快速构建页面,同时也提供了良好的响应式支持和状态管理能力。它与传统的CSS框架有所不同,但能够大幅提高前端开发的效率。在web端,已经有了很成熟的使用,可以在这里看看官网说明,参考具体属性对应的简便写法:https://www.tailwindcss.cn/

遗憾的是官方并没有对React Native的支持。在React Native中使用Tailwind CSS并不是直接支持的方式,因为Tailwind CSS是一个针对Web开发的CSS框架,而React Native是用于原生移动应用开发的框架,两者并不直接兼容。就如开头的展示在React Native中,通常会使用内联样式或StyleSheet来定义组件的样式,而不是像Web开发中那样使用类名。

那我们想要实现这种写法该怎么办?

二、引入使用

其实从原理上讲,我们可以通过自己去制定一些映射语义化的规则,首先通过将整体的字符串分割出很多语义化小块,然后再一一映射出react-native 风格 style 的对象即可。

// 封装方法
const getTailWindCss = (styleString) => {const styles = {};const fieldMap = {w: 'width',h: 'height',p: 'padding'}const tailWindCssLists = (styleString).split(' ');console.log('tailWindCssLists', tailWindCssLists)tailWindCssLists.forEach(item => {const [field, value] = item.split('-');styles[fieldMap[field]] = Number(value);});return styles;
}// 实际调用
const tailWindCss = 'w-24 h-24 p-8';
const formatStyles = getTailWindCss(tailWindCss);
console.log('formatStyles', formatStyles)

在这里插入图片描述

这样,我们就实现了这种Tailwind Css语义化的写法,但是如果我们自己做起来还是比较麻烦的;

继续探索全球程序员交友平台Github,最终发现了twrnc
可以使用twrnc三方库支持语法,TailwindCSS + React Native的一个简单,用TypeScript编写的富有表现力的API实现。
Github地址:https://github.com/jaredh159/tailwind-react-native-classnames

集成到项目中之后,我们就能够像下面这样进行基础的使用:

import { View, Text } from 'react-native';
import tw from 'twrnc';const MyComponent = () => (<View style={tw`p-4 android:pt-2 bg-white dark:bg-black`}><Text style={tw`text-md text-black dark:text-white`}>Hello World</Text></View>
);
  • 完全支持所有原生 RN 样式和 Tailwind 对应项:(视图、布局、图像、阴影和文本)。
  • 与 Tailwind CSS v3 和 v2 兼容
  • 基于 classnames 包 API 的灵活条件样式
  • vw 和 vh 单位支持: h-screen min-w-screen w-[25vw] 等
  • 暗模式支持: bg-white dark:bg-black
  • 媒体查询支持:( w-48 lg:w-64 min-w-[600px]:flex-wrap )
  • 设备方向前缀支持: portrait:flex-col landscape:flex-row
  • 支持 tailwind.config.js 完整配置
  • 支持平台处理,平台前缀: android:mt-4 ios:mt-2
    等等…
三、原理深究
  • tw`xxxx`到底做了什么事情?
    首先我们回顾下es6里边的模版字符串语法
`string text``string text line 1string text line 2``string text ${expression} string text`tagFunction`string text ${expression} string text`

大家平时有没有用过第四种模版字符串,通过一个方法的函数调用模版字符串
下面这个是一个调用结果
在这里插入图片描述
带标签的模板是模板字面量的一种更高级的形式,它允许你使用函数解析模板字面量。标签函数的第一个参数包含一个字符串数组,其余的参数与表达式相关。你可以用标签函数对这些参数执行任何操作,并返回被操作过的字符串(或者,也可返回完全不同的内容)。用作标签的函数名没有限制。

从这里我们能够看到tw语法就是一个常规的模版字符串。
到这里我们其实可以基本去猜测下,tw其实只是将我们传入的字符串转换成了react-native中原生的样式,也就是我们最开始验证的猜想的转换方法getTailWindCss

我们也可以看看验证下tw执行后的返回值:
打印tw执行结果: console.log(‘tw style result’, twflex justify-center items-center bg-[#eee] h-1 w-4)
能够看到返回值如下:
在这里插入图片描述
这个返回值就是react-native原生的样式书写规则

四、更多特性说明
  • tw.style
    不仅仅最开始及上面描述的的基础用法,tw 还能够支持通过API tw.style进行 classnames 风格使用
// pass multiple args
tw.style('text-sm', 'bg-blue-100', 'flex-row mb-2');
// arrays of classnames work too
tw.style(['text-sm', 'bg-blue-100']);
// falsy stuff is ignored, so you can do conditionals like this
tw.style(isOpen && 'bg-blue-100');
// { [className]: boolean } style - key class only added if value is `true`
tw.style({'bg-blue-100': isActive,'text-red-500': invalid,
});
// or, combine tailwind classes with plain react-native style object:
tw.style('bg-blue-100', { resizeMode: `repeat` });
// mix and match input styles as much as you want
tw.style('bg-blue-100', ['flex-row'], { 'text-xs': true }, { fontSize: 9 });

如果需要一些tw不支持的样式,或者只是想执行一些自定义运行时逻辑,则可以将原始 RN 样式对象传递给 tw.style() ,它们将与从任何其他实用程序类生成的样式合并:

tw.style(`mt-1`, {resizeMode: `repeat`,width: `${progress}%`,
});
// -> { marginTop: 4, resizeMode: 'repeat', width: '32%' }
  • tailwind.config.js自定义配置:
import { create } from 'twrnc';
const tw = create(require('../../../tailwind.config.js'));
export default tw;
// tailwind.config.js
module.exports = {content: ['./src/**/*.{js,jsx,ts,tsx}'],theme: {fontFamily: {},screens: {sm: '380px',md: '420px',lg: '680px',// or maybe name them after devices for `tablet:flex-row`tablet: '1024px',},},plugins: []
}
  • useDeviceContext
    默认情况下,如果您按照上述方式使用 useDeviceContext() ,您的应用将响应设备配色方案(在系统偏好设置中设置)中的环境变化。如果您希望使用某种应用内机制显式控制应用的配色方案,则需要稍微以不同的方式进行配置。
  • useAppColorScheme
    获取系统的主题色,然后进行自定义主色配置
五、Vscode配置提示自动完成

增加vscode配置项setting.json,输入tw`能够自动提示tailwind语法,快速开发,明显的效率提升。

    "tailwindCSS.experimental.classRegex": ["tw`([^`]*)",["tw.style\\(([^)]*)\\)", "'([^']*)'"]],"tailwindCSS.classAttributes": ["style"],

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/6285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebDriver使用带用户名密码验证的IP代理解决方案

背景&#xff0c;使用python3 selenium 先定义一个方法&#xff0c;这里主要用到了chrome插件的功能&#xff0c;利用这个插件来放进代理内容。 def create_proxy_auth_extension(proxy_host, proxy_port,proxy_username, proxy_password, schemehttp):manifest_json "…

基于.NET WinForms 数据的CURD实现

开发工具 VS 2022 C#&#xff0c;数据库MS SQL SERVER 2019 1.WinForms界面 2.使用SqlDataApater DataSet DataGridView 读取数据 private void ReadData() {//数据库连接串string strConn "Data Source127.0.0.1;Initial CatalogTEST;Persist Security InfoTrue;Us…

管道?是浇筑水泥的管道? ^v^‘

文章目录 序言目的进程间通信的理解进程间通信的发展历史管道创建验证管道的大小管道的4种情况管道的5种特征 序言 通过该命令计算了在当前路径下一共有多少个文件夹的任务 进程虽然有独立性,但是进程并不孤僻,他们之间也会相互进行协作共同完成一件事 这个前提是他们之间的信…

【云原生】Docker 实践(五):搭建私有镜像 Harbor

【Docker 实践】系列共包含以下几篇文章&#xff1a; Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用Docker 实践&#xff08;二&#xff09;&#xff1a;什么是 Docker 的镜像Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerf…

如何在Mac上恢复格式化硬盘的数据?

“嗨&#xff0c;我格式化了我的一个Mac硬盘&#xff0c;而没有使用Time Machine备份数据。这个硬盘被未知病毒感染了&#xff0c;所以我把它格式化为出厂设置。但是&#xff0c;我忘了备份我的文件。现在&#xff0c;我想恢复格式化的硬盘驱动器并恢复我的文档&#xff0c;您能…

AJ-Report开源数据大屏 verification;swagger-ui RCE漏洞复现

0x01 产品简介 AJ-Report是一个完全开源的BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑。多数据源支持,内置mysql、elasticsearch、kudu等多种驱动,支持自定义数据集省去数据接口开发,支持17+种大屏组件,不会开发,照着设计稿也可以制作大屏。三…

SVM单类异常值检测

SVM是一种广泛使用的分类器&#xff0c;通常用于二分类或多分类问题。然而&#xff0c;在异常点检测的场景中&#xff0c;我们通常会将数据视为一个类别&#xff08;即正常数据点&#xff09;&#xff0c;并尝试找到那些与正常数据点显著不同的点&#xff08;即异常点&#xff…

Vue Vant 移动端如何禁止手机调起自带的输入键盘

前言 前不久在公司用Vue2开发了一个手机充值项目&#xff0c;键盘组件用的vant2的NumberKeyboard 数字键盘组件&#xff1b;上线后在IOS端只有一个vant数字键盘组件&#xff0c;但到了Android端&#xff0c;输入框一获取焦点不仅vant数字键盘弹出&#xff0c;连手机自带的键盘…

华为平板手机如何清理应用市场的存储空间

如何清理应用市场的存储空间 适用产品&#xff1a; 手机&#xff0c;平板 适用版本&#xff1a;不涉及系统版本 如果您的应用市场显示应用的数据较大&#xff0c;可能是下载的安装包没有安装成功&#xff0c;导致安装包未自动删除。&#xff08;可参考&#xff1a;应用市场下…

117篇 | 3D Gaussian Splatting论文

本论文集划分为4个部分&#xff1a;综述&基础&#xff08;14篇&#xff09;、NeRF在AIGC&#xff08;54篇&#xff09;、NeRF在SLAM&#xff08;自动驾驶&#xff09;&#xff08;25篇&#xff09;、NeRF之场景建模&#xff08;25篇&#xff09; https://t.zsxq.com/3ATyE…

【UnityRPG游戏制作】NPC交互逻辑、动玩法

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

R语言数据探索与分析-运用时间序列预测模型对成都市API进行预测分析

一、研究背景 “绿水青山就是金山银山&#xff0c;要让绿水青山变成金山银山”让人们深刻的意识到环境的重要性。与此同时&#xff0c;由于现代生活水平的不断提高&#xff0c;所带来的环境污染也不断增多&#xff0c;空气以及环境的污染带来了越来越多的疾病&#xff0c;深刻…

vue2项目webpack3.x打包文件分割优化加载

vue2项目webpack3.x打包文件分割优化加载 0. 项目目录和依赖信息1. 开启 gzip&#xff08;建议&#xff09;2. vue2项目配置懒加载&#xff08;建议&#xff09;3. 拆分 vendor 包注意&#xff1a;webpack3使用CommonsChunkPlugin实现 本文使用 3 种方案进行叠加优化 优先级按以…

AI大模型探索之路-训练篇11:大语言模型Transformer库-Model组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

39 死锁

目录 1.死锁 2.线程同步 3.条件变量 4.案例 死锁 概念 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态 四个必要条件 互斥条件&#xff1a;一个资源每次只能被一个执行流使用 请求…

如何快速搭建nginx服务

华子目录 nginx简介概念特点nginx框架nginx关键工作机制 nginx正向代理功能nginx反向代理功能nginx反向代理的工作流程代理本质 nginx负载均衡部署nginx常用命令systemctl系列nginx自带命令 nginx配置文件主配置文件/etc/nginx/nginx.conf内容结构模块分析配置分析注意示例 ngi…

tomcat打开乱码修改端口

将UTF-8改成GBK 如果端口冲突&#xff0c;需要修改tomcat的端口

电脑找不到msvcp140.dll如何修复?msvcp140.dll丢失的多种解决方法分享

在日常电脑操作过程中&#xff0c;用户可能会遇到一个令人困扰的问题&#xff0c;即屏幕上突然弹出一条错误提示&#xff1a;“由于找不到msvcp140.dll&#xff0c;无法继续执行代码”。这一情况往往导致应用程序无法正常启动或运行&#xff0c;给工作和娱乐带来不便。不过&…

ps科研常用操作,制作模式图 扣取想要的内容元素photoshop

复制想要copy的图片&#xff0c; 打开ps---file-----new &#xff0c;ctrolv粘贴图片进入ps 选择魔棒工具&#xff0c;点击想要去除的白色区域 然后&#xff0c;cotrol shift i&#xff0c;反选&#xff0c; ctrol shiftj复制&#xff0c;复制成功之后&#xff0c;一定要改…

Vitis HLS 学习笔记--HLS眼中的完美循环嵌套

目录 1. 简介 2. 示例 2.1 不完美循环 2.2 完美循环 2.3 HLS 眼中的循环 3. 总结 1. 简介 在处理嵌套循环时&#xff08;HDL或HLS工具中&#xff09;&#xff0c;优化循环结构对于实现最佳性能至关重要。嵌套循环的性能优化直接影响着计算的时延和资源利用率。创建完美嵌…