多次单击同一个反应路由器 Link 时强制重新安装组件

Force remount component when click on the same react router Link multiple times

我有一个路由页面,其中包含组件安装时获取数据的数据表。当我多次点击同一个 react-router-dom Link (到上面的路线)时,似乎只有在路线改变时组件才会卸载(要渲染不同的组件)。

我希望在再次单击同一个 link 时强制重新安装该组件以获取新数据。 react-router-dom Link 或任何其他 Link 组件中是否有任何选项或任何技巧可以做到这一点?

我的示例代码在这里:https://codesandbox.io/s/react-router-9wrkz

我希望在多次点击关于 link 时重新挂载关于组件

为什么不通过在您的组件中创建一个函数来强制重新加载 onClick:

remount(){
    location.reload(true);
}

然后将 onClick 处理程序分配给 Link:

<Link to="/your route" onClick = {this.remount}>

除非您反对重新加载页面,否则似乎工作正常。

强制组件重新挂载的一种方法是更改​​ key 属性(您可以使用 Date.now()props.location.key):

  <Route
    path="/about"
    render={props => <About key={props.location.key} {...props} />}
  />

您可以使用此方法进行渲染

componentWillReceiveProps(recievedProps) {
    console.log("componentWillReceiveProps called");
    if (
      recievedProps &&
      this.props &&
      recievedProps.location &&
      this.props.location &&
      recievedProps.location.key &&
      this.props.location.key &&
      recievedProps.location.key !== this.props.location.key
    ) {
      this.setState({ loading: true });
      promise().then(result => {
        this.setState({ value: result, loading: false });
      });
    }
  }

供日后参考。除了上面提到的答案之外,我还需要调整一些东西,因为 none 对我来说效果很好。之前提到过 props 的比较,但是因为键在一个对象(引用)中,所以它从未看到更新(你正在比较同一个对象)。所以我通过将其保存为道具来跟踪。

我更喜欢使用 componentDidUpdate,因为当您可能只需要更新某些元素时,您不会卸载和安装整个组件,

对于此示例,您的组件确实需要使用 withRouter() 进行链接,因此您可以访问路由属性。

    // You cant use prevProps because object will be the same, so save it in component
    private currentRouteLocationKey: string| undefined; 

    public componentDidUpdate(): void {
    const currentRouteKey = this.props.history.location.key;

        // Compare keys so you only update when needed
        if (this.currentRouteLocationKey !== currentRouteKey) {
            // Add logic you want reset/ updated
            this.refreshPage();

            // Save the new key
            this.currentRouteLocationKey = currentRouteKey;
        }
    }

It means sometimes I want to force remount, sometimes not. How can I achieve this

这种方法怎么样? 它仅在 PUSH 上重新挂载。 不会在 REPLACE 上重新挂载。

https://codesandbox.io/s/react-router-forked-z8uco?file=/index.js

export function withRemountOnHistoryPush(Component) {
  const DecoratedComponent = (props) => {
    const [key, setKey] = React.useState(0);
    const history = useHistory();
    React.useEffect(() => {
      return history.listen((_, action) => {
        if (action !== "PUSH") return;
        setKey((prev) => prev + 1);
      });
    }, [history]);
    return <Component key={key} {...props} />;
  };
  return DecoratedComponent;
}