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个输入字段
例如,如果循环运行2次,它将创建6个字段,如下图所示:
所以现在我想以不同方式管理所有6个字段的状态 我该怎么办?
答案 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'
太棒了,您找到了解决方案。