React 表单随着状态的每次变化而重置?
React form getting reset with every change in state?
我正在使用 formik 开发一个简单的 crud 表单,用于学习目的,这
现在这个表格我面临两个问题
第一期
因为 数量 字段应该只输入数字所以我添加了一个 onChange 侦听器并在只输入数字时更新状态,它工作正常,但问题是 重置整个表格
<Field
className="form-control"
type="text"
name="quantity"
onChange={this.onChangeCheckNumber}
>
</Field>
onChangeCheckNumber = (event) => {
const re = /^[0-9\b]+$/;
// if value is not blank, then test the regex
if (event.target.value === '' || re.test(event.target.value)) {
this.setState({ quantity: event.target.value })
}
}
我认为这段代码是罪魁祸首
this.setState({ quantity: event.target.value })
因为我正在设置状态,所以我想我的整个表单又被重新渲染了,
如何完美实现这个功能?
第2期
仓库选择取决于城市选择,所以我在城市上添加了一个 onChange 并为选定的 cityId 调用了仓库,我正在接收数据,但是城市下拉列表被阻止了。
我的状态属性
state = {
quantity: 0,
price: "0",
comments: '',
itemType: {
key: 0,
value: 'Select'
},
cities: {
key: 0,
value: 'Select'
},
warehouses: {
key: 0,
value: 'Select'
},
sellers: {
key: 0,
value: 'Select'
},
warehouseOptions: null
}
在 componentDidMount 中,我正在初始化下拉值
componentDidMount() {
this.itemTypeObject();
this.cityObject();
this.sellerObj();
}
正在使用 axios 从服务器获取数据并更新状态
cityObject = () => {
axios.get('/cities')
.then(response => {
this.setState({
cities: response.data
});
}).catch(error => {
console.log(error);
});
}
在我的 Formik 表单中 标记我的城市和仓库下拉列表
<div>
<label>City</label>
<div>
<Field
as="select"
onChange={this.onCityDropdownSelected}
name="city"
>
{this.createCity()}
</Field>
</div>
</div>
<div>
<label>Warehouse</label>
<div>
<Field
className="form-control"
as="select"
name="warehouse"
>
{this.state.warehouseOptions}
</Field>
</div>
</div>
还有我的 onCityDropdownSelected
onCityDropdownSelected = (event) => {
if (event.target.value !== "0") {
this.warehouseObj(event.target.value);
} else {
this.setState({
warehouseOptions: null
})
}
}
warehouseObj = (cityId) => {
axios.get(`/warehouses/cityId/${cityId}`)
.then(response => {
this.setState({
warehouses: response.data
});
this.createWarehouse();
}).catch(error => {
console.log(error);
});
}
在此之后,我在仓库下拉列表中获得了更新的值,但城市下拉列表打开了,但在选择时没有改变。
在您的第 1 期中,您通过 this.setState({ quantity: event.target.value })
更改整个状态,因为它会更改您的状态并清除所有其他状态值,最终状态将仅包含导致重置表单状态的数量。
要解决该问题,您必须解构旧状态,而不仅仅是像这样更改数量:
this.setState{...state, quantity: event.target.value}
至于 onCityDropdownSelected
发生了同样的问题。请告诉我这个答案是否有助于解决您的问题。
我正在使用 formik 开发一个简单的 crud 表单,用于学习目的,这
现在这个表格我面临两个问题
第一期
因为 数量 字段应该只输入数字所以我添加了一个 onChange 侦听器并在只输入数字时更新状态,它工作正常,但问题是 重置整个表格
<Field
className="form-control"
type="text"
name="quantity"
onChange={this.onChangeCheckNumber}
>
</Field>
onChangeCheckNumber = (event) => {
const re = /^[0-9\b]+$/;
// if value is not blank, then test the regex
if (event.target.value === '' || re.test(event.target.value)) {
this.setState({ quantity: event.target.value })
}
}
我认为这段代码是罪魁祸首
this.setState({ quantity: event.target.value })
因为我正在设置状态,所以我想我的整个表单又被重新渲染了,
如何完美实现这个功能?
第2期
仓库选择取决于城市选择,所以我在城市上添加了一个 onChange 并为选定的 cityId 调用了仓库,我正在接收数据,但是城市下拉列表被阻止了。
我的状态属性
state = {
quantity: 0,
price: "0",
comments: '',
itemType: {
key: 0,
value: 'Select'
},
cities: {
key: 0,
value: 'Select'
},
warehouses: {
key: 0,
value: 'Select'
},
sellers: {
key: 0,
value: 'Select'
},
warehouseOptions: null
}
在 componentDidMount 中,我正在初始化下拉值
componentDidMount() {
this.itemTypeObject();
this.cityObject();
this.sellerObj();
}
正在使用 axios 从服务器获取数据并更新状态
cityObject = () => {
axios.get('/cities')
.then(response => {
this.setState({
cities: response.data
});
}).catch(error => {
console.log(error);
});
}
在我的 Formik 表单中 标记我的城市和仓库下拉列表
<div>
<label>City</label>
<div>
<Field
as="select"
onChange={this.onCityDropdownSelected}
name="city"
>
{this.createCity()}
</Field>
</div>
</div>
<div>
<label>Warehouse</label>
<div>
<Field
className="form-control"
as="select"
name="warehouse"
>
{this.state.warehouseOptions}
</Field>
</div>
</div>
还有我的 onCityDropdownSelected
onCityDropdownSelected = (event) => {
if (event.target.value !== "0") {
this.warehouseObj(event.target.value);
} else {
this.setState({
warehouseOptions: null
})
}
}
warehouseObj = (cityId) => {
axios.get(`/warehouses/cityId/${cityId}`)
.then(response => {
this.setState({
warehouses: response.data
});
this.createWarehouse();
}).catch(error => {
console.log(error);
});
}
在此之后,我在仓库下拉列表中获得了更新的值,但城市下拉列表打开了,但在选择时没有改变。
在您的第 1 期中,您通过 this.setState({ quantity: event.target.value })
更改整个状态,因为它会更改您的状态并清除所有其他状态值,最终状态将仅包含导致重置表单状态的数量。
要解决该问题,您必须解构旧状态,而不仅仅是像这样更改数量:
this.setState{...state, quantity: event.target.value}
至于 onCityDropdownSelected
发生了同样的问题。请告诉我这个答案是否有助于解决您的问题。