前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Antd源码浅析(二)InputNumber组件 一

Antd源码浅析(二)InputNumber组件 一

作者头像
河马嘴不大
发布于 2022-12-24 04:17:29
发布于 2022-12-24 04:17:29
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

前言

上篇我们讲了Icon组件,Icon组件是Antd源码库中实现比较简单的组件,适合大家入门,这篇文章主要和大家一起分析一下数字输入框组件,即InputNumber,难度适中,但蕴含的Antd里较为经典的开发场景,适合大家比较深入的了解Antd背后的思想。

这篇我们学习的目的主要有:

  • 学习Antd的如何基于现有的组件封装
  • 封装背后的技术目的和效果如何

目录结构

首先我们依旧看看位于components 文件夹下的input-number 目录结构:

InputNumber组件的的效果图如下:

代码

InputNumber的核心代码位于 index.tsx 内,代码不多,我们直接贴过来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as React from 'react';
import classNames from 'classnames';
import RcInputNumber from 'rc-input-number';

export interface InputNumberProps {
  prefixCls?: string;
  min?: number;
  max?: number;
  value?: number;
  step?: number | string;
  defaultValue?: number;
  tabIndex?: number;
  onKeyDown?: React.FormEventHandler<any>;
  onChange?: (value: number | string | undefined) => void;
  disabled?: boolean;
  size?: 'large' | 'small' | 'default';
  formatter?: (value: number | string | undefined) => string;
  parser?: (displayValue: string | undefined) => number;
  placeholder?: string;
  style?: React.CSSProperties;
  className?: string;
  name?: string;
  id?: string;
  precision?: number;
}

export default class InputNumber extends React.Component<InputNumberProps, any> {
  static defaultProps = {
    prefixCls: 'ant-input-number',
    step: 1,
  };

  private inputNumberRef: any;

  render() {
    const { className, size, ...others } = this.props;
    const inputNumberClass = classNames({
      [`${this.props.prefixCls}-lg`]: size === 'large',
      [`${this.props.prefixCls}-sm`]: size === 'small',
    }, className);

    return <RcInputNumber ref={(c: any) => this.inputNumberRef = c} className={inputNumberClass} {...others} />;
  }

  focus() {
    this.inputNumberRef.focus();
  }

  blur() {
    this.inputNumberRef.blur();
  }
}

主要结构非常清晰,分成三个部分,头部的文件引入,参数校验,主体类声明。

文件的引入中,react大家非常熟悉,classnames 在上篇文章,河马君为大家介绍过使用方法和实现,对于rc-input-number可能部分读者比较陌生,我们来介绍一下。

Antd的许多组件都是基于rc-xxx组件分装,比如常见的Table组件是基于rc-table,Form组件基于rc-form,rc-xxx来源于react-component组件库,里面有很多常用的组件,大家也可以在项目中直接使用,也可以经过自己二次封装后使用。我们稍后仔细分析一下rc-input-number,先来看看参数校验和主体结构。

参数校验

对于参数校验,当然需要对照InputNumber的文档看了,官方的使用说明如下:

属性如下:

成员

说明

类型

默认值

autoFocus

自动获取焦点

boolean

false

defaultValue

初始值

number

disabled

禁用

boolean

false

formatter

指定输入框展示值的格式

function(value: number \

string): string

max

最大值

number

Infinity

min

最小值

number

-Infinity

parser

指定从 formatter 里转换回数字的方式,和 formatter 搭配使用

function( string): number

-

precision

数值精度

number

-

size

输入框大小

string

step

每次改变步数,可以为小数

number\

string

value

当前值

number

onChange

变化回调

Function(value: number \

string)

那我们再来对照代码里的参数校验,文档中有的就不再赘述,缺少的通过注释给出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export interface InputNumberProps {
  prefixCls?: string;   // Antd预留给自己的预设class,这里在defaultProps中默认设置为'ant-input-number'
  min?: number;
  max?: number;
  value?: number;
  step?: number | string;
  defaultValue?: number;
  tabIndex?: number;    //tab 键控制次序,就是快捷切换
  onKeyDown?: React.FormEventHandler<any>;  // 用户按下键盘按键时的回调函数
  onChange?: (value: number | string | undefined) => void;
  disabled?: boolean;
  size?: 'large' | 'small' | 'default';
  formatter?: (value: number | string | undefined) => string;
  parser?: (displayValue: string | undefined) => number;
  placeholder?: string;     // placeholder提示
  style?: React.CSSProperties;  // 用户自定义style
  className?: string;   // 用户自定义class
  name?: string;    // 用户自定义name属性,毕竟底层是input标签
  id?: string;  // 用户自定义id
  precision?: number;
}

