项目中react ant遇到的一些坑

本文探讨了两种实现动态表单的方法:一种是预先注册所有表单项并可能导致缓存问题;另一种则根据条件动态注册表单项,避免不必要的组件注册。通过对比分析,展示了如何优化动态表单的渲染流程。

ant form 动态变更表单项

form 表单不能提前注册比如

render(){
    const { visible,onCreate,onCancel, form, title } = this.props;
    let property = null;

    if(!isEmptyObject(this.props.propertys)){
        property = this.props.propertys.propertys.filter((property)=>property.visiable)
            .sort((propertya,propertyb)=> propertya.index-propertyb.index )
            .map((property)=>addFormFactory(property,this.props.form));
    }
    let show = (this.state.tasktype == "测试任务")
        ? <CaseTask {...this.props} testtaskpropertys = {this.props.testtaskpropertys} />
        : property
    const {getFieldDecorator} = form;
    // console.log(this.props);
    return (
        <Modal
            visible={visible}
            title={title}
            okText="提交"
            cancelText="取消"
            onCancel={onCancel}
            onOk={onCreate}
            >
            <Form layout="vertical" >
                {(isEmptyObject(this.props.propertys))?null:(this.props.propertys.projectItem === "task")
                    ? <FormItem label={"任务类型"}>
                        {getFieldDecorator("任务类型", {
                            rules: [{ required:false, message: `Please select your !` }],
                        })(
                            <RadioGroup onChange={this.handleClick.bind(this)}>
                                <RadioButton value="普通任务">{"普通任务"}</RadioButton>
                                <RadioButton value="测试任务">{"测试任务"}</RadioButton>
                            </RadioGroup>
                        )}
                    </FormItem>
                    : null
                }
                {/*{property}*/}
                {/*<CaseTask {...this.props} />*/}
                {show}
            </Form>
        </Modal>
    );
}

但是改造成这样

render(){
    const { visible,onCreate,onCancel, form, title } = this.props;
    let property = null;

    const {getFieldDecorator,getFieldValue} = form;
    let typeButton = taskType.map((task)=><RadioButton value={task.taskId}>{task.taskName}</RadioButton>)
    return (
        <Modal
            visible={visible}
            title={title}
            okText="提交"
            cancelText="取消"
            onCancel={onCancel}
            onOk={onCreate}
        >
            <Form layout="vertical" >
                {(isEmptyObject(this.props.propertys))?null:(this.props.propertys.projectItem === "task")
                    ? <FormItem label={"任务类型"}>
                        {getFieldDecorator("taskType", {
                            rules: [{ required:true, message: `请选择任务类型` }],
                        })(
                            <RadioGroup onChange={this.handleClick.bind(this)}>
                                {typeButton}
                            </RadioGroup>
                        )}
                    </FormItem>
                    : null
                }
                {(getFieldValue("taskType")===2)? <CaseTask form={form} testtaskpropertys = {this.props.testtaskpropertys}/>:
                    (!isEmptyObject(this.props.propertys))?this.props.propertys.propertys.filter((property)=>property.visiable)
                    .sort((propertya,propertyb)=> propertya.index-propertyb.index )
                    .map((property)=>addFormFactory(property,this.props.form)):""}
            </Form>
        </Modal>
    );
}

 

区别就是第一个会注册完全部的表单项组件,会产生cache,所有的组件都会注册到form上,不能通过更新组件来重新渲染form,第二个将组件渲染留到最后。并且根据动态判断会不断重新注册表单项

转载于:https://my.oschina.net/haloooooo/blog/1647034

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值