React -css in js框架style-components

2023-10-26

原文:https://www.jianshu.com/p/27788be90605

前言

      前端飞一般的发展中,衍生出各式各样的框架,框架的目的是减轻开发人员的开发难度,提高效率。以前网页开发的原则是关注点分离,意思是各种技术只负责自己的领域,不要混合在一起,形成耦合。如html、css、js代码分离。
      React的出现,这个原则不在实用,React是组件结构,强制把html、css、js写在一起。如:

const style = {
    'color': 'red',
    'fontSize': '46px'
};

const clickHandler = () => alert('hi');

ReactDOM.render(
    <h1 style={style} onclick={clickHandler}>
        Hello, world!
    </h1>,
    document.getElementById('example')
);

      上面代码在一个js文件里,封装了结构、样式、逻辑,完全违背了关注点分离,很多人刚开始学习React很不适应,但是,这有利于组件的隔离,每个组件需要的代码不依赖于外部、组件之间没有耦合,方便复用。使用React的越来越多,组件模式深入人心,这种关注点混合的新写法逐渐成为主流。

关注点混合


      表面上,React的写法是html、css、js混合写在一起,实际上是用js在写html、css。React对html的封装是jsx,那么对css的封装是什么呢?这就涉及到今天需要讲的内容style-components

 

css in js

什么是style-components

      style-components是针对React写的一套css in js框架,简单来讲就是在js中写css。相对于与预处理器(sass、less)的好处是,css in js使用的是js语法,不用重新再学习新技术,也不会多一道编译步骤。无疑会加快网页速度。如果有sass或less的开发经验,几分钟就可以学会style-components。

style-components

官方文档

https://www.styled-components.com/docs/basics

1. 安装

npm install --save style-components

2. 基础用法

      style-components最基础的用法就是以组件的形式编写样式,如下:

import styled from 'styled-components';

const HomeWrapper = styled.div `
  width: 960px;
  margin: 0 auto;
  overflow: hidden;
`;
const HomeLeft = styled.div `
  float: left;
  width: 625px;
  margin-left: 15px;
  padding-top: 30px;
  .bannder-img {
    width: 625px;
    height: 270px;
  }
`;
const HomeRight = styled.div `
  float: right;
  width: 280px;
  margin-left: 15px;
  padding-top: 30px;
`;

render () {
    return (
        <HomeWrapper>
            <HomeLeft>
                left
            </HomeLeft>
            <HomeRight>
                right
            </HomeRight>
        </HomeWrapper>
    )
}

上面的代码定义了三个组件,分别为HomeWrapper 、HomeLeft 、HomeRight,这样每一个组件对应唯一的样式,不在出现样式污染的情况。

2. 全局样式

      每一个组件对应唯一的样式,那么需要设置全局样式怎么办呢?style-components的最新版提供了createGlobalStyle可以设置全局样式,如下:

import { createGlobalStyle } from 'styled-components';

const GrobalStyle = createGlobalStyle `
  html, body, div, span, applet, object, iframe,
    h1, h2, h3, h4, h5, h6, p, blockquote, pre,
    a, abbr, acronym, address, big, cite, code,
    del, dfn, em, img, ins, kbd, q, s, samp,
    small, strike, strong, sub, sup, tt, var,
    b, u, i, center,
    dl, dt, dd, ol, ul, li,
    fieldset, form, label, legend,
    table, caption, tbody, tfoot, thead, tr, th, td,
    article, aside, canvas, details, embed, 
    figure, figcaption, footer, header, hgroup, 
    menu, nav, output, ruby, section, summary,
    time, mark, audio, video {
        margin: 0;
        padding: 0;
        border: 0;
        font-size: 100%;
        font: inherit;
        vertical-align: baseline;
    }
    /* HTML5 display-role reset for older browsers */
    article, aside, details, figcaption, figure, 
    footer, header, hgroup, menu, nav, section {
        display: block;
    }
    body {
        line-height: 1;
    }
    ol, ul {
        list-style: none;
    }
    blockquote, q {
        quotes: none;
    }
    blockquote:before, blockquote:after,
    q:before, q:after {
        content: '';
        content: none;
    }
    table {
        border-collapse: collapse;
        border-spacing: 0;
    }
    
    @font-face {
      font-family: 'iconfont';  /* project id 897264 */
      src: url('//at.alicdn.com/t/font_897264_7ma62sn10m3.eot');
      src: url('//at.alicdn.com/t/font_897264_7ma62sn10m3.eot?#iefix') format('embedded-opentype'),
      url('//at.alicdn.com/t/font_897264_7ma62sn10m3.woff') format('woff'),
      url('//at.alicdn.com/t/font_897264_7ma62sn10m3.ttf') format('truetype'),
      url('//at.alicdn.com/t/font_897264_7ma62sn10m3.svg#iconfont') format('svg');
    }
    .iconfont {
      font-family:"iconfont" !important;
      font-size:16px;
      font-style:normal;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
    }
    
    .clearfix:after {visibility: hidden;display: block;font-size: 0;content: ".";clear: both;height: 0;}
    .clearfix {zoom: 1;}
`;

