问题描述:

使用antd-mobile+rc-form做表单时,发现Picker等组件中的onChange回调函数用onChange={this.onChange}无法触发,封装的子组件无法像父组件传值。

注意:此处只是针对onChange的回调函数,其他回调函数依旧可以正常使用,因为,rc-form会获取onChange事件的变化来更新form表单里的值,导致此处像往常一样用onChange报错

原代码:可以触发

//子组件
import React, { Component } from 'react'
import './index.less'
import { Picker,List } from 'antd-mobile';
class selectPicker extends Component{
	constructor(props) {
        super(props);
        this.state = {

        };
	}
	componentWillMount(){  }
	componentDidMount(){}
    onChange = (val) => {
      console.log(val,"onChange");//此时可以打印出选中的value
    }
	render(){
         const { placeholder,data,title,keyName,rules ,disabled=false,initialValue} = this.props;
         const { getFieldProps, getFieldError } = this.props.form;
		return (
            <List style={{ backgroundColor: 'white' }} className="picker-list">
              <Picker
                data={data}
                cascade={false}
                extra={placeholder}
                onChange={this.onChange}
                cols={1} 
                disabled={disabled}> 
                <List.Item 
                  arrow="none" 
                  className={rules?"formItem-required":""}
                >{title}</List.Item>
                </Picker>
            </List>
           
		)
	}
}
export default selectPicker;

引入form中的getFieldProps去管理picker

在Picker中加入如下代码

 {...getFieldProps(keyName,
     { 
        initialValue:initialValue,
        rules:rules ,
     }
 )}

 变成如下代码后onChange无法触发

//子组件
import React, { Component } from 'react'
import './index.less'
import { Picker,List } from 'antd-mobile';
class selectPicker extends Component{
	constructor(props) {
        super(props);
        this.state = {

        };
	}
	componentWillMount(){  }
	componentDidMount(){}
    onChange = (val) => {
      console.log(val,"onChange");//此时不打印该条信息,没有触发onChange事件
    }
	render(){
         const { placeholder,data,title,keyName,rules ,disabled=false,initialValue} = this.props;
         const { getFieldProps, getFieldError } = this.props.form;
		return (
            <List style={{ backgroundColor: 'white' }} className="picker-list">
              <Picker
                data={data}
                cascade={false}
                extra={placeholder}
                onChange={this.onChange}
                cols={1} 
                {...getFieldProps(keyName,
                  { 
                    initialValue:initialValue,
                      rules:rules ,
                  }
                )}
                disabled={disabled}> 
                <List.Item 
                  arrow="none" 
                  className={rules?"formItem-required":""}
                >{title}</List.Item>
                </Picker>
            </List>
           
		)
	}
}
export default selectPicker;

解决办法:此时所有的回调函数都需要加上()如下

onChange={this.onChange()}

虽然这样改能触发onChange事件,却不能获取里面的val值,这是一个问题,那么我们要怎么获取这个值呢?这是个问题,我能想到的就只有是通过

this.props.form.getFieldsValue()[keyName]

来获取。其中keyName是你想获取的值得名称。

修改后的完成子组件代码如下:

//子组件
import React, { Component } from 'react'
import './index.less'
import { Picker,List } from 'antd-mobile';
class selectPicker extends Component{
	constructor(props) {
        super(props);
        this.state = {};
	}
	componentWillMount(){  }
	componentDidMount(){}

        onChange = (keyName) => {
            this.props.onChange(this.props.form.getFieldsValue()[keyName])//此时就可以把获取的值往父组件传啦
        }
	render(){
         const { placeholder,data,title,keyName,rules ,disabled=false,initialValue} = this.props;
         const { getFieldProps, getFieldError } = this.props.form;
		return (
            <List style={{ backgroundColor: 'white' }} className="picker-list">
              <Picker
                data={data}
                cascade={false}
                extra={placeholder}
                onChange={this.onChange(keyName)}
                cols={1} 
                {...getFieldProps(keyName,
                  { 
                    initialValue:initialValue,
                      rules:rules ,
                  }
                )}
                disabled={disabled}> 
                <List.Item 
                  arrow="none" 
                  className={rules?"formItem-required":""}
                >{title}</List.Item>
                </Picker>
            </List>
           
		)
	}
}
export default selectPicker;

 

 

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