我收到此错误:
warning.js:33警告:无法在已卸载的组件上调用setState(或forceUpdate)。这是空操作,但它表明应用程序中发生内存泄漏。要解决此问题,请在componentWillUnmount方法中取消所有订阅和异步任务。
但是我没有使用componentWillUnMount方法。
我正在使用HOC来确保用户在访问其/ account路由之前已通过身份验证。
这是路线:
<StyleRoute props={this.props} path="/account" component=
{RequireAuth(Account)} />
其中RequireAuth是HOC。这是HOC:
import { withRouter } from 'react-router';
export default function RequireAuth(Component) {
return class AuthenticatedComponent extends React.Component {
componentWillMount() {
this.checkAuth();
}
checkAuth() {
if ( ! this.props.isAuthenticated) {
this.props.history.push(`/`);
}
}
render() {
return this.props.isAuthenticated
? <Component { ...this.props } />
: null;
}
}
return withRouter(AuthenticatedComponent);
}
该代码按预期工作,但是在呈现/
account时出现该错误。如您所见,在我的直接代码中,没有任何地方有componentWillUnMount方法。我真的很茫然,为什么这个警告不断弹出,任何信息都会有所帮助。
更新5/23/18:
为了摆脱错误并仍然保留道具,我做了两件事:
1)我选择在父App组件中具有两个高阶函数,而不是使用HOC。一个高阶函数用于传递道具,另一个用于检查身份验证。除了浏览器历史记录外,传递其他道具时遇到麻烦,因此下面的renderProps函数。
renderProps = (Component, props) => {
return (
<Component {...props} />
);
}
checkAuth = (Component, props) => {
if (props.isAuthenticated) {
return <Component {...props} />
}
if (!props.isAuthenticated) {
return <Redirect to='/' />
}
}
2)要使用这些,我必须在Route中使用用户渲染,而不是组件。
//I could pass props doing this, sending them through the above functions
<Route exact path="/sitter-dashboard" render={ () => this.checkAuth(SitterDashboard, this.props) } />
<Route exact path={"/account/user"} render={() => this.renderProps(User, this.props)} />
//I couldn't pass props doing this
<Route {...this.props} exact path="/messages" component={Messages} />
这是有关路由器vs组件作为Route渲染方法的文档:https : //reacttraining.com/react-
router/web/api/Route/route-render-methods
另外,这是关于堆栈溢出的一个很好的解释
最后,我使用了React Router 4文档中的代码作为我上面所做的模板。我敢肯定下面的内容比较干净,但是我仍在学习,所做的事情对我来说更有意义。
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route
{...rest}
render={props =>
fakeAuth.isAuthenticated ? (
<Component {...props} />
) : (
<Redirect
to={{
pathname: "/login",
state: { from: props.location }
}}
/>
)
}
/>
);
我之前也有同样的错误,它是由使用ref标签的组件生成的,并且有一些手动操作。
看到这些错误的一个好习惯是吸引您的应用程序流,并查看调用的时间setState
。
如果您是我,我会改变的另一件事是componentDidMount
代替componentWillMount
检查某些数据。考虑到fb不建议使用此功能。
该生命周期以前称为componentWillMount。该名称将一直使用到第17版。使用redirect-unsafe-lifecycles
codemod自动更新您的组件。ReactJS组件文档
问题内容: 这个简单的事情应该很容易完成,但是我要把它弄复杂。 我要做的就是动画化React组件的安装和卸载。到目前为止,这是我尝试过的方法,以及每种解决方案都不起作用的原因: -我根本不使用CSS类,因为它全都是JS样式,所以这行不通。 -这个较低层的API很棒,但是它要求您在动画制作完成后使用回调,因此仅使用CSS过渡在此处无效。总会有动画库,这引出下一点: GreenSock-许可证对于IM
我在学反应。我读过一篇文章,建议我们使用函数组件,而不是扩展react.component的类,所以我跟着做了。我也使用箭头函数而不是函数关键字。即: 有没有一种方法可以使用setState()来代替setName()、setId()、…等?或者任何建议? 非常感谢!
问题内容: 我有一个简单的React组件,它的输入字段带有一个onChange事件。触发onChange事件,并使用输入字段中的值更新某些组件状态。但是我在控制台记录日志时注意到状态是一个字符。因此,如果我键入“ Hello”,控制台将显示状态为 ‘’在H上 HE上的“ H” HEL上的“ E” 地狱中的“ L” HELLO上的“ L” 那个怎么样? 问题答案: 是异步的。这意味着记录的时间控制台
有人想要代码更为简洁,便把卸载文件代码修改为: Delete "$INSTDIR\*.*" 然后把多余的删除。以前也这样做过,但后来想到,如果某个菜鸟把我们打包的程序安装在了D盘根目录(或其他分区的根目录),而他又点击了卸载的话,真让人欲哭无泪啊——D盘下面的所有文件都没啦! 所以,安装目录中的文件还是老老实实写代码卸载吧。包括桌面上的快捷方式也不要这样卸载,否则卸载后桌面上会空无一物的! 不过
问题内容: 我收到此错误: 无法在已卸载的组件上执行React状态更新。这是空操作,但它表明应用程序中发生内存泄漏。要修复,请取消使用useEffect清理功能中的所有订阅和异步任务。 当开始获取数据并卸载组件时,但是函数试图更新已卸载组件的状态。 解决此问题的最佳方法是什么? CodePen示例。 问题答案: 最简单的解决方案是使用局部变量来跟踪组件是否已安装。这是基于类的方法的常见模式。这是一
错误消息: 反应:警告setState无法在现有状态转换期间更新(例如在渲染中) 这是一个react原生应用程序,但我认为,这更多的是一个react问题。 我得到了标题中描述的错误。但我对原因感到困惑,我没有在任何父组件或子组件中设置状态。因此,我有一个孙子组件(CardLayoutResult),它呈现一个listView,每一行呈现一个新组件(Render row),该组件有一个单击事件,单击