ReactJS - 如何让 onFocus 和 onBlur 工作

ReactJS - How to get onFocus and onBlur to work

按我的理解,onFocus应该在输入框被点进去的时候调用,onBlur应该在其他东西成为焦点的时候调用。

我的意图:我想调用一个函数,当点击激活时,它会.concatfocuse输入框的消息字符串,但我无法让 onFocusonBlur 工作。

根据我四处搜索的结果,这应该可以解决问题,但没有。

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
  1. 为什么 onFocusonBlur 在我 click/unclick 之前渲染组件时被调用?
  2. 如何让 onFocusonBlur 工作,是否有另一种方法可以将焦点放在激活的输入框上?

你正在执行这里的方法

<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 就应该这样

  1. 它被调用是因为你 运行 渲染方法中的函数,你应该传递函数,而不是它们 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