当前位置: 首页 > 知识库问答 >
问题:

状态vs还原。如何用react路由器实现页面加载和预取数据加载?

李华茂
2023-03-14

我正在使用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停留在profile页面,然后转到id3,我们的react-router卸载profilePage[id1]并在加载新数据之前挂载profilePage[id3],并用旧的[id1]数据呈现它,因为我们没有从存储区中删除旧的数据。嗯。

我知道我们可以在componentDidMount实现页面键、加载状态或清除状态(但它仍然在挂载之前呈现旧数据),但这有点难看,而且有副作用。

问题:最佳做法是什么?

第二,如果我想在历史推送之前在链接点击时实现预取数据加载。它很容易实现,不需要Redux,只需使用历史推送状态,并在ComponentDidMount中使用该状态。

但如果我用Redux那它绝对是可怕的事情。首先,我需要通过任何丑陋的方式解决第一个问题,其次,我需要将存储中的数据变化连接在一起,并由react路由器呈现。否则需要实现shouldComponentUpdate逻辑,它也很难看,而且在某些情况下不会触发。

我试过很多解决办法,但都很难看。

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

共有1个答案

孙清野
2023-03-14
  1. 在reducer中的PROFILEPAGE_LOADING_START上,可以将profilePage设置为undefined。Imhoit是最简单最容易的方法
  2. 您可以在push之前分派操作PROFILEPAGE_LOADING_START,并且在ProfilePage中,如果PROFILEPAGE_LOADING_START未定义,则只显示ProfilePage,如果未定义,则只显示loading indicator。
 类似资料:
  • 英文原文: http://emberjs.com/guides/routing/loading-and-error-substates/ 除了异步路由指南中描述的技术外,Ember路由还提供了通过使用error和loading子状态,来实现自定义路由间的异步过渡。 loading子状态 考虑下面的情形: 1 2 3 4 5 App.Router.map(function() { this.r

  • ⚠️ 只有生产环境才有此功能 ⚠️ Examples Prefetching Next.js 有允许你预加载页面的 API。 用 Next.js 服务端渲染你的页面,可以达到所有你应用里所有未来会跳转的路径即时响应,有效的应用 Next.js,可以通过预加载应用程序的功能,最大程度的初始化网站性能。查看更多. Next.js 的预加载功能只预加载 JS 代码。当页面渲染时,你可能需要等待数据请求。

  • Redux提倡使用具有单一状态的单一存储。但是,使用react router,您可以获得多个页面,每个页面都有自己的顶级根组件。 一个人应该如何用一个有多个页面的反应路由器应用程序连接redux?React-router 1.0不再允许您向路由传递道具,因此使路由器成为包含所有页面状态的顶级组件不再可能也不可行。

  • 问题现象 页面生命周期相关问题,在页面渲染前从接口获取数据,渲染时将数据渲染到页面上。

  • 问题内容: 是否可以基于路由组动态加载控制器,js文件和模板?伪代码不起作用: 我已经看到了很多这样的问题,但是没有一个问题基于路由组加载js文件/控制器。 问题答案: 我设法解决了受@ calebboyd,http : //ify.io/lazy-loading-in-angularjs/ 和http://weblogs.asp.net/dwahlin/archive/2013/05/22/dy

  • 数据预取存储容器 (Data Store) 在服务器端渲染(SSR)期间,我们本质上是在渲染我们应用程序的"快照",所以如果应用程序依赖于一些异步数据,那么在开始渲染过程之前,需要先预取和解析好这些数据。 另一个需要关注的问题是在客户端,在挂载 (mount) 到客户端应用程序之前,需要获取到与服务器端应用程序完全相同的数据 - 否则,客户端应用程序会因为使用与服务器端应用程序不同的状态,然后导致