react - 在更改事件中检测“输入”按键

IT技术 javascript reactjs redux react-redux
2021-04-12 06:00:37

我有一个 React 组件,它或多或少是一个用户可以输入的简单文本区域。到目前为止,代码如下所示:

import React from 'react';
import {connect} from 'react-redux';

function handleChange(event) {
    const {setText} = this.props;

    //is there some way I can detect [ENTER] here and call this.props.add instead?
    setText(event.target.value);
}

class TextArea extends React.Component {
    constructor(props) {
        super(props);
    }

    render() {
        const {value} = this.props;

        return (
            <div className="list-item">
                <textarea
                    className="form-control"
                    value={value}
                    onChange={handleChange.bind(this)}
                />
            </div>
        );
    }
}

function mapStateToProps(state) {
    return {
        value: state.value
    }
}

function mapDispatchToProps(dispatch) {
    return {
        setText(text) {
            const action = {
                type: 'set-text',
                text: text
            };

            dispatch(action);
        },
        add() {
            const action = {
                type: 'add'
            };

            dispatch(action);
        }
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(TextArea)

该组件连接到 redux 存储,每次用户在文本区域中键入内容时都会更新该存储。redux 存储将新值发送回 textarea 组件,textarea 组件重新渲染以显示新值。

虽然到目前为止这是有效的,但我希望这个组件在按下 Enter 键时表现不同。由于更改事件不公开 keyCode(至少我不知道),我不知道如果按下 Enter 键而不是调用prop,如何使handleChange函数调用prop。addsetText

我尝试的一件事是将onKeyDown处理程序附加到 textarea,我可以用它来检测输入 keyCode (13),但这使我无法正确设置文本,因为如果我将附加到事件的 keyCode 转换为字符并将其附加到当前值后,我将无法确定它应该是大写还是小写。

我被困在这里了。我真的不认为有一种方法可以让我检测更改事件上的 Enter 键,并且 keyDown 事件没有办法让我处理所有可能的输入。有没有办法可以将两者结合起来?

提前致谢!

1个回答

您可以同时使用两个处理程序。

在 onKeyDown 中,您可以检查密钥。如果是 ENTER 按下呼叫event.preventDefault()以阻止onChange呼叫,或者如果不是 - 什么都不做

在调用change事件的默认处理程序之前,Javascript 事件队列不包含事件keydown如果你调用event.preventDefault()onKeyDown处理任何change事件将被解雇。

“排除event.preventDefault()key[Press|Up|Down]允许change事件被触发。” - 要注意的关键点!谢谢!
2021-06-15 06:00:37