ReactJS - 如何让 onFocus 和 onBlur 工作
ReactJS - How to get onFocus and onBlur to work
按我的理解,onFocus
应该在输入框被点进去的时候调用,onBlur
应该在其他东西成为焦点的时候调用。
我的意图:我想调用一个函数,当点击激活时,它会.concat
focuse输入框的消息字符串,但我无法让 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
在我 click/unclick 之前渲染组件时被调用?
- 如何让
onFocus
和 onBlur
工作,是否有另一种方法可以将焦点放在激活的输入框上?
你正在执行这里的方法
<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)
改变
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.bind(this)} onBlur={this._onBlur.bind(this)} />
如果你想在函数中使用 THIS 就应该这样
- 它被调用是因为你 运行 渲染方法中的函数,你应该传递函数,而不是它们 return。
改变这个:
onFocus={this._onFocus()}
onBlur={this._onBlur()}
对此:
onFocus={this._onFocus}
onBlur={this._onBlur}
2.You 不能这样声明组件的状态。它必须在构造函数中完成。此外,如果您想引用 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
应该在输入框被点进去的时候调用,onBlur
应该在其他东西成为焦点的时候调用。
我的意图:我想调用一个函数,当点击激活时,它会.concat
focuse输入框的消息字符串,但我无法让 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
在我 click/unclick 之前渲染组件时被调用? - 如何让
onFocus
和onBlur
工作,是否有另一种方法可以将焦点放在激活的输入框上?
你正在执行这里的方法
<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)
改变
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.bind(this)} onBlur={this._onBlur.bind(this)} />
如果你想在函数中使用 THIS 就应该这样
- 它被调用是因为你 运行 渲染方法中的函数,你应该传递函数,而不是它们 return。
改变这个:
onFocus={this._onFocus()}
onBlur={this._onBlur()}
对此:
onFocus={this._onFocus}
onBlur={this._onBlur}
2.You 不能这样声明组件的状态。它必须在构造函数中完成。此外,如果您想引用 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