- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Gutentag,伙计们!
卸载组件后,我的应用程序不断收到此错误消息:
Warning: Can't call setState (or forceUpdate) on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method.
in Header (at index.js:27)
现在这是 Header 组件的代码:
class Header extends Component {
isCancelled = false;
state = {
someStateVars: x,
separateColumns: 'true',
}
handleChange = (event) => {
const target = event.target;
const value = target.type === 'checkbox' ? target.checked : target.value;
const name = target.name;
if (!this.isCancelled) {
this.setState({ //######THIS IS LINE 27######
[name]: value
});
}
}
handleDisplayChange = (event) => {
const value = event.target.value;
const name = 'separateColumns';
if (!this.isCancelled) {
this.setState({
[name]: value
}, () => {
this.props.displayChange();
});
}
}
serversRefresh = () => {
if (!this.isCancelled) {
setTimeout(() => {
this.setState({refreshed: false});
}, localStorage.getItem('seconds')*1000); //disable refresh for 15 seconds
}
}
reactivateButton = () => {
if (!this.isCancelled) this.setState({refreshed: false});
}
componentDidMount() {
if(localStorage.getItem('seconds')>5 && !this.isCancelled){
this.setState({refreshed: true});
}
}
componentWillUnmount() {
this.isCancelled = true;
}
}
当我看到出现此错误时,我添加了 isCancelled 变量,该变量在 componentWillUnmount() 函数中更改为 true。
在我卸载 Header 组件后,15 秒后,当 serversRefreshbutton 重新激活时,我收到此错误消息。
我该如何解决?
在我遇到此问题的另一个组件上,“isCancelled”var 确实有所帮助,但在这里我发现它没有影响并且问题仍然存在。
最佳答案
只需将您的超时时间存储在一个变量中,例如
this.timeout = setTimeout(/* your actions here*/, /* your timeout */)
然后在 componentWillUnmount
componentWillUnmount() {
clearTimeout(this.timeout)
}
它应该可以解决您的问题,无需像 this.isCancelled
这样的拐杖。检测组件的挂载状态是空操作,因为即使在卸载后它仍然从内存中卸载。
setTimeout
返回计时器的 id,将来可以用它取消。 clearTimeout
通过它的 id 取消超时,如果它还没有被执行的话。
您可以在此处阅读有关您案例的更多信息:Why isMounted is antipattern .
有关 MDN 上计时器的更多信息.
关于javascript - 无法在未安装的组件上调用 setState(或 forceUpdate)。 react ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52235758/
假设已经定义了所有不同的组件。 在我的 React 组件中,我希望单击按钮触发附加一个新的 TextBox我动态创建的组件 questions成分。当我用 forceUpdate() 测试按钮点击时,
文档对 forceUpdate 的描述如下: Calling forceUpdate() will cause render() to be called on the component, skip
我有以下组件,其中将显示产品列表。 CounterComponent 添加到两个位置,一个在 ProductCatalog 中,另一个在 ProductCard 中,可以在模态中显示。在柜台表示订购的
以非常简单的react.js应用程序为例I created here .. data = note: "" setNote = -> data.note = $('inpu
在 React docs , forceUpdate有一个参数callback . 是不是像 setState设置状态后调用的第二个参数?或者那是为了什么? 我找不到任何关于它的文章。 最佳答案 Is
我可以强制重装对于具有 this.forceUpdate() 的父组件,但是如何为子组件做呢? 即以下 react 类方法: buttonClick = () => { //This updat
我的组件状态保存的数据(片段)看起来像这样: [ { batchId: 1234, ... jobRowData: [
我在整个应用程序的多个组件中使用以下模式。我注意到许多人不鼓励使用 forceUpdate(),有些人甚至称其为 hack。那么如何在不使用它的情况下完成呢? // user.js export de
迫使 Vue 实例重新渲染。注意它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。 比如v-for里面数据层次太多, 修改过数据变了,页面没有重新渲染,需手动强制刷新。
我在控制台中看到这个错误并尝试了很多解决方案都没有用 ExceptionsManager.js:84 Warning: Can't call setState (or forceUpdate) on
我想在用户单击主页按钮时刷新整个页面。我正在使用 thisHOME 它按预期工作,但我有这个错误。知道我为什么得到它吗? Cannot read property 'enqueueForceUpdat
我有一个问题,redux 状态被成功更新,但 react 组件没有重新渲染,经过一些研究我相信 [forceUpdate()][1] 可以解决我的问题,但我是不确定实现它的正确方法,即在 redux
我有这个组件,我想在我的 api 调用后重新呈现。我无法弄清楚为什么在 getWinks 的 api 调用之后,winks-count 确实更新但不在 View 上,除非我刷新。我不应该使用 this
我这周开始学习 VueJS,我正在尝试构建一个笔记应用程序,但遇到了一些问题: NOTES :
我有一个简单的 React 设置,看起来有点像这样: index.js ReactDOM.render(, document.getElementById('root')); App.js expor
Gutentag,伙计们! 卸载组件后,我的应用程序不断收到此错误消息: Warning: Can't call setState (or forceUpdate) on an unmounted c
React 文档说 永远不要直接改变 this.state,因为之后调用 setState() 可能会替换你所做的改变。将 this.state 视为不可变的... 但当我根本不使用 setState
我不确定我这样做是对还是错,但我似乎找到了如何为计算值更新 dom 的所有答案...... 我有这个组件: Vue.component('bpmn-groups', { props: ['gr
当 observable 更新时,Mobx @observer 组件会触发该组件上的 render 或 forceUpdate 吗?当它发生时会触发哪些生命周期方法? render 和 forceUp
我正在 componentDidMount 中获取数据并更新状态,并且出现了著名的警告: Warning: Can't call setState (or forceUpdate) on an unm
我是一名优秀的程序员,十分优秀!