一、简介

最近在忙着开发十几个微服务,苦逼的我们前后端都要自己写,基于项目中有不少需要根据代码库常量来定制switch开关选择器的需求,所以抽了一点时间对ant design的开关选择器进行了二次封装,减少项目组成员的重复劳动。因为switch只有两种状态,所以事先约定好了只能对应代码库中常量值 ‘1’ 和 ‘0’ 。

主要有以下一些功能:

【a】可直接使用数据库常量表的标识,使用sign标识从后台查询数据源时,以'DMK_'加上对应代码库标识,如: sign={'DMK_XTGL_SFM'},可动态渲染出数据库中定义的两种状态;

【b】可以使用dataSource自定义数据源,格式如: [{"VALUE":"1","LABEL":"是"},{"VALUE":"0","LABEL":"否"}];

【c】可以使用checkedChildren/unCheckedChildren指定选中/未选中时文本;

注意: 如果同时配置了sign/dataSource/(checkedChildren/unCheckedChildren),文本取值优先级顺序: sign > dataSource > (checkedChildren/unCheckedChildren)

【d】父组件回调方法:onChange = (checked,value) => { }  : checked表示是否选中boolean值(true/false), value表示当前选择器的值('1'/'0');

二、NHSwitch.js

import React from "react";
import PropTypes from "prop-types";
import {Switch} from 'antd';
import NHFetch from "../../utils/NHFetch";const pathUrl = "/proData/selectDataList";/*** @Description: 开关选择器* @author weishihuai* @date 2019/3/7 9:13** 使用说明:* 1. 使用sign标识从后台查询数据源时,以'DMK_'加上对应代码库标识,如: sign={'DMK_XTGL_SFM'};* 2. 可使用dataSource自定义数据源,格式如: [{"VALUE":"1","LABEL":"是"},{"VALUE":"0","LABEL":"否"}];* 3. 可以使用checkedChildren/unCheckedChildren指定选中/未选中时文本;*  注意: 如果同时配置了sign/dataSource/(checkedChildren/unCheckedChildren),文本取值优先级顺序: sign > dataSource > (checkedChildren/unCheckedChildren)* 4. onChange = (checked,value)父组件回调方法 : checked表示是否选中boolean值(true/false), value表示当前选择器的值('1'/'0');* 5. 使用示例:* <NHSwitch*      onChange={this.onSwitchChange}*      loading={false}*      disabled={false}*      size={'default'}*      sign={'DMK_XTGL_SFM'}*      dataSource={[{"VALUE":"1","LABEL":"是"},{"VALUE":"0","LABEL":"否"}]}*      checkedChildren={'启用'}*      unCheckedChildren={'禁用'}*      onClick={this.onClick}/>*/
class NHSwitch extends React.Component {constructor(props) {super(props);const {checkedChildren = '', unCheckedChildren = '', checked} = this.props;this.state = {checkedChildren: checkedChildren,       //选中时文本unCheckedChildren: unCheckedChildren,   //未选中文本currentValue: '',                       //当前选中的值checked: checked,                       //当前选中状态};}componentDidMount() {const {sign} = this.props;this.getDataSource(sign);}UNSAFE_componentWillReceiveProps(nextProps) {if ('dataSource' in nextProps) {const dataSource = nextProps.dataSource;if (dataSource && dataSource.length > 0) {this.buildCheckedChildren(dataSource);}}}getPropsCheckedText = () => {const {checkedChildren = '', unCheckedChildren = ''} = this.props;this.setState({checkedChildren: checkedChildren,unCheckedChildren: unCheckedChildren,});};//加载数据源getDataSource = (sign) => {if (sign) {NHFetch(pathUrl, 'GET', {sign: sign}).then(res => {if (res) {let data = res.data;if (data) {this.buildCheckedChildren(data);} else {this.getCustomDataSource();}}});} else {this.getCustomDataSource();}};//使用自定义数据源getCustomDataSource = () => {const {dataSource = []} = this.props;if (dataSource && dataSource.length > 0) {this.buildCheckedChildren(dataSource);} else {this.getPropsCheckedText();}};buildCheckedChildren = (data) => {data.map(item => {let itemVal = item.VALUE || item.value;let itemLabel = item.LABEL || item.label;if (itemVal === '1') {this.setState({checkedChildren: itemLabel,});} else {this.setState({unCheckedChildren: itemLabel,});}});};//值改变回调方法onSwitchChange = (checked) => {const {onChange} = this.props;this.setState({currentValue: checked ? '1' : '0',checked: checked}, () => {if (onChange && typeof onChange === 'function') {onChange(checked, this.state.currentValue);}});};//点击事件回调方法onSwitchClick = (checked) => {const {onClick} = this.props;this.setState({currentValue: checked ? '1' : '0',checked: checked}, () => {if (onClick && typeof onClick === 'function') {onClick(checked, this.state.currentValue);}});};render() {const {checkedChildren = '', unCheckedChildren = '', checked} = this.state;const {defaultChecked, loading, size, disabled} = this.props;return (<div><Switch defaultChecked={defaultChecked} checkedChildren={checkedChildren}unCheckedChildren={unCheckedChildren}loading={loading}size={size}checked={checked}disabled={disabled}onChange={this.onSwitchChange}onClick={this.onSwitchClick}/></div>)}
}//默认属性
NHSwitch.defaultProps = {loading: false,size: 'default',disabled: false,onChange: () => {},onClick: () => {}
};//属性检查
NHSwitch.propTypes = {sign: PropTypes.string,                 //数据源标识onChange: PropTypes.func,               //变化时回调函数onClick: PropTypes.func,                //点击时回调函数checkedChildren: PropTypes.string,      //选中时的内容unCheckedChildren: PropTypes.string,    //未选中的内容defaultChecked: PropTypes.bool,         //初始是否选中loading: PropTypes.bool,                //加载中的开关disabled: PropTypes.bool,               //是否禁用size: PropTypes.string,                 //开关大小,可选值: default/small,默认为defaultdataSource: PropTypes.arrayOf(          //自定义数据源PropTypes.shape({value: PropTypes.string,label: PropTypes.node})),
};export default NHSwitch;

三、测试

一般情况下,只需要指定 sign / dataSource /(checkChildren/uncheckChildren)其中一种即可,具体根据项目中需求来定。

【React 】基于Antd Design的Switch开关选择器控件封装相关推荐

