当前位置:   article > 正文

【React 】基于Antd Design的Switch开关选择器控件封装_react antd switch

react antd switch

一、简介

最近在忙着开发十几个微服务,苦逼的我们前后端都要自己写,基于项目中有不少需要根据代码库常量来定制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

  1. import React from "react";
  2. import PropTypes from "prop-types";
  3. import {Switch} from 'antd';
  4. import NHFetch from "../../utils/NHFetch";
  5. const pathUrl = "/proData/selectDataList";
  6. /**
  7. * @Description: 开关选择器
  8. * @author weishihuai
  9. * @date 2019/3/7 9:13
  10. *
  11. * 使用说明:
  12. * 1. 使用sign标识从后台查询数据源时,以'DMK_'加上对应代码库标识,如: sign={'DMK_XTGL_SFM'};
  13. * 2. 可使用dataSource自定义数据源,格式如: [{"VALUE":"1","LABEL":"是"},{"VALUE":"0","LABEL":"否"}];
  14. * 3. 可以使用checkedChildren/unCheckedChildren指定选中/未选中时文本;
  15. * 注意: 如果同时配置了sign/dataSource/(checkedChildren/unCheckedChildren),文本取值优先级顺序: sign > dataSource > (checkedChildren/unCheckedChildren)
  16. * 4. onChange = (checked,value)父组件回调方法 : checked表示是否选中boolean值(true/false), value表示当前选择器的值('1'/'0');
  17. * 5. 使用示例:
  18. * <NHSwitch
  19. * onChange={this.onSwitchChange}
  20. * loading={false}
  21. * disabled={false}
  22. * size={'default'}
  23. * sign={'DMK_XTGL_SFM'}
  24. * dataSource={[{"VALUE":"1","LABEL":"是"},{"VALUE":"0","LABEL":"否"}]}
  25. * checkedChildren={'启用'}
  26. * unCheckedChildren={'禁用'}
  27. * onClick={this.onClick}/>
  28. */
  29. class NHSwitch extends React.Component {
  30. constructor(props) {
  31. super(props);
  32. const {checkedChildren = '', unCheckedChildren = '', checked} = this.props;
  33. this.state = {
  34. checkedChildren: checkedChildren, //选中时文本
  35. unCheckedChildren: unCheckedChildren, //未选中文本
  36. currentValue: '', //当前选中的值
  37. checked: checked, //当前选中状态
  38. };
  39. }
  40. componentDidMount() {
  41. const {sign} = this.props;
  42. this.getDataSource(sign);
  43. }
  44. UNSAFE_componentWillReceiveProps(nextProps) {
  45. if ('dataSource' in nextProps) {
  46. const dataSource = nextProps.dataSource;
  47. if (dataSource && dataSource.length > 0) {
  48. this.buildCheckedChildren(dataSource);
  49. }
  50. }
  51. }
  52. getPropsCheckedText = () => {
  53. const {checkedChildren = '', unCheckedChildren = ''} = this.props;
  54. this.setState({
  55. checkedChildren: checkedChildren,
  56. unCheckedChildren: unCheckedChildren,
  57. });
  58. };
  59. //加载数据源
  60. getDataSource = (sign) => {
  61. if (sign) {
  62. NHFetch(pathUrl, 'GET', {sign: sign})
  63. .then(res => {
  64. if (res) {
  65. let data = res.data;
  66. if (data) {
  67. this.buildCheckedChildren(data);
  68. } else {
  69. this.getCustomDataSource();
  70. }
  71. }
  72. });
  73. } else {
  74. this.getCustomDataSource();
  75. }
  76. };
  77. //使用自定义数据源
  78. getCustomDataSource = () => {
  79. const {dataSource = []} = this.props;
  80. if (dataSource && dataSource.length > 0) {
  81. this.buildCheckedChildren(dataSource);
  82. } else {
  83. this.getPropsCheckedText();
  84. }
  85. };
  86. buildCheckedChildren = (data) => {
  87. data.map(item => {
  88. let itemVal = item.VALUE || item.value;
  89. let itemLabel = item.LABEL || item.label;
  90. if (itemVal === '1') {
  91. this.setState({
  92. checkedChildren: itemLabel,
  93. });
  94. } else {
  95. this.setState({
  96. unCheckedChildren: itemLabel,
  97. });
  98. }
  99. });
  100. };
  101. //值改变回调方法
  102. onSwitchChange = (checked) => {
  103. const {onChange} = this.props;
  104. this.setState({
  105. currentValue: checked ? '1' : '0',
  106. checked: checked
  107. }, () => {
  108. if (onChange && typeof onChange === 'function') {
  109. onChange(checked, this.state.currentValue);
  110. }
  111. });
  112. };
  113. //点击事件回调方法
  114. onSwitchClick = (checked) => {
  115. const {onClick} = this.props;
  116. this.setState({
  117. currentValue: checked ? '1' : '0',
  118. checked: checked
  119. }, () => {
  120. if (onClick && typeof onClick === 'function') {
  121. onClick(checked, this.state.currentValue);
  122. }
  123. });
  124. };
  125. render() {
  126. const {checkedChildren = '', unCheckedChildren = '', checked} = this.state;
  127. const {defaultChecked, loading, size, disabled} = this.props;
  128. return (
  129. <div>
  130. <Switch defaultChecked={defaultChecked} checkedChildren={checkedChildren}
  131. unCheckedChildren={unCheckedChildren}
  132. loading={loading}
  133. size={size}
  134. checked={checked}
  135. disabled={disabled}
  136. onChange={this.onSwitchChange}
  137. onClick={this.onSwitchClick}/>
  138. </div>
  139. )
  140. }
  141. }
  142. //默认属性
  143. NHSwitch.defaultProps = {
  144. loading: false,
  145. size: 'default',
  146. disabled: false,
  147. onChange: () => {
  148. },
  149. onClick: () => {
  150. }
  151. };
  152. //属性检查
  153. NHSwitch.propTypes = {
  154. sign: PropTypes.string, //数据源标识
  155. onChange: PropTypes.func, //变化时回调函数
  156. onClick: PropTypes.func, //点击时回调函数
  157. checkedChildren: PropTypes.string, //选中时的内容
  158. unCheckedChildren: PropTypes.string, //未选中的内容
  159. defaultChecked: PropTypes.bool, //初始是否选中
  160. loading: PropTypes.bool, //加载中的开关
  161. disabled: PropTypes.bool, //是否禁用
  162. size: PropTypes.string, //开关大小,可选值: default/small,默认为default
  163. dataSource: PropTypes.arrayOf( //自定义数据源
  164. PropTypes.shape({
  165. value: PropTypes.string,
  166. label: PropTypes.node
  167. })
  168. ),
  169. };
  170. export default NHSwitch;

三、测试

 

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/151849
推荐阅读
相关标签
  

闽ICP备14008679号