私が理解しているように、入力ボックスがクリックされたときにonFocus
が呼び出され、他の何かがフォーカスされたときにonBlur
が呼び出されます。
私の意図:クリックによってアクティブ化されると、フォーカスされている入力ボックスのメッセージ文字列を.concat
する関数を呼び出したいのですが、onFocus
を取得できません。またはonBlur
が機能します。
私が周りを検索して見つけたものから、これはトリックを行うはずですが、そうではありません。
import React, { Component } from 'react'
class SocialPost extends Component {
state = {
message: this.props.socialPost.message,
focus: false
}
_onBlur() {
setTimeout(() => {
if (this.state.focus) {
this.setState({
focus: false,
});
}
}, 0);
}
_onFocus() {
if (!this.state.focus) {
this.setState({
focus: true,
});
}
}
render() {
return (
<div className='...'>
<div className='...'>
...
<input
onFocus={this._onFocus()}
onBlur={this._onBlur()}
type='text'
value={this.state.message}
onChange={...}/>
...
</div>
</div>
)
}
}
export default SocialPost
onFocus
とonBlur
が呼び出されるのはなぜですか?onFocus
とonBlur
を機能させるにはどうすればよいですか?アクティブ化された入力ボックスに焦点を合わせる別の方法はありますか?これを変える:
onFocus={this._onFocus()}
onBlur={this._onBlur()}
これに:
onFocus={this._onFocus}
onBlur={this._onBlur}
2.そのようにコンポーネントの状態を宣言することはできません。コンストラクターで実行する必要があります。また、SocialPostのthis
を参照する場合は、バインドする必要があります。 Imoを実行するのに最適な場所は、コンストラクターです。コード全体は次のようになります。
import React, { Component } from 'react'
class SocialPost extends Component {
constructor (props) {
super(props)
this.state = {
message: props.socialPost.message,
focus: false
}
this._onBlur = this._onBlur.bind(this)
this._onFocus = this._onFocus.bind(this)
}
_onBlur() {
setTimeout(() => {
if (this.state.focus) {
this.setState({
focus: false,
});
}
}, 0);
}
_onFocus() {
if (!this.state.focus) {
this.setState({
focus: true,
});
}
}
render() {
return (
<div className='...'>
<div className='...'>
...
<input
onFocus={this._onFocus}
onBlur={this._onBlur}
type='text'
value={this.state.message}
onChange={...}/>
...
</div>
</div>
)
}
}
export default SocialPost
変化する
onFocus={this._onFocus()}
onBlur={this._onBlur()}
に
onFocus={this._onFocus}
onBlur={this._onBlur}
または
onFocus={this._onFocus.bind(this)}
onBlur={this._onBlur.bind(this)}
ここでメソッドを実行しています
_<input
onFocus={this._onFocus()}
onBlur={this._onBlur()}
type='text'
value={this.state.message}
onChange={...}/>
_
括弧なしである必要があります。
_<input
onFocus={this._onFocus.bind(this)}
onBlur={this._onBlur.bind(this)}
type='text'
value={this.state.message}
onChange={...}/>
_
編集:
そして、.bind(this)
を追加します
<input onFocus={this._onFocus.bind(this)} onBlur={this._onBlur.bind(this)} />
関数でこれを使用したい場合は、このようにする必要があります