前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
对话 IJCAI「中国参会第一人」林尧瑞教授:回首从零开始的中国 AI 研究之路
AI 科技评论按:今年,IJCAI (国际人工智能联合会议,International Joint Conferences on Artificial Intelligence)将于 8 月 10 日至 16 日在中国澳门隆重召开。作为国际人工智能领域排名第一的学术会议,IJCAI 始终都是该领域研究者关注的焦点会议之一。
AI科技评论
2019/05/08
4720
对话 IJCAI「中国参会第一人」林尧瑞教授:回首从零开始的中国 AI 研究之路
2021年加拿大工程院院士名单出炉,杨强、张大鹏、刘学等多位华人入选
机器之心报道 编辑:陈萍 当地时间 6 月 14 日,加拿大工程院(Canadian Academy of Engineering,CAE)发布了 2021 年新增院士名单,共计 52 位杰出学者当选。 加拿大工程院公布了今年新增院士名单,共有 52 位杰出学者当选,包括 50 名新院士和两名新国际院士。受疫情影响,这一次的选举通过视频会议的方式举行,本年度的就职典礼也推迟到 2021 年 10 月举行。 加拿大工程院成立于 1987 年,是一个独立、自治的非盈利组织。加拿大工程院院士是加拿大联邦政府授予
机器之心
2023/03/29
5050
2021年加拿大工程院院士名单出炉,杨强、张大鹏、刘学等多位华人入选
AI人才报告:美国从业人员是中国2倍,供给方面中国仍落后
导读:近日,清华大学社科学院社会学系副教授何晓斌在“创新,无界——中国AI创新者论坛”上。做了《AI背景下的文科人才培养》主题报告。
IT阅读排行榜
2019/04/25
9530
AI人才报告:美国从业人员是中国2倍,供给方面中国仍落后
斯坦福全球测试,四国本科生CS技能大比拼,中国学生竟然输在了考试上?!
中国、美国、印度和俄罗斯,这四个国家培养了世界上一半的STEM毕业生(STEM是科学-Science、技术-Technology、工程-Engineering及数学-Math四个学科的首字母缩略字)。
大数据文摘
2019/04/26
5230
斯坦福全球测试,四国本科生CS技能大比拼,中国学生竟然输在了考试上?!
加拿大工程院院士于非:互联—— 从质量、能源、信息到智能
整理 | 莓酊 编辑 | 青暮 2021年12月9日,第六届全球人工智能与机器人大会(GAIR 2021)在深圳正式启幕。 140余位产学领袖、30位Fellow聚首,从AI技术、产品、行业、人文、组织等维度切入,以理性分析与感性洞察为轴,共同攀登人工智能与数字化的浪潮之巅。 会上,IEEE/ IET/ EIC Fellow于非教授向与大家分享了题为《互联:从质量、能源、信息到智能》的演讲。 于非教授是加拿大工程研究院院士(Fellow of the Engineering Institute of C
AI科技评论
2023/04/12
3980
加拿大工程院院士于非:互联—— 从质量、能源、信息到智能
18位华人当选2022年加拿大工程院院士!京东梅涛、李明、杨春生、梁杰、David Clausi等人在内
作者 | AI科技评论 编辑 | 陈彩娴 当地时间6月13日,加拿大工程院官方网站公布了2022年新晋院士名单:今年一共有54名新晋院士,其中入选华人18位、另有人工智能领域的其他3人! 入选学者包括京东梅涛、滑铁卢大学李明教授、加拿大国家研究委员会高级研究科学家杨春生、西蒙菲莎大学梁杰等等知名的人工智能学者。 加拿大工程院(The Canadian Academy of Engineering)成立于1987年,是一个独立、自治的非盈利组织,入选人员由同行提名和选举产生,主要标准是参选者在研究领域的杰出成
AI科技评论
2022/06/16
1.1K0
18位华人当选2022年加拿大工程院院士!京东梅涛、李明、杨春生、梁杰、David Clausi等人在内
科技、创新与未来的世界|2022年犀牛鸟中学科学人才培养计划启动
近日,2022年犀牛鸟中学科学人才培养计划正式启动,北京信息科学与技术国家研究中心主任、清华大学信息学院院长、中国工程院戴琼海院士,中国国家友谊奖获得者卡迪夫大学Ralph Martin教授,清华大学计算机系胡事民教授,腾讯副总裁王巨宏女士,腾讯SSV创新办学实验室联合负责人孙懿女士与来自全国百余所中学的同学们、以及本届项目的高校、中学指导教师代表等,共同参与了启动仪式。 北京信息科学与技术国家研究中心主任 戴琼海院士 “信息技术深刻的影响着社会发展,信息技术人才培养已成为国家未来核心竞争力的重要组成。随
腾讯高校合作
2022/05/17
5190
科技、创新与未来的世界|2022年犀牛鸟中学科学人才培养计划启动
特朗普政府欲取消3000名中国留学生签证,美国大学:偏执狂举动
据路透社、《纽约时报》等媒体援引多名知情人士本周四的消息,美国白宫已提出了一项计划,旨在取消数千名唐纳德·特朗普政府认为可能从事敏感领域研究的中国留学生签证。
机器之心
2020/06/01
5690
特朗普政府欲取消3000名中国留学生签证,美国大学:偏执狂举动
加拿大工程院增选54位院士,京东副总裁梅涛等18位华人入选
---- 新智元报道   编辑:David 时光 【新智元导读】加拿大工程院增选54名院士,18名华人入选! 6月13日,在加拿大工程院2022年年会上,加拿大工程院院长Yves Beauchamp宣布了47名新院士、6名新国际院士和1名荣誉院士。 这54名新院士是2020年、2021年和2022年当选的。 加拿大工程院院长Yves Beauchamp Beauchamp在致辞中表示: 「在过去的35年里,各位院士在教育、基础设施、创新、能源、交通等领域发挥了工程方面的领导作用,为加拿大和世界各地
新智元
2022/06/14
9240
加拿大工程院增选54位院士,京东副总裁梅涛等18位华人入选
AAAI 2019评审惹争议!“好论文”遭退稿?程序主席回应
人工智能“The”顶会之一的AAAI 2019论文录取结果昨日公布,16.2%,可以说是AAAI录取率最低的年份之一,更何况今年的投稿数量高达7745篇,比去年相翻了一番!
新智元
2018/12/11
1.3K0
AAAI 2019评审惹争议!“好论文”遭退稿?程序主席回应
跨越一甲子的AI之路为何愈发坚定?我们与5位顶级大咖进行了深入探讨
AI时代群星闪耀时,我们和未来进行一场对话。 引言: 清晨的长江温柔平静,江水轻轻拍打着江心洲的江堤,这个古称梅子洲的江中小岛在春暮夏初的时节分外美丽。天空湛蓝江水如镜,穿过笔直秀颀的水杉林打造的森林栈道,就能看到江岛的首个地标建筑,总建筑面积约5.2万平方米的生态岛科创中心。 刚刚过去的6月1日,2018中新人工智能高峰论坛在这里举行。 这是一次汇聚了5位来自中国、新加坡、德国等国的院士,30多位人工智能专家、企业家——这是新闻资讯里的准确描述,在这篇文章里,我更愿意把他们称为科学家,一群科学家的高峰对话
镁客网
2018/06/05
6890
王坚、李彦宏、杨强候选工程院院士,对互联网意味着什么?
4月30日,中国工程院公布2019年院士增选有效候选人名单。经中国工程院主席团审定,最终确定的有效候选人共531位,其中来自企业的候选人有114位,同比两年前增加24位,阿里巴巴技术委员会主席王坚,百度创始人兼CEO李彦宏,百度高级副总裁、AI技术平台体系(AIG)和基础技术体系(TG)总负责人王海峰、微众银行首席人工智能官杨强等具有IT技术背景的企业高管入选,微众银行大股东是腾讯,因此也可以认为,这一次BAT都没落下。
罗超频道
2019/05/14
7140
王坚、李彦宏、杨强候选工程院院士,对互联网意味着什么?
普林斯顿中国籍教授:中国学生是怎样被一步步淘汰掉的?
美国普林斯顿大学分子生物学系教授康毅滨先生,复旦大学毕业后赴美国杜克大学博士,现在美国普林斯顿大学分子生物学系任终身教授,曾获美国国癌症研究学会杰出贡献奖。
新智元
2019/05/08
1.7K0
普林斯顿中国籍教授:中国学生是怎样被一步步淘汰掉的?
GAIR 2021大会首日:18位Fellow的40年AI岁月,一场技术前沿的传承与激辩
这一天,我们追溯历史、致敬传奇、展望远方。 作者 | 徐晓飞 杏花 莓酊 海涛 琰琰 维克多 编辑 | 周蕾 2021年12月9日,中国深圳。 由粤港澳大湾区人工智能与机器人联合会、雷峰网联合主办,深圳市人工智能与机器人研究院、深圳市机器人协会、深圳市人工智能学会支持的第六届GAIR全球人工智能与机器人大会,于上午9:30在中洲万豪酒店正式拉开序幕。 作为粤港澳大湾区的第一AI盛会,GAIR大会已成功举办五届,留下众多精彩、经典和令人惊叹的瞬间。GAIR 2021则延续以往豪华阵容,以1场主旨论坛、2场行
AI科技评论
2023/04/12
3260
GAIR 2021大会首日:18位Fellow的40年AI岁月,一场技术前沿的传承与激辩
CNCC 次日,吴军、张建锋、马维英、凌晓峰等畅谈大数据与数字经济 | CNCC 2018
AI 科技评论按,2018 中国计算机大会(CNCC2018)于 10 月 25-27 日在杭州国际博览中心举办,会议由中国计算机学会(CCF)主办,杭州市萧山区人民政府、浙江大学承办,浙江工业大学、浙江工商大学、杭州电子科技大学协办。今年的大会主题是「大数据推动数字经济(Big Data Drives the Digital Economy)」,CNCC 邀请到近 400 位国内外计算机领域知名专家、企业家到会演讲,会议包括 15 个特邀报告、3 个大会论坛,60 个技术论坛,20 场特色活动。
AI科技评论
2018/11/30
5240
CNCC 次日,吴军、张建锋、马维英、凌晓峰等畅谈大数据与数字经济 | CNCC 2018
大咖云集!2018中国计算机大会在杭州举行
据官方介绍,将会有400位计算机领域的专家企业家发表演讲,近1000家企事业单位的7000多名专业人士参会参展。
量子位
2018/12/04
4090
大咖云集!2018中国计算机大会在杭州举行
美国开始「人才外流」!大量中国学者放弃美国教职归国
---- 新智元报道   编辑:Aeneas 好困 David 【新智元导读】这两年,美国的「人才外流」似乎愈发严重。华人学者纷纷放弃美国大学的职位,回到中国。 最近几年,只要对国际大事稍加留意的人们都会发现:「科学无国界」其实是一句「笑话」。 随着中美之间的局势日益紧张,越来越多的中国科学家在美国的处境开始发生变化,很多人也开始从美国大学回流。 哈佛、麻省理工等名校正在失去经验丰富的中国学者——因为担心政府监视,有40%的人在考虑离开。 人才「流失」,美国急了? 在拜登执政期间,日益敌对的政治和
新智元
2022/09/27
7460
美国开始「人才外流」!大量中国学者放弃美国教职归国
【2018年高校人工智能学院报考指南】第一批“00后”高考,数学满分同学看过来
新智元报道 编辑:克雷格、李静怡 【新智元导读】今天高考迎来了数学考试。数学不好能否学好人工智能?本科生学人工智能专业是否过早?北大黄铁军教授、南大俞扬副教授、上交大卢策吾教授进行了答疑解惑。 第
新智元
2018/06/22
1.2K0
22名华人当选!加拿大工程院公布2023院士名单,国内多所高校上榜
据文摘菌查询,55位新增院士名单中,华人名字占据了近半数(22人),其中不乏中国高校的教授:例如香港中文大学(深圳)崔曙光、李晨钟;天津大学巩金龙;广东工业大学邱学青;浙江工业大学李小年等等。
大数据文摘
2023/08/08
1.2K0
22名华人当选!加拿大工程院公布2023院士名单,国内多所高校上榜
教育部印发《高校人工智能创新行动计划》, 500万AI人才缺口要补上!
【新智元导读】教育部日前印发了《高等学校人工智能创新行动计划》,提出18项重点任务,并制定“三步走规划”:首先到2020年完善学科体系,到2025年取得一批有国际影响力的原创成果,到2030年让高校成为建设世界主要人工智能创新中心的核心力量,为我国跻身创新型国家前列提供科技支撑和人才保障。《行动计划》发布后将对高校和今后中国人工智能发展产生什么影响?本文带来专家权威解读。 据西安电子科技大学官网消息,4月2日,教育部印发了《高等学校人工智能创新行动计划》(下称《行动计划》)。这是教育领域落实国务
新智元
2018/04/17
1.2K0
教育部印发《高校人工智能创新行动计划》, 500万AI人才缺口要补上!
推荐阅读
对话 IJCAI「中国参会第一人」林尧瑞教授:回首从零开始的中国 AI 研究之路
4720
2021年加拿大工程院院士名单出炉,杨强、张大鹏、刘学等多位华人入选
5050
AI人才报告:美国从业人员是中国2倍,供给方面中国仍落后
9530
斯坦福全球测试,四国本科生CS技能大比拼,中国学生竟然输在了考试上?!
5230
加拿大工程院院士于非:互联—— 从质量、能源、信息到智能
3980
18位华人当选2022年加拿大工程院院士!京东梅涛、李明、杨春生、梁杰、David Clausi等人在内
1.1K0
科技、创新与未来的世界|2022年犀牛鸟中学科学人才培养计划启动
5190
特朗普政府欲取消3000名中国留学生签证,美国大学:偏执狂举动
5690
加拿大工程院增选54位院士,京东副总裁梅涛等18位华人入选
9240
AAAI 2019评审惹争议!“好论文”遭退稿?程序主席回应
1.3K0
跨越一甲子的AI之路为何愈发坚定?我们与5位顶级大咖进行了深入探讨
6890
王坚、李彦宏、杨强候选工程院院士,对互联网意味着什么?
7140
普林斯顿中国籍教授:中国学生是怎样被一步步淘汰掉的?
1.7K0
GAIR 2021大会首日:18位Fellow的40年AI岁月,一场技术前沿的传承与激辩
3260
CNCC 次日,吴军、张建锋、马维英、凌晓峰等畅谈大数据与数字经济 | CNCC 2018
5240
大咖云集!2018中国计算机大会在杭州举行
4090
美国开始「人才外流」!大量中国学者放弃美国教职归国
7460
【2018年高校人工智能学院报考指南】第一批“00后”高考,数学满分同学看过来
1.2K0
22名华人当选!加拿大工程院公布2023院士名单,国内多所高校上榜
1.2K0
教育部印发《高校人工智能创新行动计划》, 500万AI人才缺口要补上!
1.2K0
相关推荐
对话 IJCAI「中国参会第一人」林尧瑞教授:回首从零开始的中国 AI 研究之路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验