  1. jquery实现上下左右键盘监听_基于 jQuery 实现键盘事件监听控件

    最近项目里要做一个画板,需要对键盘事件进行监听,来进行诸如撤回.重做.移动.缩放等操作,因此顺手实现了一个键盘事件监听控件,期间略有收获,整理出来,希望对大家有所帮助,更希望能获得高手的指点. 1. ...

  2. ESP32 开发笔记(四)LVGL控件学习 ColorPicker 颜色选择器控件

    先看效果,创建一个颜色选择器控件,设置事件回调动态显示当前选择的颜色值 开发板购买链接https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.5 ...

  3. android自定义控件不显示,解决Android Studio Design界面不显示layout控件的问题

    Android Studio更新到3.1.3后,发现拖到Design中的控件在预览界面中不显示: 解决办法: 在Styles.xml中的parent="..."中的Theme前添加 ...

  4. 基于 next.js + mdx 搭建组件库文档项目(二) -- mdx 控件封装实现组件的演示与 Props 列表

    说明 经过上阶段的配置虽然可以在项目中使用 mdx 语法 来创建页面了,但是我们的组件库有一些定制化的需求:交互式的组件演示.组件 Props 列表展示.这些功能如果可以通过封装来实现,会大大提升开发 ...

  5. global 仪表控件 无人机地面站_基于GL Studio的无人机地面站天线控件设计与实现...

    基于 GL Studio 的无人机地面站天线控件设计与实现 李兴岷 ; 陈怀民 ; 喻戈 ; 任伟 [期刊名称] <测控技术> [年 ( 卷 ), 期] 2011(030)009 [摘要] ...

  6. iOS 9应用开发教程之使用开关滑块控件以及滚动部署视图

    iOS 9应用开发教程之使用开关滑块控件以及滚动部署视图 使用ios9中的开关.滑块控件 开关和滑块也是用于和用户进行交互的控件.本节将主要讲解这两种控件. ios9开关 开关控件常用来控制某个功能的 ...

  7. SAP UI5 应用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  8. SAP UI5 应用开发教程之六十五 - 基于 OData V4 的 SAP UI5 表格控件如何实现创建,编辑和保存功能

    本教程前几个步骤,我们已经用 SAP UI5 table 控件开发了一个包含 User 列表的应用,并且支持了根据 LastName 字段进行查询,以及排序的操作. SAP UI5 应用开发教程之六十 ...

  9. SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  10. SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能

    本教程的上一个步骤,我们学习了如何基于 OData V4 开发一个最简单的使用了 Table(表格)控件的 SAP UI5 应用. SAP UI5 应用开发教程之六十二 - 基于 OData V4 的 ...

最新文章

  1. 时间序列竞赛炸榜技巧。
  2. Windows Server 2008 RemoteApp(四)---发布应用程序
  3. 【数字信号处理】傅里叶变换性质 ( 傅里叶变换时移性质示例 )
  4. innodb 悲观锁 乐观锁_mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁
  5. 华为服务器驱动_不可错过的华为核心概念股
  6. 关于python学习,最系统的学习网站看这里
  7. NB-IoT 的“前世今生”
  8. 【Vegas原创】CPIO操作
  9. 6-2 错误与异常处理
  10. springboot 物联网_【阿里云生活物联网架构师专题】基于在 SpringBoot Java私有云上对接阿里云物联网,实现M2M设备数据流转。...
  11. 题目1439:Least Common Multiple
  12. 1.4 Linux文件系统与目录结构
  13. html的meta标签的作用
  14. VIsualSVNSever 和SVN安装教程
  15. android腾讯离线推送,腾讯云IM离线推送设置
  16. Windows To Go常见问题
  17. 蓝牙BR/EDR和Bluetooth Smart的十大重要区别
  18. 地图--WGS84 高德坐标 百度坐标的相互转换(好用推荐)
  19. 有关“SRS Audio Sandbox”的一些问题?
  20. 浮点型数据判断相等不能直接使用==

热门文章

  1. 深度学习基础之线性回归
  2. MAB多臂老虎机/赌博机
  3. 2021-09-07Hadoop运行模式:
  4. NLP Prompt范式,两种主要类型:填充文本字符串空白的完形填空(Cloze)prompt,和用于延续字符串前缀的前缀 (Prefix) prompt。
  5. 609. 在系统中查找重复文件
  6. 535. TinyURL 的加密与解密
  7. html5 sha1,JavaScript 实现的base64加密、md5加密、sha1加密及AES加密
  8. php 调用dll静态库,vue-cli 2.x 项目优化之引入本地静态库文件
  9. Null pointer access: The variable number can only be null at this location。 错误解决
  10. JVM-深入虚拟机字节码执行引擎