【问题标题】:KeyPress to detect 'Enter' blocks any data entry on an Input text fieldKeyPress 检测“Enter”会阻止输入文本字段上的任何数据输入
【发布时间】:2017-08-09 19:43:02
【问题描述】:

React 初学者,我遇到了一个问题。我有一个个人资料页面,用户可以在其中更改每个字段(名字、电子邮件等),一旦按下“Enter”,它就会保存该特定字段(redux/axios/promise)。

我遇到的问题是,当我使用 onKeyPress/Down/Up 作为事件触发器时,它会阻止任何数据输入。意思是,我不能在该字段中输入任何内容,就好像它是只读的或被阻止的一样。如果我使用 onChange,它可以工作。

class Account extends Component {

    constructor( props ) {
        super(props);

        this.handleChange = this.handleChange.bind(this);
    }

    handleChange(e) {

        if( e.key == 'Enter' ) { // this is detected (i console.logged it)

            e.preventDefault(); // also tried without these
            e.stopPropagation(); // also tried without these

            // this is triggered but the text field doesn't change so it updates nothing
            this.props.setUserKvPair( e.target.name, e.target.value );
        }
    }

    render() {

        return (
            <div className="app-account row">

                <div className="component-container col-12">
                    <div className="inner">

                        <p className="form-group">
                            <label className="form-text text-muted">Email Address</label>
                            <input 
                                type="text" 
                                name="email"
                                className="form-control" 
                                value={this.props.user.email} 
                                onKeyDown={this.handleChange} />
                        </p>
                        <p className="form-group">
                            <label className="form-text text-muted">First Name</label>
                            <input 
                                type="text" 
                                name="first_name"
                                className="form-control" 
                                value={this.props.user.first_name} 
                                onKeyPress={this.handleChange} />
                        </p>
                    </div>
                </div>

            </div>
        );
    }

}

const mapStateToProps = ( state ) => {
    return {
        user: state.user.data,
        properties: state.properties.data,
    }
}

function mapDispatchToProps(dispatch) {
  return bindActionCreators(userActions, dispatch);
}


export default connect( mapStateToProps, mapDispatchToProps )(Account);

基本上,一切正常,只是文本输入的值不会改变,除非我使用 onChange。

如何消除该字段上的阻塞/只读?

【问题讨论】:

  • 也许您可以使用表单来执行此操作,然后挂钩onSubmit 事件并调用event.preventDefault() 方法。然后您将免费获得按回车功能。此外,我通常建议使用受控组件进行输入。我将很快发布一个示例 sn-p 代码以符合我的建议。

标签: javascript reactjs redux


【解决方案1】:

我建议为此使用一个表单,因为它授予免费的onEnter 功能,而无需连接一堆不同的事件处理程序。另外,我建议使用Controlled Components,它确实使用了onChange 处理程序,但缓存了组件状态中的所有输入值。这使得使用数据变得非常容易。

查看下面的示例代码

import React, { Component } from "react";

class SomeComponent extends Component {
    constructor() {
        super();

        this.state = {
            text_1: "",
            text_2: ""
        };

        this.submitHandler = this.submitHandler.bind(this);
    }

    submitHandler(e) {
        e.preventDefault();

        const { text_1, text_2 } = this.state;

        console.log(text_1, text_2);
    }

    render() {
        return (
            // Using a form gives free on 'Enter' functionality
            <form onSubmit={this.submitHandler}>
                {/* Controlled Component 1 */}
                <input
                    type="text"
                    value={this.state.text_1}
                    onChange={e => this.setState({ text_1: e.target.value })}
                />

                {/* Controlled Component 2 */}
                <input
                    type="text"
                    value={this.state.text_2}
                    onChange={e => this.setState({ text_2: e.target.value })}
                />
            </form>
        );
    }
}

【讨论】:

  • 换句话说,不可能让用户输入一些文本,检查onKeyPress是否输入,如果是,允许处理函数仅触发该字段的保存?跨度>
  • 这是可能的,但我强烈建议使用controlled components 这样做。正如另一篇文章提到的,没有onChange,你不能使用value={this.props.user.email}
  • 我可以用 onChange 捕捉最后按下的键吗?如果是这样,我可以做一个 if 语句并忽略除 Enter 之外的所有键?
  • 我不确定。同样,我建议利用表单提供的内置浏览器支持。
  • 你最终采用了什么方法?
【解决方案2】:

如何在输入中使用value 而没有onChange

value={this.props.user.email} 没有onChange 这意味着您的输入是只读的

https://jsfiddle.net/69z2wepo/84207/

【讨论】:

  • 这个值 {this.props.user.email} 是现有状态(从 DB/API 获取),通过输入它,用户可以更改并输入 enter 以保存该字段。不确定这里的只读内容是什么?我必须怀念一些微妙之处。
  • 如果您想使用带有输入初始值的回车键,您需要同时使用 onChange 和 onKeyPress,请检查小提琴,我已附上。
猜你喜欢
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多