Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不更改表单的值_Javascript_Reactjs_Mobx React Form - Fatal编程技术网

Javascript 不更改表单的值

Javascript 不更改表单的值,javascript,reactjs,mobx-react-form,Javascript,Reactjs,Mobx React Form,我有一个动态生成表单字段的表单。现在的问题是,并没有动态生成的字段正在获取输入,而那个些动态生成的字段并没有在字段中获取输入name='name'和name='age'字段未获得输入,无法在其中插入数据。前两个字段“所有者”和“描述”工作正常 import React from "react"; class Form extends React.Component { state = { cats: [{ name: "", age: "" }], owner: "",

我有一个动态生成表单字段的表单。现在的问题是,并没有动态生成的字段正在获取输入,而那个些动态生成的字段并没有在字段中获取输入
name='name'
name='age'
字段未获得输入,无法在其中插入数据。前两个字段“所有者”和“描述”工作正常

import React from "react";
class Form extends React.Component {

  state = {
    cats: [{ name: "", age: "" }],
    owner: "",
    description: ""
  };
  handleChange = e => {
    alert('inot');
    if (["name", "age"].includes(e.target.className)) {
      let cats = [...this.state.cats];
      cats[e.target.dataset.id][
        e.target.className
      ] = e.target.value.toUpperCase();
      this.setState({ cats }, () => console.log(this.state.cats));
    } else {
      this.setState({ [e.target.name]: e.target.value.toUpperCase() });
    }
  };
  addCat = e => {
    this.setState(prevState => ({
      cats: [...prevState.cats, { name: "", age: "" }]
    }));
  };
  handleSubmit = e => {
    e.preventDefault();
  };
  handleClick = e => document.getElementById(e.target.id).remove();

  // changeOption =(e) => {
  //   this.setState.cats(e.target.value);
  // }


  render() {
    let { owner, description, cats } = this.state;
    return (
      <form onSubmit={this.handleSubmit} onChange={this.handleChange}>
        <div className='row mt-5'>
          <div className='col-md-12 mb-5'>
            <h3 className='text-center text-primary'>Create Products Option</h3>
          </div>
          <div className='col-md-3'></div>
          <div className='col-md-3'>
            <label htmlFor='name'>
              <b>Owner</b>
            </label>
            <input
              type='text'
              className='form-control'
              name='owner'
              id='owner'
              value={owner}
            />
          </div>
          <div className='col-md-3'>
            <label htmlFor='description'>
              <b>Description</b>
            </label>
            <input
              type='text'
              className='form-control'
              name='description'
              id='description'
              value={description}
            />
            <button
              className='btn btn-success rounded-0 w-25 float-right mt-2 shadow-none'
              onClick={this.addCat}
            >
              +
            </button>
          </div>
          <div className='col-md-3'></div>
        </div>

        {cats.map((val, idx) => {
          let catId = `cat-${idx}`,
            ageId = `age-${idx}`;
          return (
            <form onSubmit={this.handleSubmit} onChange={this.handleChange}>
            <div id={ageId} key={idx}>
              <div className='row mt-5'>
                <div className='col-md-3'></div>
                <div className='col-md-3'>
                  <label htmlFor={catId}>
                    <b>{`Cat #${idx + 1}`}</b>
                  </label>
                  <input
                    type='text'
                    name='name'
                    data-id={idx}
                    id={catId}
                    value={cats[idx].name}
                    className='name form-control'
                  />


                </div>
                <div className='col-md-3'>
                  <label htmlFor={ageId}>
                    <b>Age</b>
                  </label>
                  <input
                    type='text'
                    name='age'
                    data-id={idx}
                    id={ageId}
                    value={cats[idx].age}
                    className='age form-control'
                  />
                  <button
                    className='btn btn-success rounded-0 w-25 float-right mt-2 shadow-none'
                    onClick={this.addCat}
                  >
                    +
                  </button>
                  <input
                    type='button'
                    name={ageId}
                    data-id={idx}
                    id={ageId}
                    value={"-"}
                    className='age float-right mt-2 mr-3 btn btn-danger w-25 rounded-0 w-25 shadow-none'
                    onClick={this.handleClick}
                  />

                </div>
                <div className='col-md-3'></div>
              </div>

            </div>
            </form>
          );
        })}
        <div className='row mt-3'>
          <div className='col-md-3'></div>
          <div className='col-md-3'>
            <label htmlFor='name'>
              <b>Min Selection</b>
            </label>
            <input
              type='text'
              className='form-control'
              name='min'
              id='min'
              value={""}
            />
          </div>
          <div className='col-md-3'>
            <label htmlFor='description'>
              <b>Max Selection</b>
            </label>
            <input
              type='text'
              className='form-control'
              name='max'
              id='max'
              value={""}
            />
            <input
              className='float-right btn btn-success mt-3'
              type='submit'
              value='Submit'
            />
            {/* <button className="float-right" onClick={this.addCat}>Add new cat</button> */}
          </div>
          <div className='col-md-3'></div>
        </div>
      </form>
    );
  }
}
export default Form;
从“React”导入React;
类形式扩展了React.Component{
状态={
猫:[{姓名:,年龄:}],
所有者:“,
说明:“”
};
handleChange=e=>{
警报(“inot”);
if([“名称”,“年龄”]。包括(例如target.className)){
让cats=[…this.state.cats];
cats[e.target.dataset.id][
e、 target.className
]=e.target.value.toUpperCase();
this.setState({cats},()=>console.log(this.state.cats));
}否则{
this.setState({[e.target.name]:e.target.value.toUpperCase()});
}
};
addCat=e=>{
this.setState(prevState=>({
猫:[…prevState.cats,{姓名:,年龄:}]
}));
};
handleSubmit=e=>{
e、 预防默认值();
};
handleClick=e=>document.getElementById(e.target.id).remove();
//changeOption=(e)=>{
//此.setState.cats(即目标值);
// }
render(){
让{owner,description,cats}=this.state;
返回(
创建产品选项
所有者
描述
+
{cats.map((val,idx)=>{
设catId=`cat-${idx}`,
ageId=`age-${idx}`;
返回(
{`Cat#${idx+1}`}
年龄
+
);
})}
最小选择
最大选择
{/*添加新的cat*/}
);
}
}
导出默认表单;
。看起来您应该在控制台中看到一些错误,这些错误可能会提供一些解释:

Warning: Failed prop type: You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.

详细答案 。这里有几件事不对:

您的
handleChange
功能需要更改 您的函数正在查看
className
,这将不起作用。例如,您的输入返回
表单控件名称。而是尝试使用元素的
名称

更新功能:

handleChange=e=>{
如果([“姓名”、“年龄”]。包括(例如,target.name)){
让cats=[…this.state.cats];
cats[e.target.dataset.id][e.target.name]=e.target.value.toUpperCase();
this.setState({cats},()=>console.log(this.state.cats));
}否则{
this.setState({[e.target.name]:e.target.value.toUpperCase()});
}
};

在一边 不要在其他
元素中呈现
元素。
不要这样做。这里不需要其他表格。把它拿走

// Line 76-80:
        {cats.map((val, idx) => {
          let catId = `cat-${idx}`,
            ageId = `age-${idx}`;
          return (
            <form onSubmit={this.handleSubmit} onChange={this.handleChange}>
// ...

//第76-80行:
{cats.map((val,idx)=>{
设catId=`cat-${idx}`,
ageId=`age-${idx}`;
返回(
// ...

我应该在onChange中写些什么?你能举个例子吗?@gamer我已经用一个详细的答案以及一个工作代码的链接更新了我的答案。谢谢你的回复@Martin。实际上,我必须为每个表单提交1个类别的数据。因此,如果用户生成10个表单,他将提交10个类别。为此,我需要生成new表单。不能有嵌套表单::“内容模型:流内容,但没有表单元素子体。”不管怎样,这不是问题的重点。你的问题是关于控制表单字段的,所以我编辑了我的答案accordingly@gamer我现在编辑了我的答案,以便更具体地回答您的问题。如果您发现此解决方案有效(专门用于控制表单输入),请随意将答案标记为正确。