Ant Design父组件一次性获取子组件表单值

文章目录

业务需求

父组件获取子组件数值,子组件是一个表单,包含Cascader、Select两种类型组件,其中能源类型Select根据Cascader数值拿到,效果如图:
在这里插入图片描述
其中antd版本3.26.3

实现思路

通过使用 onFieldsChange获取表单值,通过回调函数传给父组件。antd官方说明

父组件


  // changedFields是子组件表单变化值,allFields是子组件表单所有值
  handleSearchBarFormChange = (changedFields, allFields) => {
    
    
    const obj = {
    
    
      buildingId: allFields.buildings.value[1],
      energySort: allFields.sorts.value,
      year: allFields.year.value,
    };

    if (obj.buildingId !== null && obj.energySort !== null && obj.year !== null) {
    
    
      this.generateTreeData(this.pageType, obj.buildingId, obj.energySort);
      this.setState({
    
    
        searchBar: obj,
      });
    }
  };


 render() {
    
    
    return (
        <EnergySortSearchBar
        // 父组件通过onChange获得子组件表单值
       onChange={
    
    this.handleSearchBarFormChange}
       initState={
    
    this.handleInitSearchBarValues}
      />
    );
  }

子组件

@Form.create({
    
    
  onFieldsChange(props, changedFields, allFields) {
    
    
  // 关键在这里,通过onFieldsChange获取表单变化值以及表单所有值,
  // 通过回调函数传给父组件
    props.onChange(changedFields, allFields); 
  },
})
class EnergySortSearchBar extends PureComponent {
    
     

 /**
   * 渲染建筑级联Cascade
   */
  renderBuildingCascade = () => {
    
    
    // 省略部分代码
    return (
      <FormItem name="buildings" label="建筑名称" labelCol={
    
    8} wrapperCol={
    
    16}>
        {
    
    getFieldDecorator(`buildings`, {
    
    
          initialValue,
        })(<Cascader {
    
    ...cProps} className={
    
    styles.item} onChange={
    
    this.handleBuildingChange} />)}
      </FormItem>
    );
  };
  
  /**
   * 渲染能源种类Select
   */
  renderEnergySorts = () => {
    
    
   // 省略部分代码
    return (
      <FormItem label="分类能耗" labelCol={
    
    8} wrapperCol={
    
    16}>
        {
    
    getFieldDecorator(`sorts`, {
    
    
          initialValue: sorts !== null ? sorts[0].name : null,
        })(
          <Select changeOnSelect placeholder="请选择能耗" className={
    
    styles.item}>
            {
    
    this.renderOptions(sorts)}
          </Select>
        )}
      </FormItem>
    );
  };
  /**
   * 渲染YearPicker
   * @return JSX
   */
  renderYearPicker = () => {
    
    
   // 省略部分代码
    return (
      <FormItem label="年份" labelCol={
    
    8} wrapperCol={
    
    16}>
        {
    
    getFieldDecorator(`year`, {
    
    
          initialValue: moment().format('YYYY'),
        })(<YearPicker onChange={
    
    this.handleYear} className={
    
    styles.item} displayDefaultTime />)}
      </FormItem>
    );
  };


render() {
    
    
      // 省略部分代码

    return (
      <div className={
    
    styles.tableListForm}>
        <Form layout="inline">
          <Row gutter={
    
    16} type="flex">
            <Col span={
    
    6}>{
    
    this.renderBuildingCascade()}</Col> /
            <Col span={
    
    4}>{
    
    this.renderEnergySorts()}</Col>
            <Col span={
    
    4}>{
    
    this.renderYearPicker()}</Col>
          </Row>
        </Form>
      </div>
    );
  }
}

猜你喜欢

转载自blog.csdn.net/qq_34307801/article/details/105710314