高次コンポーネントでこの検証動作を正しく実装する方法を理解するのは苦労しています。より高次のコンポーネントに反応してラップされたコンポーネントの再レンダリングを強制します。
=========================
編集:TLDR:user @ noa-devの優れた提案のおかげで、私はReact Fiddleをここに作成しました:https://jsfiddle.net/8nLumb74/1/問題を表示します。
簡単に言えば、このHOCでラップされたときにテキストボックスが編集に専念しないのはなぜですか?
私は間違っていますか?
TextBoxコンポーネント:
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
}
親フォームコンポーネント:Form
コンポーネントのrender
方法で
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} />)
}
})
:可能
Form
コンポーネントは次のようになります。または、再実装なしで同じコンポーネント内で検証を処理し、完成した文字列を上位コンポーネントに送信して格納します。 –間違いなく心から感謝していますが、現在のところ、アプリケーションは、グローバル状態(この例ではredux)を更新するために(この値の編集を完了する前であっても)テキストの変更を期待しているので、完了したら "... –
高次コンポーネントのセットアップで明らかに何かが分からないと思うのですが、Reactは値フィールドを更新するのではなく、入力DOMエレメント全体を分解する必要があると思うのですか? –