【问题标题】:ReactJS form submit preventdefault not workingReactJS表单提交防止默认不起作用
【发布时间】:2021-10-29 02:06:38
【问题描述】:

我正在学习 React JS,同时遵循在线教程。下面的代码停止工作并给我一个异常“TypeError:无法读取未定义的属性'PreventDefault'”。有人可以帮我理解造成这种情况的原因吗?提前致谢。

const Card = (props)=>{
  return(
        <div style={{margin:'1em'}}>
          <img width ="75" src ={props.avatar_url}/>
          <div style={{display: 'inline-block', marginLeft: 10}}>
             <div style ={{fontSize:'1.25em', fontWeight: 'bold'}}>
               {props.name}
             </div>
             <div>{props.company}</div>
          </div>
        </div>
       );
};

const CardList = (props) => {
    return (
            <div>
                {props.cards.map(card => <Card {...card} />)}
             </div>
           );
       }

class Form extends React.Component {

  handleSubmit = (e) => {
        e.PreventDefault();
        console.log('Event: Form Submit');
  };

  render() {
        return (
        <form onSubmit={this.handleSubmit()}>
        <input type ="text" placeholder ="Github username"/>
        <button type ="submit">Add Card</button>
      </form>
    );
  }
}

class App extends React.Component {

state = {
    cards:  [
        {       name : "Paul O’Shannessy" , avatar_url: "https://avatars1.githubusercontent.com/u/8445?v=4", company: "Facebook"  },
        {       name : "Ben Alpert" , avatar_url: "https://avatars1.githubusercontent.com/u/6820?v=4",company: "Facebook"  },
      ]
}

  render() {
        return(
            <div>
              <Form />
              <CardList cards={this.state.cards} />
            </div>
        );
  }
}

ReactDOM.render(<App />,mountNode)

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    这里有两个小问题。第一个,不是PreventDefault,是preventDefault。那么这里:

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

    您不是在使用回调函数,而是在调用真正的函数。如果不使用回调,则无法获取e。此外,如果您像上面那样使用它,它会在第一次渲染时触发,但不会在提交时再次触发。

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

    但是,您不需要也不应该像这样使用它。如果你这样使用它,回调函数将在每次渲染中重新创建。只需使用函数的引用。你也可以通过这个获得e

    <form onSubmit={this.handleSubmit}>
    

    最后一件事,为您的Card 的地图使用key

    {props.cards.map( card => <Card key={card.name} {...card} /> )}
    

    哦,也许最后一件事 :) 如果您目前不使用它,请使用 linter。

    【讨论】:

    • {(e) =&gt; handleSubmit(e)} 也为我解决了这个问题。
    • {handleSubmit} 应该做同样的事情。
    【解决方案2】:

    您只需将函数对象附加到 onSubmit 道具,不需要onSubmit={this.handleSubmit()} 那样调用它。应该是onSubmit={this.handleSubmit}

    另外,它被称为preventDefault,而不是PreventDefault

    const Card = (props) => {
      return (
        <div style={{ margin: '1em' }}>
          <img width="75" src={props.avatar_url} />
          <div style={{ display: 'inline-block', marginLeft: 10 }}>
            <div style={{ fontSize: '1.25em', fontWeight: 'bold' }}>
              {props.name}
            </div>
            <div>{props.company}</div>
          </div>
        </div>
      );
    };
    
    const CardList = (props) => {
      return (
        <div>
          {props.cards.map(card => <Card {...card} />)}
        </div>
      );
    }
    
    class Form extends React.Component {
    
      handleSubmit = (e) => {
        e.preventDefault();
        console.log('Event: Form Submit');
      };
    
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <input type="text" placeholder="Github username" />
            <button type="submit">Add Card</button>
          </form>
        );
      }
    }
    
    class App extends React.Component {
    
      state = {
        cards: [
          { name: "Paul O’Shannessy", avatar_url: "https://avatars1.githubusercontent.com/u/8445?v=4", company: "Facebook" },
          { name: "Ben Alpert", avatar_url: "https://avatars1.githubusercontent.com/u/6820?v=4", company: "Facebook" },
        ]
      }
    
      render() {
        return (
          <div>
            <Form />
            <CardList cards={this.state.cards} />
          </div>
        );
      }
    }
    
    const rootElement = document.getElementById("root");
    ReactDOM.render(<App />, rootElement);
    <script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
    
    <div id='root'></div>

    【讨论】:

      【解决方案3】:

      你试过这样简单吗:

       <form onSubmit={e => {e.preventDefault();}} >
      

      希望对你有帮助

      【讨论】:

      • e.preventDefault()} > 会更简单:)
      • 这种表示法有效,当我使用&lt;form onSubmit={e =&gt; this.handleSubmit}&gt; 时,它不起作用。甚至&lt;form onSubmit={this.handleSubmit}&gt; 并在函数中调用e.preventDefault()。什么鬼?
      【解决方案4】:

      在我的例子中,我的 form 组件在另一个组件中(我没有注意到这一点,因为父表单也在父组件中)。所以,当按下提交按钮时,它会影响到父级。

      总之,只需在父级上添加e.preventDefault(),或删除表单父级。

      【讨论】: