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

通过React Router重新加载相同路由后的API调用

欧阳正谊
2023-03-14
问题内容

我正在通过react-router-dom
v4中的Redirect重新加载组件,当第一次加载组件时,api调用会在ComponentDidMount中发生。但是,当Redirect触发组件重新加载时,此方法不会运行。

我有组件TopicList,它是使用react-router-dom中的Route通过路径/ topic显示的

PostTopic是在TopicList中呈现的模态。在PostTopic内,我向状态添加了一个名为redirect的属性,并使用该属性将Redirect
Component呈现为=“ / topic”,我将一些数据发布到api后进行了重定向。

在topicList通过Redirect重新加载时,componentDidMount()未运行,因此不会发生用于获取新发布的数据的api调用。

在通过react-router的Redirect重新加载相同的路由后,从api调用中重新获取数据的最佳方法是什么。

class PostTopic extends Component


state = {
  redirect: false
}

handleSubmit = (e) => {
  e.preventDefault();
  const { body, subject } = this.state;
  api.postTopic(this.props.store.token,subject,body)
  .then( response => {
     this.setState({redirect:true})
   })
   .catch( error => {
      this.setState({error});
   });
}

renderRedirect = () => {
  if(this.state.redirect){
    return <Redirect to={this.props.currentPath}/>
  }
}

render(){
  return(
     ...
     ...
     ...
     {this.renderRedirect()}                
  }
}

问题答案:

componentDidMount 仅在组件最初安装在DOM中且URL参数更改时未安装新组件时才运行。

您需要使用componentDidUpdate并检查URL参数是否已更改,如果是这种情况,请再次获取数据

function getData() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(Array.from({ length: 3 }, () => Math.random()));
    }, 1000);
  });
}

class Page extends React.Component {
  state = { data: [] };

  componentDidMount() {
    getData().then(data => {
      this.setState({ data });
    });
  }

  componentDidUpdate(prevProps) {
    if (prevProps.match.params.pathParam !== this.props.match.params.pathParam) {
      getData().then(data => {
        this.setState({ data });
      });
    }
  }

  render() {
    return (
      <div>
        {this.state.data.map(element => <div key={element}>{element}</div>)}
      </div>
    );
  }
}

class App extends React.Component {
  render() {
    return (
      <BrowserRouter>
        <div>
          <Link to="foo"> Foo </Link>
          <Link to="bar"> Bar </Link>
          <Switch>
            <Route path="/:pathParam" component={Page} />
          </Switch>
        </div>
      </BrowserRouter>
    );
  }
}


 类似资料:
  • 我有几个路线,每个路线装载3个组件。所有管线上的两个组件都相同。当我在这些路由之间移动时,我希望传递新数据,在组件的某个初始化事件上,我希望填充该组件的数据,以便它反映在UI上。我还想重新触发正在加载的组件的引导动画。我该怎么做呢。因为现在,我不知道在组件的生命周期中,我将在哪里获取数据,并使用这些新数据重新提交组件。具体来说,在myapps/1和/newapp/I中有一个主视图组件和一个侧栏组件

  • 问题: 有异步路由,从中获取参数并返回(组件)。问题是当我从一个到另一个(只是相同的路由,但不同。参数)我的路由器卸载并重新渲染组件。但它应该只传递新的道具,不要触及我的组件生命周期。怎么解决呢?我做错了什么? 代码: 路由器 组件将装入电影组件中 更新:好的,做了一些实验。 替换

  • 问题内容: 设法获得logstash(1.3.1)以将数据发送到elasticsearch(0.9.5)。 我的logstash conf文件设置是 数据存储在ES中的索引logstash-2013.12.xx下 但是,如果我重新启动logstash,请说第二天-将相同的数据重新加载到新索引中。即使我再次重新启动,索引中的文档计数也会加倍。 好像logstash重新读取数据,ES也在复制文档。 有

  • 我有一个关于Vuejs和Vue路由器的项目。当用户登录系统时,服务器返回一个带有令牌、用户名和名字的Json文件,该文件存储在localstorage中,以便在以下请求中使用。第一个名称在布局中用于在导航栏中显示欢迎消息。注销后,localstorage被清除,问题就在这里,当其他用户在消息welcome not reload中使用新的名字付费时。

  • 问题内容: 我做了一些Angular路线,如下面的代码所示。 在我将基本href设置为“ /”后,它可以正常工作,但它接受了带有“ / portfolio”的href的锚点,但是当我转到“ http://url.com/portfiolo ”或尝试重新加载页面时当我在投资组合路线上时,它将给我服务器错误。我可以为此做些什么吗? 提前致谢。 问题答案: 我自己解决了..您始终需要在项目的根目录中创建

  • 我有一个显示多条路线的组件(步骤1、步骤2、步骤3…)一个接一个。我导航并传递属性,如 路线定义为 这很有效,直到我重新加载页面/路由,因为数据丢失。所以我有点想在加载组件后从父级获取数据。 我的一个想法是使用本地存储,但这感觉不对。 我是Vue的新手,我想问一下这里的最佳实践是什么。是否像这里描述的那样使用vue路由器重新加载组件?请给我一个提示。