javascript - 在渲染任何组件后有一个 useEffect 钩子(Hook)

标签 javascript reactjs react-router-dom

所以我有渲染组件的路由:

const Layout = () => {

  return (
    <InitLayout>
      <Switch>
        <Redirect exact from='/' to='/home/recent' />
        <Route path="/home/:category" exact component={Home}></Route>
        <Route path="/about" exact component={About}></Route>
        <Route path="/help" exact component={Help}></Route>
        <Route path="/users/:userId" exact component={UserProfile}></Route>
        <Route path="/ask" exact component={AskQuestion}></Route>
        <Route path="/review" exact component={ReviewPost}></Route>
        <Route path="/posts/:postId/review" exact component={ReviewPost}></Route>
        <Route path="/users/:userId" exact component={UserProfile}></Route>

        <Redirect from='*' to='/home/recent' />
      </Switch>
    </InitLayout>
  );
};

在任何这些组件中,理论上我都会设置以下效果:

  useEffect(() => {
    if (!isSsr) {
      fetchPosts();
    }
    setSsrState({ isSsr: false }); // ==> Here 
  }, []);

此代码基本上会设置 SSR 状态,以防止客户端在数据已从服务器预加载时重新向服务器请求数据。

现在需要从任何组件设置此状态,但我不想在所有组件中重复此代码。忘记放置它会导致错误,所以这绝对是一个坏主意。

是否有一种直接的方法来定义一次效果,并在每个路由的组件中调用它?

最佳答案

与 Trace 交谈后,可以通过使用 HOC 包装布局组件(将 SSR 状态设置为 false)来解决该问题。

有趣的是,通过将组件包装在 HOC 内,这会在 HOC 组件之前首先启动子组件。这样,我们就可以首先检查子组件级别是否设置了 SSR。运行子组件 useEffect 后,再运行 HOC useEffect,这会将 SSR 标志设置回 false。

关于javascript - 在渲染任何组件后有一个 useEffect 钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59220417/

相关文章:

JavaScript。如果数组连续有 3 个赔率,则打印 "odd"。如果数组连续有 3 个偶数 - 打印 "even"

javascript - reducer 函数被调用两次

reactjs - 如何使用 react 路由器中的链接组件访问嵌套路由中的先前索引路由?

reactjs - react-router-dom 版本 6 嵌套路由 Prop 未通过

javascript - 用数组键替换数组中的对象

javascript - 如何确保多值字段是数组

javascript - 回调不是函数: what am i doing wrong?

javascript - ReactJS: "TypeError: Object(...)(...) is undefined"

javascript - 循环对象以在 React js 中创建引导行

reactjs - 我如何使我的仪表板 protected 组件(只有注册用户才能访问)。以及仪表板导航如何工作