对于其中TypeScript形式类型校验,可以参考上篇文章,这里Antd文档给出了其自定义的参数列表,省略了默认的普通参数,所以通过对于源码的学习,能够清晰的知道在官方文档之外,哪些参数是可用的。

主体函数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default class InputNumber extends React.Component<InputNumberProps, any> {
  // 默认参数设置
  static defaultProps = {
    prefixCls: 'ant-input-number',
    step: 1,
  };

  // 通过ref属性获取实例
  private inputNumberRef: any;

  render() {
    const { className, size, ...others } = this.props;
    
    // className的判断和合成
    const inputNumberClass = classNames({
      [`${this.props.prefixCls}-lg`]: size === 'large',
      [`${this.props.prefixCls}-sm`]: size === 'small',
    }, className);
    
    // 核心RcInputNumber组件,我们稍后讲解一下
    return <RcInputNumber ref={(c: any) => this.inputNumberRef = c} className={inputNumberClass} {...others} />;
  }

  // 通过实例绑定的focus事件和blur事件
  focus() {
    this.inputNumberRef.focus();
  }

  blur() {
    this.inputNumberRef.blur();
  }
}

这是官方给出的方法文档:

名称

描述

blur()

移除焦点

focus()

获取焦点

这里河马君多说一下,对于这两个函数的实现,Antd使用了ref属性,实现对组件的引用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ref={(c: any) => this.inputNumberRef = c}

这是通过ref回调的方式,在组件render完获取实例,优于React提供的旧版的this.refs.inputNumberRef字符串形式,但在最新版React16.2的文档中,官方建议使用React.createRef(),这里用普通的写法可以写为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  constructor(props) {
    super(props);
    this.inputNumberRef = React.createRef();
  }
  ...
  render() {
    ...
    return <RcInputNumber ref={this.inputNumberRef} className={inputNumberClass} {...others} />;
  }

  focus() {
    this.inputNumberRef.focus();
  }

  blur() {
    this.inputNumberRef.blur();
  }
}

