• ant design 封装可填写Tag标签的input框


    如图,input框可填写多个值,每个值以Tag标签的形式展示,每个标签可以新增和删除,自动过滤重复的标签。还能结合from表单,做必填值的验证。

    如果没有值,提交表单的时候,会提示错误。

     话不多说,直接上代码:

    这个是selfTag.js:

    import {Input, Tag, Tooltip} from 'antd';
    import React, { Component } from 'react';
    
    class newTag extends Component {
      constructor(props) {
        super(props);
        this.state = {
          inputVisible: false,
          inputValue: '',
          // gorTagArr:["未处理","上线"],
          // gorTag:[
          //   {
          //     id:1,
          //     name:"未处理",
          //   },
          //   {
          //     id:2,
          //     name:"上线",
          //   }
          // ]
          gorTagArr:[],
          gorTag:[]
        };
      };
    
      componentDidMount() {
        const {gorTagArr}=this.props;
        const newVal=gorTagArr.map((item,index)=>({id:index,name:item}));
        this.setState({
          gorTagArr:gorTagArr,
          gorTag:newVal
        })
      };
    
      handleClose = removedTag => {
        const { gorTag,gorTagArr } = this.state;
        const { onOk } = this.props;
        const gorNameArr = gorTag.map(item => item.name);
        const inde = gorNameArr.indexOf(removedTag);
        this.setState({
          gorTagArr:gorTagArr.filter(i=>i!==removedTag),
          gorTag:gorTag.filter(i=>i.id!==inde),
        });
        onOk(gorTagArr.filter(i=>i!==removedTag));
      };
    
      saveInputRef = input => (this.input = input);
    
      handleInputChange = e => {
        this.setState({ inputValue: e.target.value });
      };
    
      showInput = () => {
        this.setState({ inputVisible: true }, () => this.input.focus());
      };
    
      handleInputConfirm = () => {
        const { onOk } = this.props;
        const { gorTag,gorTagArr,inputValue } = this.state;
        const gorNameArr = gorTag.map(item => item.name);
        const gorIdArr = gorTag.map(item => item.id);
        if (inputValue && gorNameArr.indexOf(inputValue) === -1) {
          const maxId = gorIdArr.length === 0 ? 0 : Math.max(...gorIdArr);
          onOk([...gorTagArr,inputValue]);
          this.setState({
            inputVisible: false,
            inputValue: '',
            gorTagArr:[...gorTagArr,inputValue],
            gorTag:[...gorTag,{id: maxId + 1, name: inputValue}]
          });
         }else{
          this.setState({
            inputVisible: false,
            inputValue: '',
          });
        }
      };
    
    
      render() {
        const {inputVisible, inputValue,gorTagArr}=this.state;
        return (
          <div
            style={{
              border: '1px solid rgb(216,216,216)',
              borderRadius: 2,
               '100%',
              padding: '5px 10px',
              marginTop: 0,
              display:"inline-block"
            }}
          >
              {gorTagArr.map((tag, index) => {
                const isLongTag = tag.length > 20;
                const tagElem = (
                  <Tag key={tag} closable={index > -1} onClose={() => this.handleClose(tag)}>
                    {isLongTag ? `${tag.slice(0, 20)}...` : tag}
                  </Tag>
                );
                return isLongTag ? (
                  <Tooltip title={tag} key={tag}>
                    {tagElem}
                  </Tooltip>
                ) : (
                  tagElem
                );
              })}
              {inputVisible && (
                <Input
                  ref={this.saveInputRef}
                  type="text"
                  size="small"
                  style={{  78 }}
                  value={inputValue}
                  onChange={this.handleInputChange}
                  onBlur={this.handleInputConfirm}
                  onPressEnter={this.handleInputConfirm}
                />
              )}
              {!inputVisible && (
                <Tag onClick={this.showInput} style={{ background: '#fff', borderStyle: 'dashed' }}>
                  +新增
                </Tag>
              )}
            </div>
        );
      }
    }
    
    export default newTag;

      这是使用这个组件的代码:

    import {Card, Col, Row, Form, Table, Button, Input, Tag,} from 'antd';
    import React, { Component, Fragment } from 'react';
    import { connect } from 'dva';
    import SelfTag from "./selfTag";
    
    const FormItem = Form.Item;
    
    @connect(({ portrait,loading }) => ({
      portrait,
      listLoading: loading.effects['portrait/fetchBlockIpList'],
    }))
    class blockIp extends Component {
      constructor(props) {
        super(props);
        this.state = {
          page:1,
          size:15,
          text:"",
          val:{},
          flog:true,
          data:{},
          stat:""
        };
      };
    
      componentDidMount() {
      };
    
      handleTableChange = pagination => {
        const { current, pageSize } = pagination;
        const {dispatch} = this.props;
        const {val}=this.state;
        this.setState({page:current,size:pageSize})
      };
    
      handleSearch = (values) => {
        const { dispatch } = this.props;
        dispatch({
          type: 'portrait/fetchPortraitCommon',
          payload: {
            ...values,
          },
        });
        this.setState({val:values})
      };
    
      handleOk=(vale)=>{
        if(vale.length>0){
          this.searchForm.setFieldsValue({"targetUidList":vale})
        }else{
          this.searchForm.setFieldsValue({"targetUidList":undefined})
        }
      }
    
      // 模糊查询表单
      renderSearchForm() {
        const formItemLayout = {
          labelCol: { span: 8 },
          wrapperCol: { span: 16 },
        };
        return (
          <div style={{ marginBottom: 12 }}>
            <Form
              {...formItemLayout}
              onFinish={this.handleSearch}
              ref={(c)=>{this.searchForm=c}}
            >
              <Row>
                <Col span={8}>
                  <FormItem
                    label="源uid"
                    name="sourceUid"
                    rules={[{ required: true, message: '请输入' }]}
                  >
                    <Input placeholder="请输入" />
                  </FormItem>
                </Col>
                <Col span={8}>
                  <FormItem
                    label="目的uid"
                    name="targetUidList"
                    rules={[{ required: true, message: '请输入' }]}
                  >
                    <SelfTag onOk={this.handleOk} gorTagArr={[]} />
                  </FormItem>
                </Col>
                <Col span={8}>
                  <FormItem style={{ textAlign: 'right' }}>
                    <Button type="primary" htmlType="submit"  >
                      查询
                    </Button>
                     
                    <Button  onClick={() => {this.searchForm.resetFields()}} htmlType="button">
                      重置
                    </Button>
                  </FormItem>
                </Col>
              </Row>
            </Form>
          </div>
        );
      }
    
      render() {
        const {
          portrait: { commonList},
          listLoading
        } = this.props;
        const {page,size,}=this.state;
    
        const columns = [
          {
            title: 'uid',
            dataIndex: 'uid',
            align:"center",
          },
          {
            title: "存在的关系",
            dataIndex: 'relation',
            align:"center",
            render:(relation)=><div>
              {relation.map((i)=><Tag key={i}>{i}</Tag>)}
            </div>
          },
        ];
    
    
        return (
          <Card bordered={false}>
            {this.renderSearchForm()}
            <Table
              columns={columns}
              dataSource={commonList}
              loading={listLoading}
              bordered
              rowKey="uid"
              onChange={this.handleTableChange}
            />
          </Card>
        );
      }
    }
    
    export default blockIp;
    

      

  • 相关阅读:
    .net core 3.1 添加mysql ef core
    使用HttpContext.SignInAsync实现简单的授权
    linux部署harbor和基本使用
    委托,事件,Action , Func
    .net core 第三方Microsoft账号登录
    Persist Security Info 参数的作用
    SQL Server2008附加数据库之后显示为只读时解决方法
    Oracle 数据库学习笔记(五)(数据库修改密码(表密码,sys密码,system密码))
    JS做”返回顶部”按钮功能并实现滑动效果
    SQL Server 2008 允许远程链接 解决方法
  • 原文地址:https://www.cnblogs.com/class1/p/16046516.html
Copyright © 2020-2023  润新知