自写一个漂亮的ant design form提交标签

在ant design 的form组件中 能用于提交的组件比较少,所以我在这写了一个可以单选、多选标签提交的组件,调用非常简单。

代码:

  1 import React,{Fragment} from ‘react‘;
  2 import { Tag,Icon,Input } from ‘antd‘;
  3 export interface TagDataType{
  4     data:string,
  5     color:string,
  6     key:string
  7 }
  8 export interface Props {
  9     data:Array<TagDataType>,
 10     click?:boolean,//是否可点击
 11     defaultKey?:string | Array<string>,//默认选择tag的key
 12     checkbox?:boolean,//多选
 13     form?:any,//菜单验证方法
 14     dataValidationName?:string,//设置提交名称,若用此参数提交则提交选中的data,用于菜单提交获取
 15     keyValidationName?:string,//设置提交名称,若用此参数提交则提交选中的key,用于菜单提交获取
 16     notNull?:boolean,//选项不能为空
 17 }
 18
 19 export interface State {
 20     //tagData:TagDataType | undefined,
 21     keys:string,
 22     datas:string,
 23     styleState:number | Array<number>,
 24 }
 25
 26 class TagOpt extends React.Component<Props, State> {
 27     constructor(props: Props) {
 28         super(props);
 29         //验证传入数据的合法性
 30         if(this.props.notNull && !!!this.props.defaultKey){
 31             throw Error(‘TagOpt选中项为空,设置defaultKey!‘);
 32         }
 33         if(!!this.props.form && !!!this.props.keyValidationName && !!!this.props.dataValidationName){
 34             throw Error(‘若要使用form提交,请设置keyValidationName或dataValidationName!‘);
 35         }
 36         this.state=this.setDefaultVal();
 37     }
 38     //鼠标点击标签事件
 39     TagClick = (tagData:TagDataType,index:number) =>{
 40         if(this.props.click !== undefined && this.props.click){
 41             if(this.props.checkbox){
 42                 const optIf = this.optIf(index);
 43                 let styleState:Array<number> = new Array();;
 44                 if(typeof this.state.styleState === ‘object‘){
 45                     styleState = [...this.state.styleState];
 46                 }else{
 47                     styleState = [this.state.styleState];
 48                 }
 49                 if(optIf.state){
 50                     //点击已选择
 51                     //如果设置不为空且选中选项大于1或者没有设置不为空选项
 52                     //则清空
 53                     if(this.props.notNull && styleState.length>1 || !!!this.props.notNull){
 54                         styleState.splice(optIf.index,1);
 55                         this.setState({
 56                             keys:this.moveSubString(this.state.keys,tagData.key),
 57                             datas:this.moveSubString(this.state.datas,tagData.data),
 58                             styleState
 59                         },()=>{this.setVal(this.state.datas,‘data‘);this.setVal(this.state.keys,‘key‘)});
 60                     }
 61                 }else{
 62                     //点击未选择
 63                     styleState.splice(styleState.length,0,index);
 64                     this.setState({
 65                         keys:this.addSubString(this.state.keys,tagData.key),
 66                         datas:this.addSubString(this.state.datas,tagData.data),
 67                         styleState
 68                     },()=>{this.setVal(this.state.datas,‘data‘);this.setVal(this.state.keys,‘key‘)});
 69                 }
 70             }else{
 71                 if(this.state.styleState === index){
 72                     //点击已选择
 73                     //若设置可以为空
 74                     //则清空
 75                     if(!!!this.props.notNull){
 76                         this.setState({keys:‘‘,datas:‘‘,styleState:this.props.data.length}
 77                         ,()=>{this.setVal(this.state.datas,‘data‘);this.setVal(this.state.keys,‘key‘)});
 78                     }
 79                 }else{
 80                     //点击未选择
 81                     this.setState({keys:tagData.key,datas:tagData.data,styleState:index}
 82                     ,()=>{this.setVal(this.state.datas,‘data‘);this.setVal(this.state.keys,‘key‘)});
 83                 }
 84             }
 85         }
 86     }
 87     //返回移出指定子串的字符串,移出所有重复子串
 88     moveSubString = (str:string,subString:string):string => {
 89         let array:Array<string> = str.split(‘,‘);
 90         for(let i=0;i<array.length;i++){
 91             if(array[i] === subString){
 92                 array.splice(i,1);
 93             }
 94         }
 95         return array.toString();
 96     }
 97     //返回增加子串的字符串,重复则不增加
 98     addSubString = (str:string,subString:string|Array<string>) =>{
 99         if(typeof subString === ‘string‘){
100             let comma = str !==‘‘?‘,‘:‘‘;
101             return str +comma+subString;
102         }else{
103             let s:string = str;
104             for(let i=0;i<subString.length;i++){
105                 let comma = s !==‘‘?‘,‘:‘‘;
106                 s+=comma+subString[i];
107             }
108             return s;
109         }
110     }
111     //选择判断
112     optIf = (index:number):{state:boolean,index:number} => {
113         if(typeof this.state.styleState ===‘number‘){
114             return {state:this.state.styleState === index,index:0};
115         }else{
116             let falg:boolean = false;
117             const styleState = this.state.styleState;
118             let i=0;
119             for(;i<styleState.length;i++){
120                 if(styleState[i] === index){
121                     falg = true;
122                     break;
123                 }
124             }
125             return {state:falg,index:i};
126         }
127     }
128     //写入表单
129     setVal = (data:string,type:string) => {
130         if(this.props.form != undefined){
131             let json:object = {}
132             if(type === ‘data‘){
133                 if(this.props.dataValidationName !== undefined){
134                     json[this.props.dataValidationName] = data;
135                     this.props.form.setFieldsValue(json);
136                 }
137             }else if(type === ‘key‘){
138                 if(this.props.keyValidationName !== undefined){
139                     json[this.props.keyValidationName] = data;
140                     this.props.form.setFieldsValue(json);
141                 }
142             }
143         }
144     }
145     //默认值转换
146     setDefaultVal=():State=>{
147         if(this.props.checkbox){
148             //多选框,值为1个或数组
149             let styleState:Array<number> = new Array();
150             let keys:Array<string> = new Array();
151             let datas:Array<string> = new Array();
152             const {defaultKey,data} = this.props;
153             if(typeof defaultKey === ‘object‘){
154                 for(let i=0;i<defaultKey.length;i++){
155                     for(let j=0;j<data.length;j++){
156                         if(defaultKey[i] === data[j].key){
157                             styleState.push(i);
158                             keys.push(data[j].key);
159                             datas.push(data[j].data);
160                         }
161                     }
162                 }
163                 return {
164                     keys:this.addSubString(‘‘,keys),
165                     datas:this.addSubString(‘‘,datas),
166                     styleState
167                 }
168             }else{
169                 let i:number = 0;
170                 let key:string = ‘‘;
171                 let dat:string = ‘‘;
172                 for(;i<data.length;i++){
173                     if(data[i].key === defaultKey){
174                         key=data[i].key;
175                         dat=data[i].data;
176                         break;
177                     }
178                 }
179                 return { keys:key,datas:dat,styleState: i };
180             }
181         }else if(this.props.checkbox === undefined && typeof this.props.defaultKey ===‘string‘ ||
182             !this.props.checkbox && typeof this.props.defaultKey ===‘string‘){
183             //多选未设置且默认值为1个或单选且默认值为一个
184             let i:number = 0;
185             let key:string = ‘‘;
186             let dat:string = ‘‘;
187             if(this.props.defaultKey !== undefined){
188                 const data = this.props.data;
189                 for(;i<data.length;i++){
190                     if(data[i].key === this.props.defaultKey){
191                         key=data[i].key;
192                         dat=data[i].data;
193                         break;
194                     }
195                 }
196             }
197             return { keys:key,datas:dat,styleState: i };
198         }else if(this.props.defaultKey === undefined || this.props.defaultKey === ‘‘ || this.props.defaultKey === []){
199             if(this.props.checkbox){
200                 return { keys:‘‘,datas:‘‘,styleState: [] };
201             }else{
202                 return { keys:‘‘,datas:‘‘,styleState: this.props.data.length };
203             }
204         }else{
205             return {keys:‘‘,datas:‘‘,styleState: this.props.data.length};
206         }
207     }
208     render() {
209         const content:any = this.props.data.map((tagData:TagDataType,index:number)=>{
210             const cursor:any = this.props.click !== undefined && this.props.click ?‘pointer‘:‘default‘;
211             return(
212                 <Tag color={tagData.color} key={tagData.key} onClick={this.TagClick.bind(this,tagData,index)} style={{cursor}}>
213                     {tagData.data}
214                     {this.optIf(index).state?<Icon type="check" />:undefined}
215                 </Tag>
216             )
217         });
218         return (
219             <Fragment>
220                 {content}
221                 {
222                     !!this.props.click && !!this.props.form && !!this.props.form.getFieldDecorator && !!this.props.keyValidationName?
223                     this.props.form.getFieldDecorator(this.props.keyValidationName, {
224                         initialValue:this.state.keys,
225                     })(<Input type="hidden"/>)
226                     :undefined
227                 }
228                 {
229                     !!this.props.click && !!this.props.form &&!!this.props.form.getFieldDecorator && !!this.props.dataValidationName
230                     && !!!this.props.keyValidationName?
231                     this.props.form.getFieldDecorator(this.props.dataValidationName, {
232                         initialValue:this.state.datas,
233                     })(<Input type="hidden"/>)
234                     :undefined
235                 }
236             </Fragment>
237          );
238     }
239 }
240 export default TagOpt;

