Я создал страницу React следующим образом: .
Переключатель привязан к функции обратного вызова из родительского componentA, а componentA получает эту функцию со страницы верхнего уровня. Обратный вызов обновляет состояние страницы верхнего уровня. Итак, когда переключатель щелкнул, страница верхнего уровня повторно отобразит компонент A.
Переключатель, который я использую, является компонентом из библиотеки React-Switch: https://www.npmjs.com/package/react-switch
Иногда, когда я нажимаю переключатель, появляется предупреждение:
Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the ReactSwitch component.
Вот фрагмент кода.
На странице верхнего уровня:
// In the top-level page, there is a state to decide whether or not to apply some data filter
onSwitcherClicked(event) {
this.setState({
applyFilter: event,
});
render() {
const filter = this.state.applyFilter ? '{paths:["/some_filters"],}' : '{paths:["/none"],}';
return (
<div>
<ComponentA
filter = {filter}
applyFilter = {this.applyFilter}
callBack = {this.onSwitcherClicked}
/>
</div>
);
В Компоненте A
// Component A
componentWillMount() {
// Send some API request according to this.props.filter and load the data
// So every time the switcher clicked, the page will update the filter and pass some new props to componentA,
// then ComponentA will remount it self
}
render() {
return (
<div>
<DataViewer>
{/*A component to display the data*/}
</DataViewer>
<Switch onChange={this.props.callBack}
checked={this.props.applyFilter}/>
</div>
)
}
Вот сообщение об ошибке «
Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the ReactSwitch component.
printWarning warning.js:33
warning warning.js:57
React 3
getInternalInstanceReadyForUpdate
enqueueSetState
setState
$onDragStop react-switch.dev.js:252
$onMouseUp react-switch.dev.js:277
Я также скопировал код в response-switch.dev. js: 252 и response-switch.dev . js: 277:
// react-switch.dev.js:252
252 this.setState({
253 $isDragging: false,
254 $hasOutline: false
255 });
256 this.$lastDragAt = Date.now();
// switch.dev.js:277
276 ReactSwitch.prototype.$onMouseUp = function $onMouseUp(event) {
277 this.$onDragStop(event);
278 window.removeEventListener("mousemove", this.$onMouseMove);
279 window.removeEventListener("mouseup", this.$onMouseUp);
280 };
Я думаю, это потому, что, когда я нажимаю переключатель, он сбрасывает свой собственный статус. Между тем, состояние родительского компонента также изменяется. Поэтому, когда переключатель вызывает setState (), сам был размонтирован. Я прав? Есть ли способ исправить это?
Спасибо!