【问题标题】:How To Add Nested Object on form Submitting?如何在表单提交时添加嵌套对象?
【发布时间】:2020-02-28 06:03:03
【问题描述】:

https://codesandbox.io/s/reverent-engelbart-1zg2p

////// 这是我的 form.js 文件

    this.initialState = {id: "", title: "",items: [{id: "",name: "",price: ""}]};
    this.state = this.initialState;}
    handleChange = event => {const { name, value } = event.target;
    this.setState({[name]: value});
  };
  submitForm = () => {this.props.handleSubmit(this.state);};
  render() {
    const { id, title, items } = this.state;
    return (
        <form>
          <input
            type="number"
            name="id"
            placeholder="Category Id"
            value={id}
            onChange={this.handleChange}/> <br />
          <label>Category title</label>
          <br />
          <input
            type="text"
            name="title"
            placeholder="Category title"
            value={title}
            onChange={this.handleChange}/><br />

////// Category Value 可以更新,但是 Items 值没有更新

          <input
            type="number"
            name={items.id}
            placeholder="itemId"
            value={items.id}
            onChange={this.handleChange}/><br />
          <label>Item Name</label><br />
          <input
            type="text"
            name={items.name}
            placeholder="itemName"
            value={items.name}
            onChange={this.handleChange}/><br />
          <label>Item Price</label><br />
          <input
            type="number"
            name={items.price}
            placeholder="itemPrice"
            value={items.price}
            onChange={this.handleChange}/><br />
          <input type="button" value="submit" onClick={this.submitForm} />
        </form>
    ); } }

我在代码中遗漏了一些内容,但不知道哪里出了问题。有人请帮帮我..!!!

【问题讨论】:

标签: javascript arrays reactjs


【解决方案1】:

为此,您应该有类似这样的 handleChange 函数。

async onChange(e, index) {
    if (
      ["id", "name", "price"].includes(
        e.target.name
      )
    ) {
      let cats = [...this.state.items];

      cats[index][e.target.name] = e.target.value;
      await this.setState({
        cats
      });
    } else {
      await this.setState({ [e.target.name]: e.target.value });
    }
    console.log(this.props.vall);
  }

你可以映射你的表单输入值然后你可以声明你的值。我希望它会帮助你。

{this.state.items.map((inputField, index) => (
       <form key={`${inputField}~${index}`}>
          <input
            type="number"
            name={inputField.id}
            placeholder="itemId"
            value={items.id}
            onChange={e => {
                          this.onChange(e, index);
                        }}/><br />
          <label>Item Name</label><br />
          <input
            type="text"
            name={inputField.name}
            placeholder="itemName"
            value={items.name}
            onChange={e => {
                          this.onChange(e, index);
                        }}<br />
          <label>Item Price</label><br /> 
         and so on ......
       </form>
      ))}

【讨论】:

【解决方案2】:

对于单个表单渲染,您不需要将项目初始化为状态数组,总是最好像这样声明为对象:

this.state = {
      id: "",
      title: "",
      items: { id: "", name: "", price: "" }
};

现在,如果您想更新嵌套对象,请创建一个单独的处理程序来执行此操作

handleChangeItems = (event) => {
    const { name, value } = event.target;
    this.setState({
    items: { ...this.state.items, [name]: value }
});
}

希望这能解决您的问题。如果您需要与您提到的相同的状态,请告诉我。

【讨论】:

  • 是的,你是对的,但是如果我分开并创建另一个句柄更改函数,那么我的表单应该分成两部分..我不想破坏我的表单..如果你想看看我的结构是链接.. codesandbox.io/s/reverent-engelbart-1zg2p
  • 试试这个:codesandbox.io/s/stupefied-minsky-8my1s我已经修复了所有的东西,没有设计被破坏。
  • 好的,你已经尽力了,但还是有问题..编辑后它显示项目。点击提交时地图不是一个功能。
  • 我检查并发现在提交您的数据后作为对象传递并且 .map() 不适用于对象。这就是抛出错误的原因。您可以告诉我您想要达到的目标,以便我可以帮助您。
  • 兄弟我尝试将数据作为数组提交,但问题是它与初始状态分开并且仅显示从表单提交的数据...您能解决问题吗..
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2014-04-12
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多