Ant Design如何自定义输入框(Input)组件样式

介绍

今天接到一个需求,需要自定义一个Input输入框,我们的项目使用React + Ant Design进行开发,按理说Ant Design已经提供了非常丰富的组件样式,但有时候还是无法满足特定的需求,比如我们的输入框要求渲染成下面的样子

而Ant Design的Input组件默认的渲染结果是这样的。

仔细观察这两个输入框,他们的区别如下:

  1. 输入框的样式不同,自定义的输入框要求用下划线。
  2. 必选标志(红色星号)位置不同,自定义的输入框必选标志在label的右侧。

下面我们依次来实现这两个需求:

Input组件使用下划线样式

Ant Design的Input提供了variant属性来控制输入框的样式,我们可以将其设置为underline来实现下划线样式。

tsx 复制代码
<Input
  variant="underlined" // 设置下划线样式
  style={{ width: '200px' }}
  placeholder="请输入内容"
/>

调整必选标志位置

Ant Design的Input组件并未提供相关设置,但是Form组件提供了requiredMark属性来控制必选标志的样式,我们可以通过这个属性来自行渲染必选标志,这个方式非常灵活,可以渲染成任何你想要的样子。

首先定义一个函数用来渲染自定义的必选标志,这个函数接受两个参数,一个是标签,另一个是boolean变量,用来指示当前控件是否为必选项。

函数逻辑也十分简单,首先渲染label。然后当requiredtrue时,渲染一个红色的星号,否则不渲染任何内容。

tsx 复制代码
const customizeRequiredMark = (label: React.ReactNode, { required }: { required: boolean }) => (
  <>
    {label}
    {required ? <span style={{color: 'red'}}>*</span> : null}
  </>
);

接下来,将Input组件用Form包裹起来,并应用上面的自定义函数即可。

jsx 复制代码
// 使用requiredMark属性来应用自定义的必选标志
<Form requiredMark={customizeRequiredMark}>
  <Form.Item
    label='name' name='name'
    rules={[{ required: true }]}>
    <Input
      variant="underlined"
      style={{ width: '200px' }}
      placeholder="请输入内容"
    />
  </Form.Item>
</Form>

完整代码如下:

tsx 复制代码
import { Form, Input } from 'antd';
import React from 'react';

const customizeRequiredMark = (label: React.ReactNode, { required }: { required: boolean }) => (
  <>
    {label}
    {required ? <span style={{color: 'red'}}>*</span> : null}
  </>
);

export default function CustomizeInput() {
  return (
    <Form requiredMark={customizeRequiredMark}>
      <Form.Item
        label='name' name='name'
        rules={[{ required: true }]}>
        <Input
          variant="underlined"
          style={{ width: '200px' }}
          placeholder="请输入内容"
        />
      </Form.Item>
    </Form>
  );
}

今天就到这里了,我们明天见,码字不易,如果觉得有用就关注一下,您的关注,是我持续输出的动力!

相关推荐
名字还没想好☜2 天前
Next.js Route Handler 做 SSE 服务端推送:实时进度条、自动重连与什么时候别用 WebSocket
开发语言·javascript·websocket·react·sse·next.js
Richown4 天前
AI + Web3 融合架构:大模型驱动的智能合约自动生成与审计
区块链·react
名字还没想好☜4 天前
React 19 useOptimistic 实战:点赞评论先更新 UI,失败自动回滚
前端·javascript·react.js·ui·react·useoptimistic
名字还没想好☜6 天前
Next.js 用 Server Components 直连数据库:去掉 API 层的边界,和三条别踩的安全红线
前端·javascript·数据库·安全·react·next.js
名字还没想好☜6 天前
React 用自定义 useDebounce Hook 治好搜索框频繁请求:防抖、竞态取消与卸载清理
前端·javascript·react.js·react·hooks
DsirNg6 天前
React Server Components 在真实项目中的边界:哪些组件该放在服务端
性能优化·react·next.js·app router·前端架构·rsc·react server components
名字还没想好☜7 天前
React 用 useEffect 做轮询实战:setInterval 拿到旧 state 的闭包陷阱与正确清理
前端·javascript·react.js·react·useeffect
小田学Python7 天前
Agent 的运行范式:ReAct(Reasoning+Acting)
大模型·react·ai agent·工具调用
张彦峰ZYF9 天前
LangGraph 深入理解 ReAct:让 AI Agent 真正学会「边想边做」
人工智能·llm·agent·react·langgroup
满栀5859 天前
react动态路由内容修改
前端·javascript·react.js·typescript·react