【问题标题】:State vs Redux. How to implement page loading and prefetch data loading with react router?状态与 Redux。 react-router如何实现页面加载和预取数据加载?
【发布时间】:2019-10-21 03:48:01
【问题描述】:

我正在用 Redux 和 React-Router 做 React 应用程序

例如,我有 600 万个个人资料页面

/id1
/id2
...
/id6000000

它们都应该由 ProfilePage 组件绘制。 所以我只是在做类似的事情:

class ProfilePage extends Component {
    componentDidMount() {
        httpApi.getProfileData(this.props.match.params.id)
        .then(response => {
            this.setState({
                page: response
            })
        })
    }

    ...
}

效果很好。

但是接下来我想用 Redux 做同样的事情(为了方便阅读,我会直接调用 dispatch)。

此外,我们需要了解我们不需要全局存储中的页面数据,除非在底层组件中使用连接的道具(我们可以很容易地用 createContext 替换它)。我们只是使用 Redux 将逻辑和请求移到外太空。

class ProfilePage extends Component {
    static propTypes = {
        page: propTypes.object // from connect
    }

    componentDidMount() {
        dispatch({type: 'PROFILEPAGE_LOADING_START', id: this.props.match.params.id});
    }

    ...
}

在中间件调用reducer并设置存储之后:

PROFILEPAGE_LOADING_SUCCESS:
    return {
        profilePage: action.page
    }

所以我认为现在一切正常,除了一件事。

例如,我们停留在 id1 的配置文件页面并转到 id3,我们的 react-router 卸载 profilePage[id1] 并安装 profilePage[id3],并在加载新数据之前使用 old[id1] 数据进行渲染,因为我们不会从存储中删除旧数据。嗯。

我知道我们可以在 componentDidMount 实现页面键或加载状态或清除状态(但在安装之前它仍然使用旧数据呈现) 别的东西,不过有点丑,有副作用。

问题:最佳做法是什么?

其次,如果我想在历史推送之前在链接单击时实现预取数据加载。 不用 Redux 很容易实现,只需要使用历史推送状态并在 componentDidMount 中使用这个状态。

但是,如果我使用 Redux,那么它绝对是可怕的事情。 首先,我需要以任何丑陋的方式解决第一个问题,其次,我需要以某种方式将存储中的数据更改连接在一起,并通过反应路由器进行渲染。否则需要实现 shouldComponentUpdate 逻辑,这也很丑陋,在某些情况下不会触发。

我尝试了很多解决方案,它们都有效,但都丑得要命。

问题 2:解决方案是什么?

【问题讨论】:

  • 你是否正在检查来自 redux 的新 props 是否与旧 props 不同?
  • 你能扩展什么和在哪里?我试图检查不同概念的道具。对于页面键、位置或数据的存在。但它们都有例外,需要更丑陋的代码
  • 我的意思是当id发生变化时,组件会更新,你可以尝试使用componentDidUpdate()更简单的Api to shouldComponentUpdate。然后将之前的 props 与新的 props 进行比较,只有当它是新的 props 时才重新渲染组件

标签: reactjs redux react-redux react-router


【解决方案1】:
  1. 在 reducer 中的 PROFILEPAGE_LOADING_START 上,您可以将 profilePage 设置为未定义。恕我直言,这是最简单和最简单的方法。
  2. 您可以在推送之前调度操作 PROFILEPAGE_LOADING_START,如果 ProfilePage 未定义,则仅显示 profilePage,如果未定义,则显示加载指示器。

【讨论】:

  • 1.它看起来像是很好的解决方案,可能是它的工作,我还没有尝试过,因为主要是预取数据加载路由。
  • 但我不明白第二个答案:(我们没有任何加载指示器,我们只是将一页替换为另一页,因为数据与历史推送一起加载。所以生命周期和反应路由器触发器中的主要问题.它以一种或另一种方式渲染错误。主要是因为我们有不同的方式来加载页面,通过冷加载、重新加载、默认链接或自定义预取链接。而且只能有一个事实来源。是的,我用 SCU 和一些检查,但它看起来很麻烦,我不想使用它)我有这样的东西:pastebin.com/R52W4mH7
  • @moetsy 加载指示器是可选的。您可以只显示空白页面或没有数据的页面。这取决于你。
  • 无论如何,如果我理解正确,您说的只是拆分位置推送和数据更改,但它会导致很多道具检查,就像我之前的 pastebin 示例一样,也许某个地方存在更好的示例 idk。例如,预加载状态只是一个字符串,我正在寻找同样简单的 redux 解决方案:pastebin.com/UpiHRyR5
猜你喜欢
  • 2017-09-28
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 2016-02-28
  • 2020-06-06
  • 2017-03-28
  • 2018-10-03
  • 2022-09-23
相关资源
最近更新 更多