React - 重定向后调用方法

Posted

技术标签:

【中文标题】React - 重定向后调用方法【英文标题】:React - Call method after redirect 【发布时间】:2019-04-13 23:46:29 【问题描述】:

我有两个不同的链接。一个是主页,另一个是图库。我在主页 3 上带有方法 scrollIntoView onClick 的链接,这些链接将我带到不同的部分。我想实现将我从画廊组件重定向到主页的方法,完成后调用方法scrollIntoView

goToContact 方法:

goToContact = e => 
    if (window.location.pathname === "/fotobudka/") 
      this.fbContactElement.scrollIntoView(
        behavior: "smooth",
        block: "start"
      );
    
    if (window.location.pathname !== "/fotobudka") 
      this.changeUrl();
      this.goto();
    
  ;

更改网址将我重定向到主页:

changeUrl() 
    return <Redirect to="/fotobudka/" />;
  

完成后:

goto = () => 
    setTimeout(() => 
      let fbContactElement = document.getElementById("contact-form");
      fbContactElement.scrollIntoView(
        behavior: "smooth",
        block: "start"
      );
    , 100);
  ;

我的方法效果很好,但我知道 SetTimeout 不是好的解决方案。我已经尝试过异步/等待,但我认为我还不足以实现它。

如何在不使用 SetTimeout 函数的情况下对其进行重构?

【问题讨论】:

你试过用browserHistory吗? Check this 或 this 【参考方案1】:

你必须使用 setState 来设置一个属性来渲染你的 render() 方法。

class MyComponent extends React.Component 
  state = 
    redirect: false
  

  goTo = () => ...

  goToContact = e => 
    this.setState( redirect: true ,
    ()=>goto());
  

  render () 
    const  redirect  = this.state;

    if (redirect) 
      return <Redirect to='/fotobudka'/>;
    

    return (...)
  

你也可以在官方文档中看到一个例子:https://reacttraining.com/react-router/web/example/auth-workflow

【讨论】:

***.com/questions/43230194/…【参考方案2】:

我解决了我的问题,在一个论坛中,我检查了通过间隔我们可以检查页面上是否已经存在项目。在 React 中它看起来像这样:

goto = selector => 
if (window.location.pathname !== "/fotobudka/") 
  this.constructor.changeUrl();

let checkExist = setInterval(() => 
  let element = document.getElementById(selector);
  if (element) 
    element.scrollIntoView(
      behavior: "smooth",
      block: "start"
    );
    clearInterval(checkExist);
  
, 100);
;

static changeUrl() 
  return <Redirect to="/fotobudka/" />;

【讨论】:

【参考方案3】:

您可以使用componentDidMount() 生命周期钩子在组件加载时执行一些代码。但是你必须通过传递一些查询参数来避免无限的更新周期,比如doScroll=true。现在您可以简单地检查您的 componentDidMount() 钩子中的查询参数并执行您的滚动功能

【讨论】:

是的,我这样做了,我的元素是未定义的 你指的是哪个元素? fbContactElement 你能从你的应用创建一个在线演示吗?以便我们可以帮助您调试它?

以上是关于React - 重定向后调用方法的主要内容,如果未能解决你的问题,请参考以下文章

发生超时后调用 Servlet 方法(控制器)时,Spring Security 3.1 重定向到登录不起作用

重定向后反应状态数据未准备好

在 React 中提交后重定向

使用 React Router v4 正确重定向

重定向方法在 react-router-dom 中不起作用

在快速服务器上成功调用 api 后重定向具有角度路由的页面