如何使多个字段的动态状态反应?

时间:2018-11-17 08:42:47

标签: javascript reactjs jsx

class Bills extends Component {
constructor(props) {
    super(props)
    this.state = {
        productName: '',
        price: 0,
        quantity: 0,
        noOfProductsField: 0
    }
}
handleChange = name => event => {
    this.setState({
        [name]: event.target.value,
    });
};

createFields = () => {
        const { classes } = this.props;
        let children = []
        for (let i = 0; i < this.state.noOfProductsField; i++) {
            children.push(
                <div>
                    <Select
                        className={classes.textField}
                         value = { this.state[i] }
                    onChange={this.handleChange('productName')}
                        displayEmpty
                        SelectProps={{
                            MenuProps: {
                                className: classes.menu,
                            }
                        }}>
                        <MenuItem value="" disabled>
                            Select Product
                           </MenuItem>
                        {this.state.products.map((option, ind) => (
                            <MenuItem key={ind} value={option.productName}>
                                {option.productName}
                            </MenuItem>
                        ))}
                    </Select>
                    <TextField className={classes.textField} placeholder='Price' type='number' onChange={this.handleChange('price')} />
                    <TextField className={classes.textField} placeholder='Quantity' type='number' onChange={this.handleChange('quantity')} />
                </div>
            )
        }
        return children
    }
}

我有这个功能,可以在for循环中创建3个输入字段

  • productName
  • 价格
  • 数量

例如,如果循环运行2次,它将创建6个字段,如下图所示:

Click on this to see image

所以现在我想以不同方式管理所有6个字段的状态 我该怎么办?

4 个答案:

答案 0 :(得分:3)

您需要创建动态表单输入吗?因此,您可以做的是将产品名称传递给处理程序this.handleChange('productName'),然后可以执行以下操作。在您的情况下,您将需要使用计算所得的属性名称来动态设置状态(就像您已经在做的那样)

handleChange = name => event => {
    //more logic here as per the requirement
    this.setState({
        [name]: event.target.value,
    });
};

或者您可以为产品,价格,数量分别创建单独的onChange处理程序。

handleProductChange = (name) => (evt) => {
    const newProducts = this.state.products.map((product, pidx) => {
      if (name !== product.productName) return product;
      return { ...product, productName: evt.target.value };
    });

    this.setState({ products: newProducts });
}

快速流程:当产品发生变更时,您可以将产品存储在产品阵列中(处于状态),当价格发生变化时,您可以将产品名称与产品名称一起发送并映射产品价格和数量。

Here,您可以在React上找到一个不错的JS bin副本,完全相同。

答案 1 :(得分:2)

您可以向每个输入组件添加var findDuplicate = function(nums) { for(var i = 0; i < nums.length ; i++) for(var j = 0; j < nums.length ; j++) if(i != j && (nums[i] == nums[j])) return nums[j]; return -1; }; 属性,并创建一个处理程序方法,该方法将名称作为参数。

name

您可以在React docs上进一步了解how to handle multiple inputs

答案 2 :(得分:2)

您可以使用react js创建动态选择字段

**Code sample:**

const templates = [
    {'id': 1, 'value': 'JavaScript', 'name': 'JavaScript'}, 
    {'id': 2, 'value': 'React', 'name': 'React'},    
    {'id': 3, 'value': 'Angular', 'name': 'Angular'},
    {'id': 4, 'value': 'Node', 'name': 'Node'},
    {'id': 5, 'value': 'Vue', 'name': 'Vue'},
 ]

class Dynamic extends React.Component {
  state={
    selectedTemplates: ""
  }

 onChange = (e) => {
   console.log(e)
   // selected value store into state
    this.setState({ 
      selectedTemplates: e.target.value 
    });
  };

  render() {
    return (
      <div>
        <h2>Dynamic Select(Options):</h2>
        <select className="form-control"
            value={this.state.value}
            onChange={(e) => this.onChange(e.target.value)}
          >
          {
              templates.map(msgTemplate => {
                  return (
                      <option 
                        key={msgTemplate.id} 
                        name={msgTemplate.name} 
                        value={msgTemplate.text}
                       >
                          {msgTemplate.name}
                      </option>
                  )
              })
          }
       </select>
     </div>
    )
  }
}

React.render(<Dynamic />, document.getElementById('app'));

演示>> codepen

答案 3 :(得分:0)

状态变量的简单示例如下:

this.state = {
test: 'hello'
}

您可以通过

动态获取状态值

let field_name = 'test';
let data = this.state.[field_name];

您可以设置状态或替换状态,例如

let field_name = 'test';
this.setState({[field_name]: 'new'}) // test: 'new'

复杂状态替换为

let field_names = {key: 'test'}
this.setState({[field_name.key]: 'ok'}) // test: 'ok'
console.log(this.state.[field_name.key]) // test: 'ok'

您还可以使用模板文字

this.setState({`${field_name.key}`: 'ok'}) // test: 'ok'
console.log(this.state.[`${field_name.key}`]) // test: 'ok'

太棒了,您找到了解决方案。