我有一个组件,可以说它包含一个表单。该表单具有子组件,这些子组件本质上是用于输出文本输入和选择菜单的UI小部件。
选择菜单组件有点花哨,并使用onChange事件进行一些状态维护。
我的问题是;如何从父(窗体)组件中插入onChange事件以选择菜单?我无法通过道具传递onChange,因为我已经在select组件中指定了onChange,并且我不想覆盖它。
例:
var Form = React.createClass({ handleSelectChange: function(){ // Do something when <Select /> changes }, render: function () { var selectMenuOptions = [ {label: 'Choose...', value: ''}, {label: 'First option', value: 'one'}, {label: 'Second option', value: 'two'} ]; return ( <form> <Select name="selectMenu" id="selectMenu" options={selectMenuOptions} /> </form> ); } }); var Select = React.createClass({ getDefaultProps: function() { return { options: [], className: "select" }; }, getInitialState: function () { return { buttonText: 'Loading...', defaultValue: null }; }, handleChange: function (e) { // Update buttonText state }, render: function () { return ( <div className={this.props.className}> <div className="select__button">{this.state.buttonText}</div> <select className="select__selector" ref="select" onChange={this.handleChange}> {this.props.options.map(function(option, i){ return (<Option option={option} key={i} />); })} </select> </div> ); } });
使用<Select onChange={...} />不会覆盖<select onChange={...} />内部Select的render方法。该<Select/>组件和<select/>组件它呈现具有完全不同的套props。
<Select onChange={...} />
<select onChange={...} />
render
<Select/>
<select/>
props
我认为,执行所需操作的最简单方法是handleChange调用Select的方法this.props.onChange。您可以将其传递给相同的e参数handleChange:
handleChange
this.props.onChange
e
var Form = React.createClass({ handleSelectChange: function(){ // Do something when <Select /> changes }, render: function () { // ... return ( <form> <Select name="selectMenu" id="selectMenu" options={selectMenuOptions} onChange={this.handleSelectChange} /> </form> ); } }); var Select = React.createClass({ // ... handleChange: function (e) { if (this.props.onChange) { this.props.onChange(e); } // Update buttonText state }, render: function () { return ( <div className={this.props.className}> <div className="select__button">{this.state.buttonText}</div> <select className="select__selector" ref="select" onChange={this.handleChange}> {this.props.options.map(function(option, i){ return (<Option option={option} key={i} />); })} </select> </div> ); } });