【问题标题】:Controlled React form reloads instead of submitting after manually submitting from keyDown event从 keyDown 事件手动提交后,受控的 React 表单重新加载而不是提交
【发布时间】:2017-12-14 09:29:00
【问题描述】:

我有一个受控形式。如果您在文本区域中输入并单击提交按钮,它就可以工作。但是,当您在键入时按 Enter 时,我也尝试提交表单。以下不是提交表单,而是重新加载页面。

import React from 'react';

class PostComment extends React.Component {
    constructor(props) {
        super(props);
        this.state = { value: '' };
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
        this.keyDown = this.keyDown.bind(this);
    }

    handleChange(e) {
        e.preventDefault();
        this.setState({ value: e.target.value });
    }

    keyDown(e) {
        if (e.keyCode == 13 && e.shiftKey == false) {
            e.preventDefault();
            this.myFormRef.submit();
        }
    }

    handleSubmit(e) {
        e.preventDefault();
        const text = e.target.body.value;
        // Call backend here
        e.target.body.value = '';
    }

    render() {
        return (
            <form onSubmit={this.handleSubmit} ref={el => (this.myFormRef = el)}>
                <textarea
                    rows="3"
                    name="body"
                    onKeyDown={this.keyDown}
                    value={this.state.value}
                    onChange={this.handleChange}
                />
                <button className="btn" type="submit">
                    Comment
                </button>
            </form>
        );
    }
}

export default PostComment;

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    我的第一个猜测是*.submit() 不会触发onSubmit 事件,另请参阅类似的问题here,它建议直接调用onsubmit 处理程序(在这种情况下,这意味着例如调用@987654325 @带有“假”事件有效负载)...解决此问题的另一种方法是触发提交按钮单击,而不是在输入时触发表单提交:

     keyDown () {
       if (e.keyCode == 13 && e.shiftKey == false) {
         e.preventDefault();
         this.button.click();
       }
     }
    
     render() {
       return (
         <form onSubmit={this.handleSubmit}>
          <textarea
            rows="3"
            name="body"
            onKeyDown={this.keyDown}
            value={this.state.value}
            onChange={this.handleChange}
          />
          <button className="btn" type="submit" ref={el => (this.button = el)}>
            Comment
          </button>
        </form>
      );
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多