React高阶组件会强制重新渲染已包裹的组件
我正在努力了解如何在更高阶的组件中正确实现此验证行为。
==========================================
编辑:TLDR:感谢用户@ noa-dev的出色建议,我在这里创建了一个React
Fiddle:https://jsfiddle.net/8nLumb74/1/
以显示问题。
简而言之:当此HOC包装后,为什么我的文本框会失去对编辑的关注?
我究竟做错了什么?
文本框组件:
import React from 'react'export default React.createClass({
changeText(e) {
if (this.props.validate)
this.props.validate(e.target.value)
this.props.update(e.target.value)
},
componentDidMount() {
console.log('should only be fired once')
},
render() {
return (<input type="text"
value={this.props.text}
onChange={this.changeText} />)
}
})
验证器组件:
import React from 'react'export default function (WrappedComponent) {
const Validation = React.createClass({
validate(text) {
console.log('validating', text)
},
render() {
return (
<WrappedComponent
{...this.props}
validate={this.validate}
/>
)
}
})
return Validation
}
父表单组件:
import React from 'react'import TextBox from './text-box'
import Validator from './validator'
export default React.createClass({
getInitialState() {
return ({text: 'oh hai'})
},
update(text) {
this.setState({text})
},
render() {
const ValidatingTextBox = Validator(TextBox)
return (<ValidatingTextBox
text={this.state.text}
update={this.update} />)
}
})
回答:
在组件的render
方法中Form
,您ValidatingTextBox
每次都会创建一个新的:
render() { const ValidatingTextBox = Validator(TextBox)
return (<ValidatingTextBox
text={this.state.text}
update={this.update} />)
}
相反,您应该制造组件然后使用它,以便维护实例。可能的Form
组件如下所示:
import React from 'react'import TextBox from './text-box'
import Validator from './validator'
const ValidatingTextBox = Validator(TextBox)
export default React.createClass({
getInitialState() {
return ({text: 'oh hai'})
},
update(text) {
this.setState({text})
},
render() {
return (<ValidatingTextBox
text={this.state.text}
update={this.update} />)
}
})
以上是 React高阶组件会强制重新渲染已包裹的组件 的全部内容, 来源链接: utcz.com/qa/405549.html