render() {
    return (
        <Fragment>
            <Provider>...</Provider>
            <GrobalStyle/>
        </Fragment>
    )
}

上面的代码GrobalStyle是全局样式组件,只需在React组件的最外层引入即可。

3. 图片引入

      需要图片引入,如果像css一样的引入方式,会报错。正确的引入方式是import导入,再以变量的方式引入,如下:

import styled from 'styled-components';
import logPic from '../../statics/images/logo.png';

export const Logo = styled.div `
  position: absolute;
  top: 0;
  left: 0;
  width: 100px;
  height: 56px;
  background-image: url(${logPic});  
  background-size: contain;
`;

上面的代码logPic是存放logo图片地址的变量,只需使用${logPic}的方式引入即可。如果是后台传过来的图片,如何使用的背景图呢?

4. props

      上面提到的问题,可使用组件的传值。先看一个例子:

recommendList.map((item) => {
    return <RecommendItem key={item} imgUrl={item}/>
})

const RecommendItem = styled.div `
  width: 280px;
  height: 50px;
  background-image: url(${(props) => props.imgUrl});
  background-size: contain;
`;

从上面的例子,不难发现,父组件传入的值,会存放在子组件的props中,故操作props便能得到预期效果。

5. 标签属性

      使用style-components,需要使用标签属性,如input 的placeholder,a标签的href等,style-components提供了属性attrs,如下:

export const NavSearch = styled.input.attrs({
    placeholder: '搜索',
    type: 'text'
}) `
  width: 160px;
  height: 38px;
  margin-top: 9px;
  padding: 0 40px 0 20px;
  box-sizing: border-box;
  background-color: #eee;
  outline: none;
  border: none;
  border-radius: 19px;
  color: #666;
  &::placeholder {
    color: #999;
  }
  &.focused {
    width: 240px;
  }
`;

上面的代码,attrs里面是一个对象,如果需要多个属性,以对象的形式添加即可。

6. 塑造组件

      有一种情况,一些原本就已经是组件,需要给这些组件添加样式,这时需要用到塑造组件,如下:

const Link = ({className , children}) => (
    <a className={className}>
        {children}
    </a>
)

const StyledLink = styled(Link)`
    color: palevioletred;
`
render(
    <div>
        <Link>普通组件</Link>
        <StyledLink>添加了样式的组件</StyledLink>
    </div>
);

7. 继承

      如果某一组件的样式会用到多个地方,不能每个地方都重新写一套样式,这样代码不够优雅。比如:一个button,有warning、有default、有primary等,这个button只是颜色不同,其他样式一样,这里便可用到继承。

const Button = styled.button`
    line-height: 1.499;
    display: inline-block;
    font-weight: 400;
    text-align: center;
    -ms-touch-action: manipulation;
    touch-action: manipulation;
    cursor: pointer;
    background-image: none;
    border: 1px solid transparent;
    white-space: nowrap;
    padding: 0 15px;
    font-size: 14px;
    border-radius: 4px;
    height: 32px;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    -webkit-transition: all .3s cubic-bezier(.645,.045,.355,1);
    transition: all .3s cubic-bezier(.645,.045,.355,1);
    position: relative;
    -webkit-box-shadow: 0 2px 0 rgba(0,0,0,.015);
    box-shadow: 0 2px 0 rgba(0,0,0,.015);
    color: rgba(0,0,0,.65);
    background-color: #fff;
    border-color: #d9d9d9;
`;
const ButtonPrimary = styled(Button)`
    color: #fff;
    background-color: #1890ff;
    border-color: #1890ff;
`;
const ButtonWarning = styled(Button)`
    color: #f5222d;
    background-color: #f5f5f5;
    border-color: #d9d9d9;
`;

