React:如何监听子组件事件
React: How to listen to child component events
我有一个组件,假设它包含一个表单。该表单具有子组件,它们本质上是 UI 用于输出文本输入的小部件和 select 菜单。
select 菜单组件有点花哨,可以使用 onChange 事件进行一些状态维护。
我的问题是;如何从父(表单)组件挂接到 select 菜单的 onChange 事件?我无法通过 props 传递 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 的 render
方法中的 <select onChange={...} />
。 <Select/>
组件和它渲染的<select/>
组件有完全不同的一组props
.
我认为,最简单的方法是调用 Select 的 handleChange
方法 this.props.onChange
。您可以将相同的 e
参数传递给它 handleChange
接收:
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>
);
}
});
我有一个组件,假设它包含一个表单。该表单具有子组件,它们本质上是 UI 用于输出文本输入的小部件和 select 菜单。
select 菜单组件有点花哨,可以使用 onChange 事件进行一些状态维护。
我的问题是;如何从父(表单)组件挂接到 select 菜单的 onChange 事件?我无法通过 props 传递 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 的 render
方法中的 <select onChange={...} />
。 <Select/>
组件和它渲染的<select/>
组件有完全不同的一组props
.
我认为,最简单的方法是调用 Select 的 handleChange
方法 this.props.onChange
。您可以将相同的 e
参数传递给它 handleChange
接收:
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>
);
}
});