在子组件出现之前,我一直试图在根组件中触发事件(即调用Redux操作)。
在此图中......
fetchData()
。当网址为/
时,我们只会看到此parent
。getDetail(id)
。当网址为/child
时,我们会在child
上看到此parent
。componentWillMount
问题是,当您直接访问/child
时,fetchData()
在调用getDetail(id)
后被称为。
(当您访问/
并访问/chile
时,会先触发fetchData()
。)
是否可以从较高组件触发事件到较低组件?
P.S。
以下是此问题的背景信息......
父级是一个博客帖子列表,其子级是详细信息页面,您可以在其中查看单个博客帖子的详细信息。
在列表(父页面)上,您点击detail
按钮,该按钮会引导您进入详细信息页面。为了实现这一点,有必要在显示它们的细节之前获取所有项目。
答案 0 :(得分:1)
修改 - 更新以反映您的上述回复。
我认为正确的方法是让您的州反映到达详细信息页面的可能方式。让fetchData()
实际确定是否需要提取,并从父组件和子组件中调用它。
听起来你正在使用react-router或类似的方法 - 这种情况很常见。我建议您跟踪当前所选的ID(如果您正在查看帖子列表,则未定义),然后在子项目可用时对其进行渲染。
我认为假设fetchData()是异步的,生命周期方法的顺序是真正的问题。
答案 1 :(得分:1)
因此,解决这个问题的方法是考虑您的组件正在做什么。您应该有一个主页,按标题和日期或您决定的任何内容列出帖子。然后,当您单击其中一个时,它将转到带有博客帖子的页面。
因此,您应该拥有PostList
组件和Post
组件。 PostList
应该获取显示列表所需的所有数据。 Post
应获取所有数据以显示帖子。渲染PostList
时,它不应呈现任何Post
。 Post
只应在您发布帖子的网址时进行呈现。要获得该行为,您需要一个类似found或react router的路由器。
现在可能会发现PostList
正在获取Post
显示每篇博文所需的所有详细信息。那样就好。您的州管理层应该检测到您已经拥有博客文章而不是获取它。这就是为什么你看到像fetchBlogPostIfNeeded
这样的行为 - 调用该函数通常检查本地状态以查看博客文章是否已经存在,如果是,它什么也不做。如果没有,它实际上取了它。
通过这种组合和适当的服务器端路由,您的博客应支持在帖子列表或查看单个帖子时进行硬刷新。关键部分是您使用URL从列表转到帖子。为此,您将使用Link
组件(找到并且路由器具有与此相同名称的组件)。