antd组件的格式化css样式

本文叙述了如何解决前端开发中经常遇到的一个棘手问题,即:如何修改antd组件内部元素的样式。

以Input组件为例,如果我想通过下面这种方式设置input组件的样式,是实现不了目的的!

jsx 复制代码
      <Input
        style={{
            background: `${error ? '#fff' : 'auto'}`,
            borderColor: `${error ? '#ff4d4f' : 'auto'}`,
        }}
        className={`${error ? 'input-status-error' : ''}`}
        {...props}
      ></Input>

原因也很简单,antd提供的Input组件本质上是span>input,所以style实际上设置到了wrapper组件也就是外面的span上面。

这就尴尬了,因为有时候确实是需要修改被包裹的input的样式的。

这个时候一般来说有两种做法:

做法一:使用styled-components

如下所示:

jsx 复制代码
import styled from 'styled-components';
const IInput = styled(Input)`
    input.input-status-error {
        background: #fff;
        borderColor: #ff4d4f;
    }
`;

<IInput
    className={`${error ? 'input-status-error' : ''}`}
    {...props}
></IInput>

做法二:使用less

如下所示:

jsx 复制代码
import styled from 'styled-components';
<Input
    className={`${error ? 'input-status-error' : ''}`}
    {...props}
></Input>
less 复制代码
input.input-status-error {
    background: #fff;
    borderColor: #ff4d4f;
}

这两个办法都有各自的缺点:

styled方法会动态生成className,这意味着你可能会遇到由于其动态修改className导致使用input输入文字的过程中,无缘无故的失去焦点,这对于交互是不可忍受的!

less方法最大的问题就是,它可能并不会生效!

好在antd升级之后提出了解决方案:

也就是说可以使用styles做结构性样式的设置(注意这里是styles而不是style!)

这样如果想要修改Input中包裹的input组件的样式,写成下面就可以了!

jsx 复制代码
      <Input
        styles={{
          input: {
            background: `${error ? '#fff' : 'auto'}`,
            borderColor: `${error ? '#ff4d4f' : 'auto'}`,
          },
        }}
        className={`${error ? 'input-status-error' : ''}`}
        {...props}
      ></Input>
相关推荐
剑亦未配妥1 小时前
移动端触摸事件与鼠标事件的触发机制详解
前端·javascript
人工智能训练师7 小时前
Ubuntu22.04如何安装新版本的Node.js和npm
linux·运维·前端·人工智能·ubuntu·npm·node.js
Seveny077 小时前
pnpm相对于npm,yarn的优势
前端·npm·node.js
yddddddy8 小时前
css的基本知识
前端·css
昔人'8 小时前
css `lh`单位
前端·css
前端君9 小时前
实现最大异步并发执行队列
javascript
Nan_Shu_61410 小时前
Web前端面试题(2)
前端
知识分享小能手10 小时前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
蚂蚁RichLab前端团队11 小时前
🚀🚀🚀 RichLab - 花呗前端团队招贤纳士 - 【转岗/内推/社招】
前端·javascript·人工智能
孩子 你要相信光11 小时前
css之一个元素可以同时应用多个动画效果
前端·css