效果:

原文地址:https://www.cnblogs.com/chengpu/p/web4.html

时间: 2024-09-30 06:12:46

自写一个漂亮的ant design form提交标签的相关文章

ant design form表单的时间处理

ant design form表单的时间处理 用ant design开发程序时,会碰到时间的字段,效果如下: 那么该怎么处理呢?可以在表单中使用如下代码: import { DatePicker } from 'antd' import Moment from 'moment' <FormItem label="开始时间" {...formItemLayout}> { getFieldDecorator('sdate', { initialValue: item.sdate

如何写一个漂亮的Liferay Theme 6.2

只要你看到的.想做出来的页面,都可以通过liferay theme来实现,至于具体实现凡方式,那就见仁见智了. 下面,我将介绍如何快速地建一个简单漂亮的liferay theme. 工具:liferay IDE 3.0, liferay SDK 6.2,liferay portal 6.2(至于怎么在哪里下载,请参考前面教程) 以上工具准备好了以后,就可以在网上随便找一个你喜欢的模板作为参考下载下来,等下我们就可以把你的theme改造成你想要的样纸啦. 下面是我做的成品: 下面就是具体制作过程啦

基于ant design form的二次封装

// standardForm.js import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { Form, Input, Row, Col, Button } from 'antd'; const FormItem = Form.Item; // 默认的layout export const defaultLabelColSpan = 8; const defaultFor

PHP入门培训教程 一个漂亮的PHP验证码

PHP入门培训教程 一个漂亮的PHP验证码 如何写一个漂亮的PHP验证码?兄弟连PHP培训小编分享一段代码给大家: <?php class Imagecode{ private $width ; private $height; private $counts; private $distrubcode; private $fonturl; private $session; function __construct($width = 120,$height = 30,$counts = 5,$

react + es6 +ant design 实现一个简单demo表格添加删除

首先介绍一下整体的样式及实现的效果 如图所示,点击添加按钮会接着后面新增一行,点击操作下的删除图标将会删掉一行,如果删掉序号为1的行,第二行会自动变成第一行序号也会随之改变. ps:数据交互均还未实现. 介绍完毕:下面正题! 1.布局 import React, { Component, PropTypes } from 'react';import { Table, DatePicker, Select, InputNumber, Input, Button, Icon } from 'ant

如何利用Facebook的create-react-app脚手架创建一个基于ant design mobile的项目

引言: create-react-app是Facebook发布的一款全局的命令行工具用来创建一个新的项目. 通常我们开始做一个react web或者 app 项目的时候,都会自己利用 npm 或者 yarn 安装项目所需要的一些依赖,再写 webpack.config.js ,一系列复杂的配置,搭建好开发环境后写src源代码. 现在,如果你想要搭建一个完整的 react 项目环境,已经不需要自己动手布置许许多多的东西,利用 create-react-app 工具,就能轻松帮你配置好一个 reac

Bootstrap--模仿官网写一个页面

本文参考Bootstrap官方文档写了简单页面来熟悉Bootstrap的栅格系统.常用CSS样.Javascript插件和部分组件. 以下html代码可以直接复制本地运行: BootstrapPage1:常见的一种页面类型,页面导航,左侧分类.右侧新闻列表: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8&q

一个漂亮的php验证码类

一个漂亮的php验证码类(分享) 作者: 字体:[增加 减小] 类型:转载 下面小编就为大家分享一个漂亮的php验证码类.需要的朋友可以过来参考下 直接上代码: 复制代码 代码如下: //验证码类class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子 private $code;//验证码 private $codelen = 4;//验证码长度 pri

使用express、react、webpack打包、socket.io、mongodb、ant.design、less、es6实现聊天室

拿到一个项目,我们应该如何去完成这个项目呢. 是直接上手? 还是先进行分析,然后再去解决呢?毫无疑问,如果直接上手解决,那么可能会因为知道目标所在,而导致出现各种问题. 所以,我们应该系统的分析这个项目,然后再去完成. 第一步: 需求 除了上面的基本需求之外,我们还需要实现登录.注册的相关功能,这样可以保证用户的唯一性,并在后台做出记录. 第二步:确定技术栈 express --- 首先,作为前端使用node就可以取代后端java.php开发的工作,对于这个项目是必须的.作为node的框架,ex