我正在使用输入元素和按钮元素创建组件.
例如,我需要获取输入值并与按钮一起使用.我怎样才能做到这一点?
这是我的代码:
var InputSearch = React.createClass({
getInitialState: function() {
return {
value: 'pics'
}
},
handleChange: function() {
this.setState({
value: event.target.value
});
},
render: function() {
return (
<input type="text" value={this.state.value} onChange={this.handleChange} />
)
}
});
var ButtonSearch = React.createClass({
handleClick: function(event) {
console.log(this.state.value); // here's go the input value
},
render: function() {
return (
<button onClick={this.handleClick}>GO! </button>
)
}
});
var Search = React.createClass({
render: function() {
return (
<div>
<InputSearch />
<ButtonSearch />
</div>
)
}
});
React.render(
<Search />,
document.getElementById('result')
);
解决方法:
这里的一个问题是您违反了一个好的规则-分离智能组件和哑组件. https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0
做到这一点的方法是拥有一个父组件,该组件拥有子组件的所有状态和功能,并将所有这些作为道具传递下来.
//Our smart parent
var SearchContainer = React.createClass({
getInitialState : function() {
return {
value : 'pics'
}
},
handleInput : function(event) {
this.setState({value: event.target.value});
},
render : function() {
return (
<div>
<InputSearch value={this.state.value} onChange={this.handleInput} />
<ButtonSearch value={this.state.value} />
</div>
)
}
});
//Our dumb children
var InputSearch = React.createClass({
propTypes : {
onChange : React.PropTypes.func.isRequired,
value : React.PropTypes.string
},
render : function() {
return (
<input type="text" value={this.props.value} onChange={this.props.onChange} />
)
}
});
var ButtonSearch = React.createClass({
propTypes : {
value : React.PropTypes.string
},
handleClick : function() {
console.log(this.props.value); //log value
},
render : function() {
return (
<button onClick={this.handleClick}>GO! </button>
)
}
});
React.render(<Search />, document.getElementById('result'));
在这里,我们将处理函数从父级传递到子级,因此输入并不关心更改时触发的事件发生什么,它只需要知道它有一个名为onChange的道具即该函数就可以调用它.
父级(SearchContainer)处理所有这些功能,并将更改后的状态向下传递给按钮和输入.
希望能有所帮助
担