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 1
 string 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"
    ],

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】Tutorial on Diffusion Models for Imaging and Vision

1.The Basics: Variational Auto-Encoder 1.1 VAE Setting 自动编码器有一个输入变量x和一个潜在变量z Example. 获得图像的潜在表现并不是一件陌生的事情。回到jpeg压缩&#xff0c;使用离散余弦变换&#xff08;dct&#xff09;基φn对图像的底层图像/块进行编码。如果你给…

4 Spring AOP

目录 AOP 简介 传统开发模式 先来看一个需求 解决方案 AOP 图示 Spring 启用 AspectJ 基于 xml 配置 创建 pom.xml 创建 UserService 借口和 UserServiceImpl实现类 创建 LogAdvice 日志通知 创建 log4j.properties 重点&#xff1a;创建 spring-context-xml.xml 配…

【深度学习】第二门课 改善深层神经网络 Week 2 3 优化算法、超参数调试和BN及其框架

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;深度学习 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对…

Go语言基础语法(一):变量的声明与赋值

四种声明 变量声明 Go语言是静态类型语言&#xff0c;因此变量&#xff08;variable&#xff09;是有明确类型的&#xff0c;编译器也会检查变量类型的正确性。在数学概念中&#xff0c;变量表示没有固定值且可改变的数。但从计算机系统实现角度来看&#xff0c;变量是一段或…

Simulink|【免费】虚拟同步发电机(VSG)惯量阻尼自适应控制仿真模型

主要内容 该模型为simulink仿真模型&#xff0c;主要实现的内容如下&#xff1a; 随着风力发电、光伏发电等新能源发电渗透率增加&#xff0c;电力系统的等效惯量和等效阻尼逐渐减小&#xff0c;其稳定性问题变得越来越严峻。虚拟同步发电机&#xff08;VSG&#xff09;技…

win10部署本地大模型langchain+ollama

一、环境 windows10、Python 3.9.18、langchain0.1.9 二、ollama下载 Download Ollama on Windows 0.1.33版本链接https://objects.githubusercontent.com/github-production-release-asset-2e65be/658928958/35e38c8d-b7f6-48ed-8a9c-f053d04b01a9?X-Amz-AlgorithmAWS4-H…

ubuntu搭建node私库Verdaccio

ubuntu搭建node私库Verdaccio Verdaccio 是一个轻量级的私有 npm 代理注册服务器&#xff0c;它是开源的&#xff0c;可以帮助你设置和维护企业内部的 npm 包的存储库。使用 Verdaccio 可以让你完全控制包的发布流程、依赖关系以及访问策略。这篇文章将指导你如何在 Ubuntu 系…

SQL注入漏洞扫描---sqlmap

what SQLMap是一款先进的自动执行SQL注入的审计工具。当给定一个URL时&#xff0c;SQLMap会执行以下操作&#xff1a; 判断可注入的参数。判断可以用哪种SQL注入技术来注入。识别出目标使用哪种数据库。根据用户的选择&#xff0c;读取哪些数据库中的数据。 更详细语法请参考…

领域驱动设计(DDD)笔记(三)后端工程架构

文章链接 领域驱动设计(DDD)笔记(一)基本概念-CSDN博客领域驱动设计(DDD)笔记(二)代码组织原则-CSDN博客领域驱动设计(DDD)笔记(三)后端工程架构-CSDN博客前导 领域驱动设计(Domain Driven Design,简称DDD)是业内主导的业务工程理论。它在各中权威人士被广泛讨论…

leetcode_43.字符串相乘

43. 字符串相乘 题目描述&#xff1a;给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 &q…

好用的AI工具推荐与案例分析

你用过最好用的AI工具有哪些&#xff1f; 简介&#xff1a;探讨人们在使用AI工具时&#xff0c;最喜欢的和认为最好用的工具是哪些&#xff0c;展示AI技术的实际应用和影响。 方向一&#xff1a;常用AI工具 在选择常用AI工具时&#xff0c;可以根据不同的应用场景和需求来挑选…

【1小时掌握速通深度学习面试3】RNN循环神经网络

目录 12.描述循环神经网络的结构及参数更新方式&#xff0c;如何使用神经网络对序列数据建模? 13.循环神经网络为什么容易出现长期依赖问题? 14.LSTM 是如何实现长短期记忆功能的? 15.在循环神经网络中如何使用 Dropout ? 16.如何用循环神经网络实现 Seg2Seq 映射? …

手撕vector的模拟实现

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

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

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

光头强:IBM收购HashCorp (Terraform)有多大意义?

StrongBear公司在光头强强总以及合伙人熊大熊二的艰苦努力下&#xff0c;最近公司进了一次扩容。甚至将原来一些甲方的研发人员也拉入旗下&#xff0c;其中就包括与熊二共事多年的小玲子以及小强同学。 光头强也注意到最近在IT软件领域&#xff0c;频频发生一些并购事件。比如…

SAP_SD模块-销售批次策略应用记录

一、销售批次查找策略的重要性 批次查找策略允许企业在销售过程中根据预定义的规则自动选择最适合的产品批次。这种策略的实施&#xff0c;对企业尤其是那些涉及到严格产品质量与安全标准的行业&#xff08;如食品、药品及化工产品&#xff09;具有以下几方面的重要意义&#x…

不尝试一下?计算机领域两大赛事来了!!

前言 最近&#xff0c;熊二新来的同事小强比较关注国内的一些赛事信息。这不&#xff0c;近期有两大赛事。这两大赛事&#xff0c;主要还是面向高校学生的。一个是搞网络安全方向的: 第二届京麒CTF挑战赛&#xff0c;另一个是搞数据库方向的: 2024年全国大学生计算机系统能力大…

【大数据】学习笔记

文章目录 [toc]NAT配置IP配置SecureCRT配置PropertiesTerminal Java安装环境变量配置 Hadoop安装修改配置文件hadoop-env.shyarn-env.shslavescore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xml 环境变量配置 IP与主机名映射关系配置hostname配置映射关系配置 关闭防火墙…

基于Springboot的校运会管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校运会管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…

第2章 WebServer进阶

2.1 使用多线程处理多用户请求 2.1.1 多线程Socket通信 在上一章的案例中&#xff0c;服务端显然只能处理一次浏览器请求&#xff0c;请求一次浏览器端就结束程序。如何解决这个问题呢&#xff1f;可以采用多线程Socket通信技术&#xff0c;解决多用户并发请求。 在多线程Sock…