【问题标题】:ReactJS: Stop input from automatically being submittedReactJS:停止自动提交输入
【发布时间】:2018-07-29 11:17:59
【问题描述】:

从下拉日历中选择日期并设置自动提交值的时间后。但是,我想使用提交按钮来提交值。根据我的研究,我认为“event.preventDefault();”声明是为了防止这种事情发生。另外,值是否存储在 inputValue 中?如果是,我如何从日历类外部访问该值?

所以,再次明确地说,我想使用提交按钮提交值。

class Calendar extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                inputValue: '',

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


        handleChange(event) {
            this.state.inputValue = event.target.valueAsNumber;
            console.log('Form value: ' + this.state.inputValue);
            event.preventDefault();
        }

        handleSubmit(event) {

            this.state.inputValue = event.target.valueAsNumber;
            console.log('Form value: ' + this.state.inputValue);
            event.preventDefault();
        }

        render() {
            return (
                <div className="Calendar">
                    <form onSubmit="return handleSubmit();">
                        <label>Date/Time</label>
                        <input type="datetime-local" value={this.state.inputValue} onChange={this.handleChange()} />
                        <input type="submit" value="Submit" />
                    </form>
                </div>
                 //{this.render(){return (<UserList />)};
            );
        }
    };
    export default Calendar;

【问题讨论】:

  • 如果要访问类外的值,可以考虑将值移到父状态,让父将值传递给需要它的组件
  • @EdwinHarly 我对 ReactJS 很陌生(几天前开始),所以你能提供更多解释吗?另外,如果你能添加一个更好的例子。
  • 发布一个关于它的新问题,因为它是 OOT
  • 再想一想,关于状态管理和其他东西,我认为这是一个相当普遍的问题,所以我想搜索起来并不难
  • 什么是 OOT?

标签: reactjs


【解决方案1】:

这样做的原因是以下行导致handleSubmit() 在组件被渲染时立即执行:

<form onSubmit="return handleSubmit();">

换句话说,当您的组件呈现时,它在“绑定处理程序”到表单onSubmit 事件时调用handleSubmit()

如果您修改代码如下,这将阻止表单在实现所需的表单提交行为时自动提交/执行:

<form onSubmit={(event) => this.handleSubmit(event)}>

【讨论】:

  • 进行更改后,我收到以下错误:TypeError: Cannot read property 'target' of undefined 19 | 20 |处理变化(事件){> 21 | this.state.inputValue = event.target.valueAsNumber; 22 | console.log('表单值:' + this.state.inputValue); 23 | event.preventDefault(); 24 | }
  • 用它来修复上面的错误,stackoverflow.com/questions/46389220/… 但是在我重新加载表单并填写输入字段后,在点击“p”作为 PM 后会自动发送值。我整天都在进行故障排除和发现的所有内容 onSubmit={this.handleSubmit} 和 event.preventDefault();在 handleSubmit(event) 函数中应该可以工作,但事实并非如此。
  • 还是一样。还收到以下警告:警告:预期 onSubmit 侦听器是一个函数,而不是 string 类型的值。
  • 抱歉,通过电话回答,请参阅更正。 {..} 需要用来代替“..”
  • 进行了以下更改和相同的行为:
    this.handleSubmit(event)}>
【解决方案2】:

最后我发现了问题,表单是自动提交的,因为你给了 value 属性作为 state.inputValue,这不是必需的。 onChange 属性也不是必需的。请尝试以下代码

class Calender extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      inputValue: ""
    };
    this.handleSubmit = this.handleSubmit.bind(this);
  }
  handleSubmit(event) {
    event.preventDefault();
    this.setState({ inputValue: document.getElementById("time").value });
  }
  render() {
    console.log(this.state.inputValue);
    return (
      <div className="Calendar">
        <form onSubmit={this.handleSubmit}>
          <label>Date/Time</label>
          <input type="datetime-local" id="time" />
          <input type="submit" value="Submit" />
        </form>
      </div>
      //{this.render(){return (<UserList />)};
    );
  }
}

另外请注意,设置后可能无法立即获取状态值。工作示例为here

【讨论】:

  • @N6DYN 这是工作中的example
  • 对handleSubmit 和handleChange 都进行了更改,应用程序的行为仍然相同。
  • @N6DYN 是显示错误还是没有获得预期的功能
  • 我试过你的例子,它和我的一样。输入框填满后立即提交值。我只想在按下提交按钮后提交值。
  • @N6DYN 我又做了一些修改。请检查并更新
【解决方案3】:

我尝试使用您提供的代码创建一个测试应用,因此分析代码,我发现代码中有很多问题。

我已经编写了另一个版本的代码,删除了错误或错误。在 JSFiddle. 找到代码,我也在此处粘贴基本的代码(组件类)

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

    this.state = {
      inputValue: '',
    }

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


  handleChange(event) {
    this.setState({
        "inputValue":event.target.value
    });
  }

    handleSubmit(event) {
    console.log("Input Value:",this.state.inputValue)
  }

  render() {
    return (
      <div className="Calendar">
        <form onSubmit={this.handleSubmit}>
          <label>Date/Time</label>
          <input type="datetime-local" 
                 value={this.state.inputValue}   
                 onChange={this.handleChange} />
          <input type="submit" value="Submit" />
        </form>
      </div>
      //{this.render(){return (<UserList />)};
    );
  }
};
  1. 代码中存在的问题如下:- this.state.inputValue = event.target.valueAsNumber 设置 不允许直接状态,因此我将代码转换为 this.setState
  2. 输入类型datetime-local 期望值格式类似于 "1990-11-02T12:59" 所以将其替换为 event.target.value
  3. onChange="return handleChange()" 不是规定的调用方式 渲染内部组件类的函数,使用 () 和 函数名直接调用我们加载的页面上的函数 不想要,因此将代码替换为 onChange={this.handleChange}
  4. onSubmit="return handleSubmit();" 会调用handleSubmit 组件加载后立即运行,这不是 也规定了方式,因此将代码替换为 onSubmit={this.handleSubmit}
  5. handleSubmit函数中我们不需要再次设置状态为 每当输入的值使用更改时,它就已经更新了 handleChange 函数。因此,如果您愿意,可以在这里致电 父母的任何功能使用 this.props.parentFunc(this.state.inputValue) 并使用输入 更有价值。

如有任何进一步的疑问,请随时发表评论或发送电子邮件至 connect.ronit@mail.com

【讨论】:

  • 这行得通。并感谢您的解释;非常感谢。
  • 我也希望能够输入秒数。目前我只能输入 HH:mm。我需要为此再问一个问题吗?
  • 我对handleSubmit()handleSubmit(event) { // this.setState({ // inputValue: event.target.valueAsNumber // }); this.state.inputValue = event.target.valueAsNumber; console.log("Input Value:", event.target.valueAsNumber) event.preventDefault(); }做了如下修改,收到如下错误:输入值:未定义
  • @N6DYN 我猜您正试图通过使用 this.state.inputValue 将这些错误再次添加到代码中,这不是规定的,也是不允许的。感谢您的提问,也很高兴通过 Skype 为您提供帮助:- connect.ronit
  • 我正在尝试将输入转换为 Unix 时间(纪元)。
猜你喜欢
  • 1970-01-01
  • 2011-03-01
  • 2011-10-08
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多