我有以下组件可以正常使用this.refs.searchString.value
,但如果我只是event.target.value
,它会有效吗?如果是这样,哪一个是首选方法?每个人的优点和缺点是什么?
const SearchBar = React.createClass({
handleSubmit (event) {
event.preventDefault()
const formattedSearchString = this.refs.searchString.value.replace(/[^a-z]/gi, "").toLowerCase()
this.refs.searchString.value = ''
this.props.submitSearch(formattedSearchString)
},
render() {
return (
<form className="form form-group has-info col-md-4 text-align-center" onSubmit={this.handleSubmit}>
<input className="search-input form-control" type="text" ref="searchString" placeholder=" . . . enter pokemon name" />
<button className="btn btn-info btn-raised" type="submit" name="button">Search!</button>
</form>
)
}
})
答案 0 :(得分:1)
正如文档we shouldn't overuse refs中所述,首选方法是使用Controlled Components使用event.target.value
。
const SearchBar = React.createClass({
getInitialState(){
return {textValue: ""};
},
onTextChange(evt) {
this.setState({textValue: evt.target.value});
},
handleSubmit (event) {
event.preventDefault()
const formattedSearchString = this.state.textValue.replace(/[^a-z]/gi, "").toLowerCase()
this.refs.searchString.value = ''
this.props.submitSearch(formattedSearchString)
},
render() {
return (
<form className="form form-group has-info col-md-4 text-align-center" onSubmit={this.handleSubmit}>
<input className="search-input form-control" type="text" value={this.state.textValue} onChange={this.onTextChange} placeholder=" . . . enter pokemon name" />
<button className="btn btn-info btn-raised" type="submit" name="button">Search!</button>
</form>
)
}
})
答案 1 :(得分:0)
如果您使用 event.target.value
,则必须使用 useState
跟踪表单输入的状态。每次状态改变时,这意味着每次击键后,它都会重新渲染应用程序,这是非常昂贵的操作。
使用 useRef
将保留状态而不重新渲染。