有人说,公用样式的组件完全可以写到全部样式里面,设置不同的class。这样做可行,但是为什么不直接去写css呢?

8. 动画

      官网上有这样一个例子,如下:

const rotate = keyframes`
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
`;

const Rotate = styled.div`
  display: inline-block;
  animation: ${rotate} 2s linear infinite;
  padding: 2rem 1rem;
  font-size: 1.2rem;
`;

render(
    <Rotate>&lt; ? &gt;</Rotate>
);

个人觉得,如果是简单的动画,直接以这样的方式去做,即可,如果动画比较复杂,建议使用react-transition-group框架有更好的体验。

总结

      style-components的常用用法介绍完成,当然官网上还有一些其他的用法,有兴趣可以了解下。使用style-components会随机生成一个class名称,这样不会污染到全局变量,当然因为随机生成,维护会增加难度,期待下一版能解决这个问题。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React -css in js框架style-components 的相关文章

  • 关于Vue.js和React.js,听听国外的开发者怎么说?

    VueJS 与 ReactJS 到底怎么样如何 听听别人怎么说 使用所有新的库和框架 很难跟上所有这些库和框架 也就是说 这就需要您决定哪些是值得花时间的 让我们看看人们说什么 和Vue JS一起工作是很愉快的 我发现学习曲线很浅 然而 这
  • React-(4)React中的事件绑定

    React中的事件绑定 在 React 组件中 每个方法的上下文都会指向该组件的实例 即自动绑定 this 为当前组件 而且 React 还会对这种引用进行缓存 以达到 CPU 和内存的最优化 在使用 ES6 classes 或者纯函数时
  • React的超详细讲解

    React React的重点 webpack webpack 是一个现代 JavaScript 应用程序的静态模块打包器 module bundler 当 webpack 处理应用程序时 它会递归地构建一个依赖关系图 dependency
  • react和react jsx基础

    本文是个人学习笔记 例子都是来自React Native官网 之前不是做前端的 没有使用过react 要学习react native做混合开发 react 包括react jsx还是得补补 react和react jsx react是一个j
  • React核心概念:状态提升

    上一节 表单 下一节 组合vs继承 React核心概念 状态提升 引言 添加第二个输入框 编写转换函数 状态提升 经验总结 引言 很多情况下我们使用的多个组件需要对同一个数据做出对应的反应 在这里我们推荐把这个共享的状态提升到距离这些组件最
  • React官方文档--Lifting State Up

    Lifting State Up 如果 几个组件需要同时影响并且修改同一个数据 我们建议将这个共享状态进行提升 给他们最近的共同祖先 在这个部分 我们将要创建一个温度计算器来判断水会不会在给定温度下沸腾 我们将从一个叫做BoilingVer
  • 样式需要时间加载 - Next.js

    当我输入我的作品集时 它会加载未样式化的 html 页面 并且仅在几秒钟后才会加载样式 我该如何解决这个问题 注意 我正在使用样式组件 When I enter the page After a few seconds 我尝试寻找样式组件与
  • 在样式化组件中使用 Ant Design 变量

    我在用蚂蚁设计和这个结合样式组件里面的一个GatsbyJS地点 我希望能够访问 Ant Design 变量 它们是用Less 在样式组件内 像这样的事情 const StyledButton styled Button background
  • React Jsx转换成真实DOM过程?

    面试官 说说React Jsx转换成真实DOM过程 一 是什么 react 通过将组件编写的 JSX 映射到屏幕 以及组件中的状态发生了变化之后 React 会将这些 变化 更新到屏幕上 在前面文章了解中 JSX 通过 babel 最终转化
  • 如何提高React组件的渲染效率的?在React中如何避免不必要的render?

    面试官 说说你是如何提高组件的渲染效率的 在React中如何避免不必要的render 一 是什么 react 基于虚拟 DOM 和高效 Diff 算法的完美配合 实现了对 DOM 最小粒度的更新 大多数情况下 React 对 DOM 的渲染
  • 将全局样式表移至 中的样式组件上方

    我目前import在我的一个组件中使用 CSS 文件 这些样式表添加为link标签在 并将在全球范围内推出 import src styles normalize module css 我也在使用样式组件 目前 link全局CSS生成的标签
  • 将背景 url 作为 prop 传递给样式组件

    我有以下代码 flow import React from react import Route from react router dom import Split from components grouping Split impor
  • 临时反应组件中的样式组件

    我在反应中的临时包装器中使用样式组件时遇到两个问题 组件已渲染 但不使用背景颜色 ComponentWithAddedColors 不是有效的打字稿 不知道为什么 有谁可以帮忙解决这个问题吗 interface IProps id stri
  • 看来您正在将关键帧声明(hVshE)插入到未标记的字符串中

    大家晚上好 我的样式组件库有一个无法纠正的错误 错误 您似乎正在插入关键帧声明 hVshE 成一个未标记的字符串 styled components v3 支持这一点 但 v4 不再支持 因为现在注入了关键帧 一经请求 请将您的字符串包装在
  • 将 prop 传递给样式组件

    我正在尝试找到一种方法来动态创建 居中此 div 组件 这段代码目前可以工作 但有点冗长而且不是很干 const Rel styled div position relative height 100 width 100 const Abs
  • 样式组件中的CSS' calc() [重复]

    这个问题在这里已经有答案了 尝试这个 const styledDiv styled div props gt props takeViewportHeight min height calc 100vh 16px 它不起作用 我是否遗漏了样
  • 在样式组件 ReactJS 上导入 font-face

    I use styled component用于我的 ReactJS 应用程序上的库 css 我想要 font face但不工作 code on GlobalStyle js import createGlobalStyle from st
  • 样式使 NavLink 在 React 中“不可点击”

    我正在尝试设计一个react router dom NavLink 导航栏 我已经采用了几种不同的方法 但在每种情况下 无论我选择什么方式 都会使 NavLink 不可点击 它将是一个样式精美的框 不会通过单击进行导航 我采取了以下几种方法
  • ReactJS:在 box-shadow 中使用 rgba 和 styled-components 道具不起作用

    我正在建造一个ReactJS地点和使用样式组件 with ThemeProvider 所以我的背景颜色或颜色CSS代码是这样的background color props gt props theme background 现在我想创建一个
  • 找不到模块“styled-components/native”的声明文件

    如果你添加styled components对于您的 React Native 项目 有一个专门用于本机组件的子目录 import styled from styled components native export const Cont

