【发布时间】:2021-07-16 07:32:13
【问题描述】:
class EditLocation extends Component {
constructor(props) {
super();
this.state = {
LocationId: '',
locationOptions: [],
}
this.baseState = this.state;
this.findLocationById = this.findLocationById.bind(this);
}
findLocationById = (locationId) => {
let locationOptions = [];
if (locationId <= 0) {
setTimeout(()=>{
this.setState(this.baseState);
locationOptions.push(
<CustomInput
type="checkbox"
id={value.LocationTypeId}
key={value.LocationTypeId}
value={value.LocationTypeId}
defaultChecked={false}
label={`${value.LocationTypeName}`}
className="mb-0"
onChange={this.handleCheckbox.bind(this)}
/>
)
this.setState({locationOptions:locationOptions})
},200)
else {
setTimeout(() => {
let location = this.props.store.selectedLocation;
this.props.store.LocationTypes.forEach((value)=>{
if(location.LocationTypes ?
location.LocationTypes.includes(value.LocationTypeId): false)
{
locationOptions.push(
<CustomInput
type="checkbox"
id={value.LocationTypeId}
key={value.LocationTypeId}
value={value.LocationTypeId}
defaultChecked={true}
label={`${value.LocationTypeName}`}
className="mb-0"
onChange={this.handleCheckbox.bind(this)}
/>
)
}
else
{
locationOptions.push(
<CustomInput
type="checkbox"
id={value.LocationTypeId}
key={value.LocationTypeId}
value={value.LocationTypeId}
defaultChecked={false}
label={`${value.LocationTypeName}`}
className="mb-0"
onChange={this.handleCheckbox.bind(this)}
/>
)
}
})
this.setState({
LocationId: location.LocationId,
locationOptions: locationOptions,
})
render(){
return (
<div>
<Modal>
<Form>
<FormGroup>
<input
value={this.state.LocationId}
type="text"
name="Location"
id="Location"
/>
</FormGroup>
<FormGroup>
{console.log(this.state.locationOptions)} // showing updated state value
{this.state.locationOptions} // showing previous state.locationOptions value
</FormGroup>
</Form>
</Modal>
</div>
)
}
}
渲染中的 console.log() 正在更新值,因为我对 customInput 的检查没有更新。我需要重新打开模式或重新加载整个程序以查看更新。 任何解决方案和资源都会有所帮助,因为我坚持了几个小时并且似乎无法解决问题。如果有帮助,商店就是 mobx 商店
【问题讨论】:
-
不要在渲染中使用 console.log,这是一个无意的副作用。状态更新时使用
componentDidUpdate记录。 -
并且 locationId 已更新并在 内显示为已更新,但复选框不起作用。我知道 setState 是异步的,但我不知道如何使用它的回调在渲染中实现真正的更新
-
@DrewReese 但console.log 不是主要问题。我需要 {this.state.locationOptions} 来显示实际价值以及我如何实现这一目标
-
this.state是始终当前状态。您还在findLocationById中做了一些奇怪的事情,例如将 JSX 存储在状态中(一种 React 反模式),这几乎可以保证在外壳中具有陈旧的值,并在超时时将状态更新入队,所以谁知道你会在未来哪个渲染周期看到该更新。 -
是
findLocationById下面调用并检查语法
标签: javascript reactjs setstate