ReactJS - 如何让onFocus和onBlur工作

时间:2017-10-23 19:09:28

标签: javascript reactjs onchange onblur

据我了解,单击输入框时应调用onFocus,当其他内容成为焦点时应调用onBlur

我的意图:我想调用一个函数,当点击激活时,它将.concat聚焦输入框的消息字符串,但我可以&#39 ;让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
  2. 如何让onFocusonBlur正常工作,还有另一种方法可以专注于激活的输入框吗?

4 个答案:

答案 0 :(得分:2)

更改

onFocus={this._onFocus()}
onBlur={this._onBlur()}

onFocus={this._onFocus}
onBlur={this._onBlur}

onFocus={this._onFocus.bind(this)}
onBlur={this._onBlur.bind(this)}

答案 1 :(得分:2)

  1. 调用它是因为你在render方法中运行函数,你应该传递函数,而不是它们返回的函数。
  2. 改变这个:

    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
    

答案 2 :(得分:1)

您正在执行此方法

<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)

答案 3 :(得分:1)

<input onFocus={this._onFocus.bind(this)} onBlur={this._onBlur.bind(this)} />

如果你想在函数

中使用THIS,它应该是怎样的