【问题标题】:Pass form input values to another component React将表单输入值传递给另一个组件 React
【发布时间】:2019-01-14 14:04:59
【问题描述】:

目前在 React 中练习 state 和 props,我有一个相当大的组件,我试图将其拆分为几个较小的组件,但是我不确定如何将数据从一个组件传递到另一个组件。

该组件当前包含一个具有多个输入的表单,并在提交时呈现它们。据我了解,最好的方法是将表单放在它自己的组件中,然后使用道具传递父组件的状态。但是如何通过多个输入来完成,并确保 handleChange 和 handleSubmit 方法有效。

作为 React 的新手,我仍然对如何在一个组件中定义并在另一个组件中调用像 onChange 这样的方法感到困惑。

这是我到目前为止所得到的(一个重要的组成部分......):

export default class App extends Component {
    constructor(props){
      super(props);
      this.state = {
        post: {
          name: "",
          description: "",
          level: "Junior",
          salary: 30000
        },
        jobs: []
      };
    }

  handleChange = e => {
    const { name, value } = e.target;

    this.setState(prevState => ({
      post: { ...prevState.post, [name]: value }
    }));
  };

  handleSubmit = e => {
    e.preventDefault();

    this.setState(prevState => ({
      jobs: [...prevState.jobs, prevState.post],
      post: { name: "", description: "", level: "", salary: 30000 }
    }));
  };

  render() {
    return (
      <div className="App">
        <nav>
          <button className="btn btn-primary">Post it!</button>
        </nav>


         * This is the section i've been trying to put in a separate component... *


        <div className="form-container">
          <form>
            <div className="form-group">
              <input
                className="col-12 form-control"
                name="name"
                onChange={this.handleChange}
                type="text"
                value={this.state.post.name}
                placeholder="post name"
              />
            </div>
            <div className="form-group">
              <textarea
                className="col-12 form-control"
                name="description"
                onChange={this.handleChange}
                type="text"
                value={this.state.post.description}
                placeholder="post description"
              ></textarea>
            </div>
            <div className="form-group">
              <input
                className="col-12 form-control"
                name="salary"
                onChange={this.handleChange}
                type="number"
                value={this.state.post.salary}
                placeholder="post salary"
              />
            </div>
            <div className="form-group">
              <select
                className="form-control"
                onChange={this.handleChange}
                name="level"
                value={this.state.post.level}>
                  <option>Junior</option>
                  <option>Mid</option>
                  <option>Senior</option>
                  <option>Any</option>
              </select>
             </div>
            <button className="btn btn-primary" onClick={this.handleSubmit}>Submit</button>
          </form>
        </div>



        <div className="post-container">
          <ul>
            {this.state.jobs.map((job, index) => (
              <li key={index}>
                <ul className="post-tile">
                  <li className="post-tile-name">{job.name}</li>
                  <li className="post-tile-level">{job.level}</li>
                  <li className="post-tile-description">{job.description}</li>
                  <li className="post-tile-salary">£{job.salary}</li>
                </ul>
              </li>
            ))}
          </ul>
        </div>
      </div>
    );
  }
}

我试过移动它并使用 as:

<Form
   onChange={this.handleChange}
   name={this.state.post.name}
   description={this.state.post.description}
   level={this.state.post.level}
/>

但不确定如何将它们连接起来...任何指导将不胜感激!

【问题讨论】:

  • 如果您想创建一个单独的Form 组件,最好将所有表单特定状态放在Form 组件中,然后将一个函数作为道具传递,例如onSubmit 提交表单时要运行。
  • 您可以查看使用Form.js 组件的codesandbox example

标签: javascript reactjs forms


【解决方案1】:

这是正确的处理方式。

post 数据作为 1 个 propForm 组件发送并处理来自主组件的 handleChangehandleSubmit 事件。

检查这个使用Form.js 组件的codesandbox example

<Form handleChange={this.handleChange} post={this.state.post} handleSubmit={this.handleSubmit} />

Form.js 组件看起来像:

    import React from "react";

    export default ({ handleChange, handleSubmit, post }) => {
      return (
        <div className="form-container">
          <form>
            <div className="form-group">
              <input
                className="col-12 form-control"
                name="name"
                onChange={handleChange}
                type="text"
                value={post.name}
                placeholder="post name"
              />
            </div>
            <div className="form-group">
              <textarea
                className="col-12 form-control"
                name="description"
                onChange={handleChange}
                type="text"
                value={post.description}
                placeholder="post description"
              />
            </div>
            <div className="form-group">
              <input
                className="col-12 form-control"
                name="salary"
                onChange={handleChange}
                type="number"
                value={post.salary}
                placeholder="post salary"
              />
            </div>
            <div className="form-group">
              <select
                className="form-control"
                onChange={handleChange}
                name="level"
                value={post.level}
              >
                <option>Junior</option>
                <option>Mid</option>
                <option>Senior</option>
                <option>Any</option>
              </select>
            </div>
            <button className="btn btn-primary" onClick={handleSubmit}>
              Submit
            </button>
          </form>
        </div>
      );
    };

【讨论】:

  • 我们应该在表单标签上使用 onSubmit-{handleSubmit} 而不是提交按钮上的 onClick={handleSubmit} 处理程序,以便输入也可以作为表单提交
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 2014-10-31
  • 2021-12-31
  • 2021-03-01
相关资源
最近更新 更多