【问题标题】:Input on Change in ReactJS?输入 ReactJS 的变化?
【发布时间】:2020-10-10 21:32:25
【问题描述】:

我正在学习 react 和 react 表单,并尝试创建一个动态且可扩展的表单。我已经设置了具有type 的状态,并根据类型显示相应的输入类型(因此它可以是文本、文本区域、单选、选择、日期或复选框)。我正在尝试编写一个函数,以便它将根据表单输入的type 动态设置 on 更改,但我一直试图实现相同的目标。

所以如果type === selectevent.target.valuetype === checkboxevent.target.checked 等等。

请检查此工作CodeSandbox

查看完整代码 sn-p:-

import React from "react";
import "./styles.css";

class App extends React.Component {
  state = {
    Forms: [
      { name: "select", type: "select", options: ["a", "b", "c"] },
      { name: "Radio", type: "radio", options: ["a", "b", "c"] },
      { name: "Date", type: "date", value: "2018-07-22" },
      { name: "Text Input", type: "text", value: "text input" },
      {
        name: "Checkbox",
        type: "checkbox",
        options: ["a", "b", "c"],
        value: false
      },
      { name: "Textarea", type: "textarea", value: "text area" }
    ]
  };

  handleFormStateChange = (event, idx) => {
    const target = event.target;
    const form = [...this.state.forms];
    form[idx].value = target.type === "select" ? target.value : "";
    form[idx].value = target.type === "radio" ? target.value : "";
    form[idx].value =
      target.type === "date" ||
      target.type === "text" ||
      target.type === "textarea"
        ? target.value
        : "";
    form[idx].value = target.type === "checkbox" ? target.checked : "";
    this.setState({
      form
    });
  };

  getField = field => {
    switch (field.type) {
      case "date":
      case "text":
      case "textarea":
        return <input type={field.type} value={field.value} />;
      case "select":
        return (
          <select name={field}>
            {field.options.map(option => (
              <option key={option} value={option}>
                {option}
              </option>
            ))}
            ;
          </select>
        );
      case "radio":
      case "checkbox":
        return (
          <div>
            {field.options.map(option => (
              <label>
                {option}:
                <input
                  key={option}
                  type={field.type}
                  name={option}
                  value={option}
                />
              </label>
            ))}
          </div>
        );
      default:
        return <div>Unknown form field</div>;
    }
  };

  renderForm = () => {
    return this.state.Forms.map((field, index) => (
      <label key={index}>
        {field.name}
        {this.getField(field)}
      </label>
    ));
  };

  render() {
    return <div>{this.renderForm()}</div>;
  }
}

export default App;

我仍在努力学习并花时间使用 ReactJS,因此我们将不胜感激。太感谢了。 :)

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

这应该可行。

handleFormStateChange = (event, idx) => {
    const target = event.target;
    const form = [...this.state.Forms];
    form[idx].value = "";
    form[idx].value =
      target.type === "select-one" ? target.value : form[idx].value;
    form[idx].value = target.type === "radio" ? target.value : form[idx].value;
    form[idx].value =
      target.type === "date" ||
      target.type === "text" ||
      target.type === "textarea"
        ? target.value
        : form[idx].value;
    if (target.type === "checkbox") {
      if(!form[idx].selectedValues) {
        form[idx].selectedValues = {};    
      }
      form[idx].selectedValues[target.value] = target.checked;
    }
    this.setState({
      form
    });
  };

getField = (field, index) => {
    switch (field.type) {
      case "date":
      case "text":
      case "textarea":
        return (
          <input
            type={field.type}
            value={field.value}
            onChange={event => {
              this.handleFormStateChange(event, index);
            }}
          />
        );
      case "select":
        return (
          <select
            name={field}
            value={field.value}
            onChange={event => {
              this.handleFormStateChange(event, index);
            }}
          >
            {field.options.map(option => (
              <option key={option} value={option}>
                {option}
              </option>
            ))}
            ;
          </select>
        );
      case "radio":
      case "checkbox":
        return (
          <div>
            {field.options.map(option => (
              <label key={field.type + "op" + option}>
                {option}:
                <input
                  onChange={event => {
                    this.handleFormStateChange(event, index);
                  }}
                  key={option}
                  type={field.type}
                  name={option}
                  value={option}
                />
              </label>
            ))}
          </div>
        );
      default:
        return <div>Unknown form field</div>;
    }
  };

  renderForm = () => {
    return this.state.Forms.map((field, index) => (
      <label key={index}>
        {field.name}
        {this.getField(field, index)}
      </label>
    ));
  };

首先,checkbox 类型可以选择多个值,因此我们需要为里面的每个选项设置一个状态。所以在你的表单对象上引入了selectedValues对象。

要注意的第二件事是,当定义 select 元素时,其 event.target.typeselect-one 而不是 select

我们需要注意的最后一件事是,在您的条件被伪造的情况下重用 form[idx].value 的原始值,而不是使用空字符串。对 else 部分使用空字符串会覆盖您之前设置的值。

【讨论】:

    【解决方案2】:
      const handleChange= (e)=> {
        let v = e.target.type === "checkbox" ? e.target.checked : e.target.value;
          setState(
             {
               ...state,
               [e.target.name]: v
             }
          );
      };
    

    只需检查它是否是复选框。另一种输入类型具有 value 属性,但 checkbox 具有 checked 属性。 不要忘记为您的输入设置 name 属性。

    【讨论】:

    猜你喜欢
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多