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

将xhr数据加载到Redux路由页面时的事件顺序是什么?

张鸿宝
2023-03-14

我是一个反应迟钝的人,我把自己弄糊涂了。

以下是我想要实现的目标:

/myapp/#/

  • 全局导航,带有指向/myapp/#/和/myapp/#/产品的链接

/myapp/#/产品

  • 全局导航(如上)
  • 从axios GET XHR请求中检索到的产品列表。每个产品都链接到 /myapp/#/产品/{productId}

/myapp/#/产品/{productId}

  • 全局导航(如上)
  • 产品一览(如上)
  • 产品详细信息面板,显示从另一个axios GET XHR请求中检索到的其他详细信息

用户应该能够单击列表中的产品以在inset product details面板中查看详细信息,但不应重新请求列表XHR请求。

我的代码

/index.js

    ...
    //I don't think this is the right place for this code...
    function loadProductListData() {
        store.dispatch(fetchListData('/api/products'))
    }

    render(
        <Provider store={store}>
            <Router history={history}>
                <Route path="/" component={HomePage} />
                <Route path="/products(/:productId)" component={ProductsPage} onEnter={loadProductListData} />
            </Router>
        </Provider>,
        document.getElementById('root')
    )
    ...

/组件/菜单。js公司

    import React from 'react'
    import { Link } from 'react-router';

    const Menu = () => (
        <ul>
            <li><Link to={''}>Home</Link></li>
            <li><Link to={'products'}>Products</Link></li>
        </ul>
    )

    export default Menu

/components/productList.js

    import React from 'react'
    import { Link } from 'react-router';

    class List extends React.Component {

        constructor(props) {
            super(props)
        }

        render() {
            return (
                <ul>
                    {
                        this.props.products.map(product =>
                            this.renderRow(product)
                        )
                    }
                </ul>
            )
        }

        renderRow (product) {
            return (
                <li key={product.id}><Link to={'products/' + product.id}>{product.name}</Link></li>
            )
        }
    }

    export default List

/行动。js公司

    export const REQ_DATA = 'REQ_DATA';
    export const RECV_DATA = 'RECV_DATA';
    import axios from 'axios'

    function requestData() {
        return {type: types.REQ_DATA}
    }

    function receiveData(json) {
        return{
            type: types.RECV_DATA,
            data: json
        }
    }

    export function fetchListData(url) {
        return function(dispatch) {
            dispatch(requestData())
            return axios({
                url: url,
                timeout: 20000,
                method: 'get',
                responseType: 'json'
            })
                .then(function(response) {
                    dispatch(receiveData(response.data))
                })
                .catch(function(response){
                    //
                })
        }
    }

我上面的代码可以工作,但是我现在对下一步做什么感到困惑。我不确定我应该在路由上使用onEnter来触发XHR请求,因为指向产品详情页的链接经过相同的路由,并为列表数据触发相同的XHR。

我的问题是,我是否应该使用onClick处理程序来触发XHR、更新状态(导致组件重新呈现),然后手动推送到新路由,而不是使用Link?简单地重新路由链接是否正确,以及路由是否可能触发其他所有内容?正如我所说,我不想在重新路由时重新加载列表组件。

对于这样的应用程序的方法和架构的任何其他一般性建议都将不胜感激。

共有1个答案

钱睿范
2023-03-14

您应该更倾向于调度组件WillMount()中的loadList操作,并在您的List组件中实现应由组件更新的回调来控制阉羊组件是否应该再次呈现/更新-基于您的状态。

例如:

    shouldComponentUpdate(nextProps, nextState) {
       return this.props.products !== nextProps.products;
    }

检查以下位置的文档https://facebook.github.io/react/docs/react-component.html#shouldcomponentupdate

然后在后端使用“301-Not Modify”标头,如果您的产品列表中没有任何更改,则不总是返回相同的数据。

要加载产品详细信息,您可以在componentWillReceiveProps中调度详细信息加载操作,如下所示:

componentWillReceiveProps(nextProps) {
  if (this.props.params.id !== nextProps.params.id) {
    this.props.dispatch(fetchDetailProduct(nextProps.params.id));
  }
}

这样您就可以检查用户是否单击了不同的产品ID。如果是这样,则会分派加载此详细信息数据的操作。该组件将根据您的还原流使用您的新产品详细信息数据进行更新。

作为一个架构建议,我还建议您为您的操作命名更好的名称,如“PRODUCT/FETCH\u LIST”、“PRODUCT/FETCH\u LIST\u RECEIVED”、“PRODUCT/FETCH\u LIST\u ERROR”。

我还建议使用Immutable。js公司(https://facebook.github.io/immutable-js)为了你的州。由于它为所有对象提供了一些有效的equals()检查,因此识别状态中的更新会容易得多。具有不可变的。js数据结构,您的shouldComponentUpdate将如下所示:

    shouldComponentUpdate(nextProps, nextState) {
       return !this.props.products.equals(nextProps.products);
    }
 类似资料:
  • 问题内容: 我想知道在HTML页面中加载CSS文件的顺序。 我的实际要求是这样的:我的应用程序中有10个以上的CSS文件。 我在每个HTML页面中导入3到4个CSS文件。问题是我在某些CSS文件中定义了重复的类。这意味着我将覆盖CSS文件中的某些CSS类。在某些页面中,它的行为正确。在某些页面中,它的行为不正确。我也为HTML页面中的某些DIV定义了内联样式。我也为那些DIV保留CSS类。 谁能知

  • 本文向大家介绍Asp.NET页面中事件加载的先后顺序详解,包括了Asp.NET页面中事件加载的先后顺序详解的使用技巧和注意事项,需要的朋友参考一下 本文主要给大家介绍了关于Asp.NET页面事件加载先后顺序的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: ASP.NET 母版页和内容页中的事件 我们知道母版页和内容页都可以包含控件的事件处理程序。对于控件而言内容页中的控件在

  • 本文向大家介绍HTML5拖拽事件的顺序是什么?相关面试题,主要包含被问及HTML5拖拽事件的顺序是什么?时的应答技巧和注意事项,需要的朋友参考一下 ondragstart :源对象开始被拖动 ondrag:源对象被拖动过程中 ondragend:源对象被拖动结束 ondragenter:源对象拖动着进入目标对象 ondragover:源对象拖动着悬停在目标对方上方 ondragleave:源对象拖

  • 使用redux和反应路由器,我想访问路由指定的组件以外的组件上的路由参数。 我已经对react-router、redux和react-router-redux进行了如下设置,我想从我的redux存储访问reportId参数。 我已经尝试连接react-redux路由器来存储路由状态,但是我发现除了活动路由的完整路径之外,redux内部没有任何有用的存储。这让我可以选择从redux中的路径解析出re

  • 我的路线如下 我知道(A)处的JMS消费者将在每次轮询时分叉JMS事务,并附加到线程。(B)中的事务处理节点也将在交换到达那里并连接到线程后分叉JPA事务。 请在下面找到我的问题: > < li >能否将两个不同的事务附加到一个线程上(如上所示)? < li >如果是,哪一个应该被停职? < li> 上述路由的提交和回滚顺序应该是什么? 注:我没有从骆驼在行动第二版中找到任何明显的答案,所以请指导

  • 问题内容: 有没有办法在控制台中隐藏消息? 问题答案: 是的,在控制台中打开上下文菜单,然后取消选中。 您仍然可以在“网络”选项卡上检查网络流量。