当前位置: 首页 > 面试题库 >

重定向时重新初始化类

闾丘成双
2023-03-14
问题内容

我目前在 http://example.com/parentdir/module/2/

此URL实际上按照以下路由指示加载Module.js类:

<Route exact path={"/parentdir/module/:id"} component={Module} />

这包含在index.js文件中定义的<BrowserRouter><Switch>元素中。

Module类具有constructorcomponentWillMount方法。这些设置了记录2的初始详细信息和装入信息。到目前为止一切正常。

现在,我的问题是,在Module.js的孙组件中,我使用以下Redirect重定向到另一个页面,例如第3页:

return (
        <Redirect to="/parentdir/module/3/" />
)

构造函数或componentWillMount无法运行,因此记录#3无法正确加载。这是因为该记录从加载记录2开始就已经加载到内存中了吗?重新加载Module.js以便正确加载记录#3的最佳方法是什么?我是否必须以某种方式重新初始化类?还是我必须以某种方式将孙子组件中的数据传递回模块类?后一种方法似乎很乏味。

只是为了澄清一下,如果我直接转到地址栏中的http://example.com/parentdir/module/3,则一切正常,但是如果我在ReactJS环境中重定向到该相同地址,则它将无法正常工作。

更新资料

到目前为止,我的问题有两个答案。一种解决方案建议使用componentWillReceiveProps。另一种解决方案建议将一种方法作为道具传递给孩子,然后传递给孙子。使用这些方法是否各有利弊,还是只是偏爱?


问题答案:

id被作为一个传递prop的形式this.props.params.id,所以你应该使用componentWillReceiveProps它运行每次生命周期方法,props而这一点正是你的情况发生了变化。

componentWillMount当您从导航/parentdir/module/2/parentdir/module/3组件时,该方法将不会运行mounted。它仅在您从其他组件导航时运行(例如,当您直接进入时)。

在您的Module组件中添加此生命周期方法

componentWillReceiveProps(nextProps){
      if(nextProps.params.id != this.props.params.id){
          //load information etc (whatever you are doing in componentWillMount)
       }
}

发生的事情是,当它收到较新的一组参数时props,将比较参数id是否已更改(所有路由参数都存在于中的params对象中props),并在看到有更改时执行逻辑。比较并不是真正必要的,您可以按原样添加方法中的逻辑,componentWillReceiveProps但是这样做效率低下,因为每次props对象更改时都会调用它(可能根本不是id参数)。



 类似资料:
  • 问题内容: 是否可以在运行时重新初始化Spring Bean? 我的Bean使用静态设置,在某些情况下会更改,然后我必须重新初始化Bean。 问题答案: 你可以通过三种方法在spring上下文中更新单例bean,可以选择一种适合你的用例: 在Bean中重新加载方法在Bean中 创建一个方法,该方法将更新/重新加载其属性。根据你的触发器,从spring上下文访问bean,然后调用reload方法更新

  • 问题内容: 我正在使用jquery数据表在网格内显示数据。在初始化页面加载脚本中,请使用DateTime.Today并对其进行进一步处理,问题是在初始化页面加载后,当我尝试让用户输入日期以进行进一步处理时。我遇到以下错误。 DataTables警告(表ID =’dataTable’):无法重新初始化DataTable。 要检索此表的DataTables对象,请不传递任何参数,或参阅bRetriev

  • 问题内容: 如果您有一个控制器来操作Angular.js中的$ scope变量,是否有惯用的方法: 重置控制器的$ scope,然后 重新启动控制器初始化? 对于复杂的控制器,不必将每个变量都重置为其初始值将非常方便,特别是如果您真正想要的是对控制器和范围进行简单的重新初始化。通过再次导航到相同的URL 并没有帮助。 编辑:假设我不能使用任何黑客工具,因为这会违反Chrome打包应用中的CSP。

  • 我的Bean使用静态设置,在某些情况下,这些设置会改变,然后我必须重新初始化Bean。

  • 问题内容: 这些陈述有何不同? 双虚拟= 0; 双虚拟= 0.0; 双虚拟= 0.0d; 双虚拟= 0.0D; 问题答案: 尝试过一个简单的程序(使用0和100来显示“特殊”常数和通用常数之间的差异)之后,Sun Java 6编译器将为1和2输出相同的字节码(情况3和4与2相同)就编译器而言)。 因此,例如: 编译为: 但是,我在Java语言规范中看不到任何能 保证 常量表达式的编译时扩展的东西。