美文网首页
React+antd3.0常用问题和小技巧(持续更新)

React+antd3.0常用问题和小技巧(持续更新)

作者: 甘道夫老矣 | 来源:发表于2019-05-14 12:02 被阅读0次

    注:文章不断更新,遇到一个比较BT+EX的bug就加,如有错误往指正,感谢
    一般情况按着官网的来写不会出现什么问题,但是还是有不一样的问题出现

    1.react里面遇到的,对象的另一种引用方法:xxx.aa xxx['aa']

        {currMenu.map((item,index)=>{
            return(
                <div className={`${Styles.btnBase}  ${Styles[item.cssName]} lf`}>{}</div>
            )
        })}
    

    2.react遇到的,如果循环添加点击事件并且传入参数的写法

          onClick={(e) =>this.handleClick(item.path)}
       
    //  如果采用下面的方法,会导致加载的时候就会被调用
        
            onClick={this.handleClick(item.path)}
    

    3.React-antd的form表单中

    如果单独使用from而不是组件的话,@Form.create(),需要在这个类之前加上这个。否则getFieldDecorator这个属性用不了;
    如果你直接用组件来创建一个form的话,创建弹出框式的from:
    
    SendApply = Form.create({ name: 'form_in_modal' })(
          class extends Component {
            render() {
                  const { getFieldDecorator } = this.props.form;//记得加这个
               }
      }
        )
    

    4.React如果页面跳转后需要传个参数,然后另一个页面需要通过这个参数判断加载组件?

    需要在constructor里面来接收xxx:props.location.query.isModal,路由传来的数据,然后再根据this.state.xx来判断条件

    5.React-antd的form表单中

    如果单独使用from而不是组件的话,@Form.create(),需要在这个类之前加上这个。否则getFieldDecorator这个属性用不了;这个是和弹出框一起用的

    import { Form, DatePicker, Input } from "antd";
    //时间转换的
    import moment from 'moment';
    //核心
    @Form.create()
    export default class structureList extends Component {
         handleModalRecordedOk=()=>{
           this.setState({
               ModalRecordedVisible:false,
           })
           this.props.form.validateFieldsAndScroll((err, values) => {
               if (!err) {
                   let setDate=(moment(values.rzDate).format('YYYY-MM-DD'));//入账时间
                   console.log(values)
               }
           })
       }
       handleModalRecordedCancel=()=>{
           this.setState({
               ModalRecordedVisible:false,
           })
       }
    
        render() {
             const { form: { getFieldDecorator } } = this.props;//记得加这个
             const {ModalRecordedVisible}=this.state
             return(
                  <Modal
                       title="弹出框"
                       visible={ModalRecordedVisible}
                       onOk={this.handleModalRecordedOk}
                       onCancel={this.handleModalRecordedCancel}
                   >
                       <Form.Item label="日期:" labelCol={{span: 7}} wrapperCol={{span: 15}}>
                           {getFieldDecorator('rzDate', {})(<DatePicker  format="YYYY-MM-DD"  />)}
                       </Form.Item>
                       <Form.Item label="xx:" labelCol={{span: 7}} wrapperCol={{span: 16}}>
                           {getFieldDecorator('kjpz', {})(
                               <Input  placeholder="请输入xxx" />
                           )}
                       </Form.Item>
                 </Modal>
         )
        }
    }
    
    

    6.React如果页面跳转后需要传个参数,然后另一个页面需要通过这个参数判断加载组件?

    需要在constructor里面来接收props.location.query.isModal,路由传来的数据,然后再根据this.state.xx来判断条件

    7.在react里面如果父传子this.props 传入某个数据的时候,这个数据一定要做非空或者length>0的判断 再加载子组件,首先写react一定要有拆分思想,特别是需要传参数的那种组件,能拆就拆,拆完了要进行传参判断

    8.如何修改antd的内置样式

    //首先你要给修改的组件样式写个名字
    .modelTable{
      :global{
      //然后用global包裹起来,然后里面写组件的class名字,然后改样式
        .ant-table-tbody {
          color: #ABD0EE;
          font-size: 12px;
        }
    }
    //组件中
    <Table  className={andTable.modelTable} />
    

    9.怎么把antd中的table下面的分页给屏蔽了,官网有

    <Table   pagination={false}// 不显示分页就直径渲染出来 />
    

    10.怎么把antd中的table出现滚动条,官网有

    //你可以根据Data到底满足多少来才出现滚动条
    <Table   
     scroll={Data.length>=10?{y: 550}:false}
     />
    

    11.如何通过点击事件来跳转路由和传参

      Back=()=>{
        const {history} = this.props;
       history.push({ pathname: "/home",query:{lx:"0"}})
      }
    

    12.如果在antd的form中想要在输入文本的时候不能有空格,可以直接自动去重

    options.getValueFromEvent 可以把 onChange 的参数(如 event)转化为控件的值

    <Form.Item label="物具名称:" >
        {getFieldDecorator('furnitureName', {
           rules: [
                {required: true,message: '请输入物具名称'},
                { pattern: new RegExp(/^[0-9a-zA-Z_]{1,}$/, "g") , message: '正则验证' }
            ],
            //核心代码
          getValueFromEvent: event => event.target.value.replace(/\s+/g, ''),
        })(<Input  placeholder="请输入物具名称"/>)}
    </Form.Item>
    

    13.如何在antd的form中进行表单监听

    这个方法硬是找了好久都不知道怎么搞
    官网介绍
    onFieldsChange 当 Form.Item 子节点的值(包括 error)发生改变时触发,可以把对应的值转存到 Redux store
    onValuesChange 任一表单域的值发生改变时的回调
    setFieldsValue 设置一组输入控件的值(注意:不要在 componentWillReceiveProps 内使用,否则会导致死循环,原因) |

    直接上代码

    export default Form.create({
        onValuesChange(props, changedValues, allValues) {
                  //props----跟页面的const {xx}=this.props一样的意思,
                  //changedValues---是表单中的哪一个item发生了改变
                  //allValues----form中所有的字段;
                //实现实际情况,当价格和数量改变时,总价也变;
                  //1.获取当前的price和pricenum
            let sum=null,price=allValues.price,pricenum=allValues.pricenum;
            if(!price){
                price=1;
            }
            if(!pricenum){
                pricenum=1;
            }
                    //2.监听这两个item,做个判断,为了避免不必要的修改
            if(changedValues.pricenum || changedValues.price ){
                sum=price*pricenum;
                            //3.调用form中的设置方法,修改sumprice:sum
                props.form.setFieldsValue({sumprice:sum})
            }
        },
    })(furnitureRegister);
    //furnitureRegister就是当前的组件
    

    14.如何在antd的form中select 如果没默认值为什么不显示placeholder问题

    <Form.Item label="选择天气:" labelCol={{ span: 5 }} wrapperCol={{ span: 17 }} >
        {getFieldDecorator('repairResult', {
            rules: [
                { required: true, message: '请选择天气' }
            ],
                  //这里默认值设为undefined即可
            initialValue:record.raStat ? record.raStat :undefined
        })(
            <Select  placeholder="请输入天气"  >
                <Option value="晴天">晴天</Option>
                <Option value="阴天">阴天</Option>
            </Select>
        )}
    </Form.Item>
    

    15.antd的表格带分页功能和一页显示多少条信息

      this.state={
              page:{
            pageNum:1,
            total:20
        },//分页
        pageSize:10,//一页显示
      }
      //选择分页方法
        onShowSizeChange =(current, pageSize) =>{
                //设置
            this.setState({
                pageSize:pageSize
            });
        };
        //点击页码
        changePage = (current) => {
            let data = Object.assign({}, this.state.page, { pageNum: current });
            this.setState({
                page: data
            })
        };
    const paginationProps = {
        showTotal: () => `共${page.total}条`,//分页的条数
        pageSize: pageSize,//一页显示多少
        current:page.pageNum,//当前页面
        total: page.total,//总数
        onChange: (val) => this.changePage(val),//点击每页
        showSizeChanger:true,//是否启动选择一页显示多少条
        onShowSizeChange:(current, pageSize) => this.onShowSizeChange(current, pageSize)//方法
    };
    
    <Table
      rowKey={record => record.aiAiid}
      columns={columns}
      size="middle"
      loading={loading}
      pagination={ paginationProps }//这个就是分页的对象
      dataSource={dataSource}
      bordered
    />
    
    image.png

    16.react循环中加载不出静态的图片的问题

    如果下面的方法不行,那就是webpack配置文件出了问题了

     constructor(props) {
            super(props);
            this.state = {
              //这里需要把路径用require导入进来,否则不行;打包后也没问题
                psdList:[
                    {title:"模板1",srcImg:require("../../../public/psd/5030-1.png"),description:"50*30-1"},
                    {title:"模板2",srcImg:require("../../../public/psd/5030-2.png"),description:"50*30-2"},
                    {title:"模板3",srcImg:require("../../../public/psd/5030-3.png"),description:"50*30-3"}
                ]
            }
        }
    
             <div>
                    {
                        psdList.map((item,index)=>{
                            return (
                                <Card
                                    key={index}
                                    hoverable
                                    style={{ width: 240 }} 
                                    cover={<img alt="加载中..." src={item.srcImg} />}
                                >
                                    <Meta title={item.title} description={item.description} />
                                </Card>
                            )
                        })
                    }
                
                </div>
    

    17.antd中form多个表单元素相互验证,自定义校正validator

    参考:https://blog.csdn.net/JudyC/article/details/103362312

    <Form.Item label="取得日期:" >
        {getFieldDecorator('fiGeda', {
            rules: [
                { required: true, message: '请选择取得日期' },
                { validator: (rule, value, callback) => this.getDataChange(rule, value, callback) },
            ],
        })(<DatePicker format="YYYY-MM-DD" disabledDate={this.disabledEndDate} />)}
    </Form.Item>
          //取得日期
        getDataChange = (rule, value, callback)  =>{
            const {form} = this.props;
            const {getFieldValue, validateFields} = form;
            const fiUsda = getFieldValue('fiUsda');//获取需要比较的字段的值,
            // 因为不是必填项, 所以value有值时才进行判断
            if(value != null && value !== ''){
                if(fiUsda != null && fiUsda !== '' ){
                    if( fiUsda > value  ){
                        callback("取得日期必须大于投入使用日期")
                    }
                }
            }
            callback()
        };
    

    18.antd表格中如果需要做树形结构,然后还要做预加载,如果处理数据的问题

    官网叙述(见下图):
    1.如果需要树形结构表格,那么只要数据有children即可
    2.如果需要点击打开的话需要用到onExpand方法


    image.png
    image.png

    思路:1.如果是树形结构,那么第一级别加载的就是最父级的也就是顶级的数据,所以先加载出来
    2.点击当前条目只有父级,但是没子集,那么就是通过id去查询子集,然后赋值给点击的那个父级相同的id, item.children = res.result

    表格中需要加一个方法:onExpand(expanded, record)---expanded=点击开关true,false,record=当前条目

              <Table
                rowKey={record => record.caAsid}
                columns={columns}
                onExpand={(expanded, record)=>this.handldOnExpand(expanded, record)}
                size="middle"
                loading={loading}
                pagination={ false }
                dataSource={dataSource}
            />
    

    //下面是方法

        componentDidMount() {
          this.getTableData();
        }
    
      //获取第一级表格数据
        getTableFirst = async () =>{
            this.setState({
                loading: true
            });
            let res = await listService.selectAssetCodeOne();
            //console.log(res.result)
            this.setState({
                loading: false
            });
            if (res.statusCode !== 0) return message.info(res.message);
            this.setState({
                dataSource: res.result
            })
        };
    
        //展开开关,获取子集的数据
        handldOnExpand = async (expanded, record) => {
            const caAsid = record.caAsid
            const dataSource = this.state.dataSource
        
            if(!expanded)  return  //如果是关闭就返回
            if(record.children && record.children.length > 0)  return  //如果已经有数据就返回
            
            //这是接口,获取当前的id,查询子集中父级的id,一般都会有,比如行政区规划,做级联选择数据库肯定有父级的id
            let res = await listService.selectAssetCodeTwo(caAsid);
            if (res.statusCode !== 0) return message.info(res.message);
    
            const dataSet = (data) => {
                data.find((item) => {
                  if (item.caAsid === caAsid) {
                    //找到当前要展开的节点
                    item.children = res.result
                    return data
                  }
                  if (item.children && item.children.length > 0) {
                    dataSet(item.children)
                  }
                })
            }
            dataSet(dataSource || [])
            this.setState({
                dataSource
            })
            
        };
    
    

    19.如果在表格中操控modal,并且需要修改或者编辑,那么你需要在关闭modal清除上次他填写的数据

    只需要在modal中加入:destroyOnClose={true}即可


    image.png

    20.选择框弹出选择项如果滑动的页面的话,选择项的div会随之而动,只需要在上面加上

    getPopupContainer={trigger => trigger.parentNode}即可;

    相关文章

      网友评论

          本文标题:React+antd3.0常用问题和小技巧(持续更新)

          本文链接:https://www.haomeiwen.com/subject/hgfsaqtx.html