到这里,对于InputNumber组件的源码主体结构介绍完了,我们下一篇文章,分析一下核心的rc-input-number源码,即<RcInputNumber/>组件的实现。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Antd源码浅析(三)InputNumber组件 二
上篇我们讲了InputNumber组件的主要结构组成,本篇我们来分析,InputNumber组件的核心实现rc-input-number的源码,即<RcInputNumber/>组件。虽然我们是浅析Antd组件,但本着专注、严谨的科学态度,这里河马君会为大家从Antd库入手,讲解背后的依赖库,深入到最底层,主要一个是为了理解代码,另一个是看看大家都用哪些开源库,加快开发进度。
河马嘴不大
2022/12/24
1.3K0
Antd源码浅析(三)InputNumber组件 二
ant design源码分析 1 研究方法
ant design 是一套设计语言。 这里为了学习react,我主要学习用 React实现 的各个组件。这个是由官方维护的,代码质量高些。还有 基于vue 实现的。 源码在 github 上。 阅读readme打开 开发者说明 ├── components # react source code and demos ├── docs # documentation in markdown ├── scripts # ├── site # website layout and code └── package.json
mafeifan
2018/09/10
2.3K0
ant design源码分析 2 Grid栅格
使用文档 源码 grid/index.tsx import Row from './row'; import Col from './col'; export { Row, Col, }; grid/row.js export default class Row extends React.Component { static defaultProps = { // gutter是col之间的间隔,默认0 // <Row gutter={24}> // 生成 <di
mafeifan
2018/09/10
1.4K1
🔖TypeScript 备忘录:如何在 React 中完美运用?
一直以来,ssh 身边都有很多小伙伴对 TS 如何在 React 中运用有很多困惑,他们开始慢慢讨厌 TS,觉得各种莫名其妙的问题降低了开发的效率。
ssh_晨曦时梦见兮
2022/03/09
3K0
🔖TypeScript 备忘录:如何在 React 中完美运用?
【React】【案例】:TimeLine 时间轴
目录 1. 组件基础 2. 需求分析 3. 关键技术 4. 代码实现 5. 形态展示 1. 组件基础 可视化地呈现时间流信息。 2. 需求分析 3. 关键技术 为什么不直接用 antd、elementui、iview 等开源组件? antd 很优秀,但是.... antd 不支持 label、content 按指定比例分布; antd 在dot定制时,难以控制UI界面呈现; elementui 不能将 label 放在左边; .... 但是以 antd 为基础改造,会快很多; 主体采用什么html结构实
WEBJ2EE
2020/04/21
8.4K0
【React】【案例】:TimeLine 时间轴
天天用 antd 的 Form 组件?自己手写一个吧
用 Form.Item 包裹 Input、Checkbox 等表单项,可以定义 rules,也就是每个表单项的校验规则。
神说要有光zxg
2024/04/10
4060
天天用 antd 的 Form 组件?自己手写一个吧
前端基础进阶(十六):ES6常用基础合集
与 var 不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升。通过 2 个简单的例子来说明这两点。
唐志远
2022/10/27
2310
前端基础进阶(十六):ES6常用基础合集
Antd源码浅析(一)Icon组件
最近在写B端的项目,用到了Ant Design,清爽而优雅。故想深入源码了解一二,但鉴于技术浅薄,不敢深究,故写浅析,不喜勿喷,对其中的组件做一些分析,主要目的有两个:
河马嘴不大
2022/12/24
2.1K0
Antd源码浅析(一)Icon组件
【React】【案例】:简易轮播组件
目录 1. 组件展示 2. 关键技术 3. 关键实现 4. 组件接口 1. 组件展示 组件特性: 滑动箭头,只有当待滑动内容无法完整显示时才出现。 滑动过程使用动画体现。 滑动到左边界时,左滑动箭头给出不可滑动标识。 滑动到右边界时,右滑动箭头给出不可滑动标识。 浏览器缩放时,也能满足上述条件。 2. 关键技术 如何实现竖直居中? absolute + top:50% + transform(-50%, -50%) 如何避免用户点击滑动箭头时,意外选中文本? css3 -> user-select:non
WEBJ2EE
2020/04/21
1.3K0
【React】【案例】:简易轮播组件
图片渐进式加载优化实践指南
沉浸式趣谈
2024/11/21
1100
图片渐进式加载优化实践指南
Typescript 入门写一个 react 进度条组件
TypeScript 入门,写一个 react 进度条组件 写在最前面 如果你写过 react 的组件, 这篇文章对与你来说基本没有什么难度。纯粹的是加上了一点 ts 的知识。 我完全是以学习者的姿态
西南_张家辉
2021/02/02
2K0
前端反卷计划-组件库-05-Menu组件开发
在渲染childrend的时候,使用React.cloneElement将index克隆到child上
程序员库里
2023/11/27
2630
React + TypeScript 实践
需要添加额外的配置:"allowSyntheticDefaultImports": true
公众号@魔术师卡颂
2021/05/08
6.7K0
React-hooks+TypeScript最佳实战
如果新的 state 需要通过使用先前的 state 计算得出,那么可以将回调函数当做参数传递给 setState。该回调函数将接收先前的 state,并返回一个更新后的值。
xiaofeng123aa
2022/10/17
6.3K0
实战为王,从零封装 Icon 组件
在实践应用中,图标的使用无处不在。小到编辑器的功能按钮,大到 chrome 浏览器的任务栏,都有大量的图标需要处理。每个稍微大一点点的项目都必然需要一个图标组件。
用户6901603
2022/05/24
1.4K0
实战为王,从零封装 Icon 组件
让你 React 组件水平暴增的 5 个技巧
最近看了一些 Ant Design 的组件源码,学到一些很实用的技巧,这篇文章来分享一下。
神说要有光zxg
2023/08/29
6090
让你 React 组件水平暴增的 5 个技巧
前端反卷计划-组件库-04-Button组件开发
比如上面代码中的@include button-size 函数,这个是scss的一个特性,可以从官网上看下介绍。
程序员库里
2023/11/27
4130
手写一个 OnBoarding 组件
用一个 div,设置 width、height 还有上下左右不同的 border-width。
神说要有光zxg
2024/04/10
1650
手写一个 OnBoarding 组件
React 项目里,如何快速定位你的组件源码?
业务项目一般代码都很多,你拿到一个需求之后,可能改起来不难,但是要定位在哪里改比较难。
神说要有光zxg
2024/05/31
4720
React 项目里,如何快速定位你的组件源码?
React 16.x折腾记 - (8) 基于React+Antd封装选择单个文章分类(从构建到获取)
随着管理的文章数量增多,默认的几个分类满足不了现状了,趁着重构的过程把相关的功能考虑进去
CRPER
2024/02/01
1650
React 16.x折腾记 - (8) 基于React+Antd封装选择单个文章分类(从构建到获取)
相关推荐
Antd源码浅析(三)InputNumber组件 二
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验