随机推荐

  • UE4-蓝图基础:TimeLine

    一 概念 1 TimeLine 在一定时间内不断执行的一个蓝图节点 2 添加一个空白节点 函数讲解 Play 事件驱动 执行此事件时调用 Play from Start 从头开始执行事件 lt 事件在执行过程中未执行完毕 某一条件改变 事件
  • 回路电感详细介绍(环路电感)

    相比于硬件工程师 PCB工程师对环路电感更敏感 因为环路电感和走线强相关 不管是信号完整性还是电源完整性都涉及到这个概念 一旦电路结构确定 环路电感也随之确定 如果环路电感初期评估失误将会给后期改版带来巨大风险 更多资料请关注公众号 工程师
  • 操作系统 java模拟主存储器空间的分配和回收

    文章目录 实验原理 算法流程图 代码 结果 实验原理 模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收 1 可变分区方式是按作业需要的主存空间大小来分割分区的 当要装入一个作业时 根据作业需要的主存量查看是否有足够的空闲空间 若有
  • 创建第一个Qt Widget项目

    创建第一个Qt Widget项目步骤 1 选择文件 Ctrl n 2 新建文件或项目 3 Qt Widget Application 4 输入项目名称FirstApplication 选择存储的位置 5 选择构建套件Desktop Qt Q
  • numpy一维数组永远为列向量

    import numpy as np a np array 1 3 4 5 print a shape a np transpose a print a shape print a a np ravel a print a shape pr
  • 静态分析简介

    一 程序静态分析简介 Program Static Analysis 程序静态分析简介 Program Static Analysis 是指在不运行代码的方式下 通过词法分析 语法分析 控制流 数据流分析等技术对程序代码进行扫描 验证代码是
  • 【mysql安装报错(已解决)】ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)

    1 说在开头 我的 mysql 版本是 8 0 27 的 安装的时候 感觉每一步都没有错 但是就是不行 到连接本地数据库时 发现一直连不上 搞了好久 一直报下面的错 ERROR 1045 28000 Access denied for us
  • 一文带你聊聊MYSQL的锁和MVCC

    如果你觉得内容对你有帮助的话 不如给个赞 鼓励一下更新 本文内容总结自极客时间 MySQL实战45讲 专栏 LBCC 单版本控制 锁 基于锁的并发控制 这种方案比较简单粗暴 就是一个事务去读取一条数据的时候 就上锁 不允许其他事务来操作 当
  • 【Python自动化】生成带装饰图形的渐变背景文字封面

    Python自动化专栏 利用文字生成固定比例且带有装饰图形的封面 文章目录 一 背景介绍 二 功能介绍 效果预览 功能清单 三 过程拆解 1 渐变背景层 2 装饰图形层 3 半透明遮罩层 4 文字层 四 完整代码 参考文档 一 背景介绍 在
  • echarts地图map下钻到镇街、KMZ文件转GeoJson、合成自定义区域

    echarts 地图map下钻到镇街 KMZ文件转GeoJson 合成自定义区域 我们可以通过 http datav aliyun com tools atlas 阿里旗下的高德地图提供的api 可以获取到中国各个省份 区级 县级的json
  • NAT技术的主要实现方式及其对网络应用程序的使用影响

    网络地址转换 NAT 是接入广域网 WLAN 的一种技术 能够将私有 保留 地址转化为合法的IP地址 它被广泛应用于各种类型Internet接入方式和各种类型的网络中 NAT的实现方式有三种 静态转换 动态转换和端口多路复用 静态转换设置起
  • Linux审计与日志安全加固

    审计和日志服务配置 auditctl 审计数据配置 日志文件最大参数 在储存策略 etc audit audit conf 中配置max log file
  • 高德地图精确查找与定位RegeocodeQuery与GeocodeQuery

    根据输入的字符串精确查找位置 用GeocodeQuery查找坐标 然后根据获取到的坐标 用RegeocodeQuery查询地址 例子中用了两个页面 一个是显示地址信息及定位的页面 另一个是搜索页面 点击搜索结果返回显示页面 显示信息并定位
  • iOS经典面试题总结--内存管理

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 我根据自己的情况做了一下总结 答案是我总结的 如有答的不好的地方 希望批评指正以及交流 谢谢 内存管理 1 什么是ARC ARC是automatic reference c
  • 【darknet】2、yolov4模型训练之模型训练

    文章目录 1 进行模型训练数据准备 1 1 划分训练和验证集 1 2 将数据标注格式转换为YOLO格式 2 修改配置文件 2 1 新建cfg vechle names 2 2 新建cfg vechle data 2 3 根据所选模型的不同
  • java连接数据库的Connection中的prepareStatement与createStatement的区别

    这两者的区别主要在于如何构造执行sql语句的对象 1 对于prepareStatement来说 其执行返回的是一个prepareStatement对象 而这个方法的描述是这样的 prepareStatement String sql 创建一
  • 在mac上安装gradle(超详细,直接按步骤操作即可轻松搞定)

    在mac上安装gradle 超详细 直接按步骤操作即可轻松搞定 第一步 就是先download最新版本的gradle 网址如下 http gradle org gradle download 然后将下载下来的zip包放解压到本地任意的路径上
  • input 标签里 value值从数据库读取出来的值显示一半或者没显示原因

    存进数据库的字符如下 读取数据出来显示如下 毒 这家超市被星巴克称为 价格警察 这段话没显示出来 原因 这样出来的是value 比海底捞服务更 毒 这家超市被星巴克称为 价格警察 input value值中的双引号被作为value值的结束符
  • 求二元函数最大值matlab,利用matlab, 二元函数求最大值

    求二元函数 z 0 2323 x 2 0 2866 2 2 0 5406 a0 2 1 0203 a0 2 x 2 x 2 y 2 0 5 tanh 2 x 2 y 2 0 5 x 2 0 5733 u0 2 的最大值 变量x和y都是在0
  • React -css in js框架style-components

    原文 https www jianshu com p 27788be90605 前言 前端飞一般的发展中 衍生出各式各样的框架 框架的目的是减轻开发人员的开发难度 提高效率 以前网页开发的原则是关注点分离 意思是各种技术只负责自己的领域 不