javascript - 事件不跨 react 组件传播

标签 javascript reactjs

我有以下 react 组件:

class Button extends React.Component {
  constructor(props){
    super(props);
    this.state = { disabled: false };
  }

  render() {
    return <button disabled={this.state.disabled} onClick={this.clicked.bind(this)}>Save</button>;
  }

  clicked(event) {
    this.setState({disabled: true});
  }
}

class Form extends React.Component {
  contructor(props) {
    super(props);
    this.state = { foo: "bar" };
  }

  render() {
    return (
      <form onSubmit={this.submit.bind(this)}>
        <input valueDefault={this.state.foo} />
        <Button />
      </form>
    );
  }

  submit(event) {
    event.preventDefault();
    // do some stuff
  }
}

但是,当单击按钮时,会触发 clicked 方法,但不会触发 Submit 方法。有什么方法可以让事件传播吗?是否有某种原因导致该事件不像正常的 html 表单事件那样传播?

最佳答案

由于 setState 将重新渲染整个组件,因此事件将在那里停止,并且无法继续,直到祖先表单为止。相反,您可以在表单的 onSubmit 中处理按钮禁用。像这样的事情

 class Button extends React.Component {
    constructor(props){
      super(props);
      this.state = { disabled: false };
    }

    render() {
      return <button disabled={this.state.disabled}>Save</button>;
    }

    clicked(event) {
      this.setState({disabled: true});
    }
  }

  class Form extends React.Component {
    constructor(props) {
      super(props);
      this.state = { foo: "bar" };
    }

    render() {
      return (
        <form onSubmit={this.submit.bind(this)}>
          <input valueDefault={this.state.foo} />
          <Button ref="button" onSubmit={this.submit.bind(this)}/> <----- Added reference here
        </form>
      );
    }

    submit(event) {
      event.preventDefault();
      var button = this.refs.button; // <---- Added ref to button
      button.setState({disabled:  true}); <---- set disabled state to button
    }
  }

这是一个演示 http://jsbin.com/ginune/edit?html,output

关于javascript - 事件不跨 react 组件传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30929905/

相关文章:

javascript - d3.js 中条形图的负高度值错误

javascript - 使用基本身份验证的 Google Apps 脚本中的 UrlFetchApp.fetch 出现意外错误

node.js - 查询 GraphQl 时的 GraphQl 和 Passport session : access req. 用户

javascript - 如何在组件内使用 React 自定义环境变量

javascript - React-hot-loader:React.createElement:类型无效——更新屏幕时预计会出现字符串错误

javascript - 使用事件对象调用 javascript 鼠标事件

javascript - Ionic 弹出窗口确认未执行 if 语句中的代码

java - 如何向 jar 文件发出 httprequest

javascript - onBlur 事件在加载应用程序 ReactJS 时自动运行

javascript - 如何使用 "forEach"函数传递对象数组?