componentWillReceiveProps 无限循环?
componentWillReceiveProps infinite loop?
我是新手,我想知道这是否正常。如果我在 componentWillReceiveProps 方法中放置一个 console.log,它只会无限地记录信息。我在 console.log 正下方有一个 if (this.props !== nextProps) {}
检查,所以实际上没有触发任何东西,但无限循环让我作为初学者感到担忧。有人可以解释一下这是否正常吗?
我将从我的代码中提取一些重要的片段。
// From the parent component
constructor(props: any) {
super(props);
this._handleChanged = this._handleChanged.bind(this);
this._onSave = this._onSave.bind(this);
this.state = { columns: {}, fieldsWithErrors: {}, loaded: false, loadedValues: {} };
}
componentDidMount() {
RestUtil.get().then((response) => {
// put in an if statement to check if response came back null
this.state.loadedValues = response;
this.setState({
loadedValues: this.state.loadedValues,
loaded: true
});
}, (error: any) => {
alert(`There was a problem submitting your request: ${error}`);
console.log(error);
});
}
<MyDatePicker
label="Label"
name="Name"
isrequired={false}
onSelectDate={this._handleChanged}
value={this.state.loadedValues["Name"]}
/>
// From MyDatePicker
public render() {
return (
<div>
<DatePicker
label={this.props.label}
strings={DayPickerStrings}
placeholder='Select a date...'
value={this.state.date}
isRequired={this.props.isRequired}
onSelectDate={this._handleChange}
/>
</div>
);
}
这里有一些问题可能会导致您所看到的情况。
- 你永远不应该在构造函数之外直接设置状态。在你的
componentDidMount
方法中做 this.state.value = something
是不正确的,因为你永远不应该设置状态除了使用 setState
之外,以任何方式使用 React 组件。
- 您不应使用与设置状态相同的方法读取状态。 React 的
setState
不会立即更改组件的状态 - 状态更改是分批处理的,合并在一起并在稍后应用。如果你想在状态改变时从状态中读取数据,你应该在 componentDidUpdate
方法中通过比较旧状态和新状态来完成。
如果您尝试直接更改状态,将会导致组件的生命周期出现一些问题,这可能是导致无限循环的原因。设置后立即从状态读取也可能无法获得您期望的值。
尝试查看 component lifecycle methods 并将您的代码重构为更惯用的代码。这可能会使问题消失。
我是新手,我想知道这是否正常。如果我在 componentWillReceiveProps 方法中放置一个 console.log,它只会无限地记录信息。我在 console.log 正下方有一个 if (this.props !== nextProps) {}
检查,所以实际上没有触发任何东西,但无限循环让我作为初学者感到担忧。有人可以解释一下这是否正常吗?
我将从我的代码中提取一些重要的片段。
// From the parent component
constructor(props: any) {
super(props);
this._handleChanged = this._handleChanged.bind(this);
this._onSave = this._onSave.bind(this);
this.state = { columns: {}, fieldsWithErrors: {}, loaded: false, loadedValues: {} };
}
componentDidMount() {
RestUtil.get().then((response) => {
// put in an if statement to check if response came back null
this.state.loadedValues = response;
this.setState({
loadedValues: this.state.loadedValues,
loaded: true
});
}, (error: any) => {
alert(`There was a problem submitting your request: ${error}`);
console.log(error);
});
}
<MyDatePicker
label="Label"
name="Name"
isrequired={false}
onSelectDate={this._handleChanged}
value={this.state.loadedValues["Name"]}
/>
// From MyDatePicker
public render() {
return (
<div>
<DatePicker
label={this.props.label}
strings={DayPickerStrings}
placeholder='Select a date...'
value={this.state.date}
isRequired={this.props.isRequired}
onSelectDate={this._handleChange}
/>
</div>
);
}
这里有一些问题可能会导致您所看到的情况。
- 你永远不应该在构造函数之外直接设置状态。在你的
componentDidMount
方法中做this.state.value = something
是不正确的,因为你永远不应该设置状态除了使用setState
之外,以任何方式使用 React 组件。 - 您不应使用与设置状态相同的方法读取状态。 React 的
setState
不会立即更改组件的状态 - 状态更改是分批处理的,合并在一起并在稍后应用。如果你想在状态改变时从状态中读取数据,你应该在componentDidUpdate
方法中通过比较旧状态和新状态来完成。
如果您尝试直接更改状态,将会导致组件的生命周期出现一些问题,这可能是导致无限循环的原因。设置后立即从状态读取也可能无法获得您期望的值。
尝试查看 component lifecycle methods 并将您的代码重构为更惯用的代码。这可能会使问题消失。