【问题标题】:How to handle loading redux state of single items to show a loading indicator如何处理单个项目的加载 redux 状态以显示加载指示器
【发布时间】:2019-09-23 09:20:44
【问题描述】:

您如何处理异步状态,例如在 redux 存储中加载部分加载的数据?

假设您有一个带有用户 reducer 的 redux 存储,其中包含每个加载的用户,并且您最初有 10 个完全加载的用户(他们的 id、名称等)+接下来的 10 个未完全加载的用户 id,需要在后面的步骤。

然后通过一个操作,您可以通过按 id 获取来加载第 11 个用户,并且需要显示该请求的加载。

您是否会将所有 20 个用户作为 1 个 javascript 对象/用户存储在一个数组中,其中每个条目都有一个 isLoading 变量并通过 id 从中读取/修改?或者这个用例还有其他方法吗?

最好的,谢谢你

【问题讨论】:

  • 您可以制作一个 Http-interceptor,每次调用您的 Http 请求时都会调用它,一旦被调用,您需要调用加载程序,一旦收到响应,您需要停止它,这样您不需要为每个请求手动处理
  • 默认的做法是让list组件获取包含id的基本用户数据列表,让detail组件通过id获取附加信息。您可以让详细信息组件在每次挂载时获取它,或者您可以首先检查附加信息是否已经可用(通过使用您建议的标志或仅通过检查某个字段是否存在,如果它是必填字段) .加载状态可以保持在细节组件的本地,这取决于它是否在挂载时实际获取数据。
  • @DhavalPatel 好主意,但后台也有很多正在进行的请求,我不想通过显示这些请求的加载指示器来混淆用户
  • @trixn 谢谢,只是为了澄清,你会在反应组件中提出请求吗?我不想这样做,而是在动作创建者中这样做,因为我也可能在另一个组件中使用它

标签: javascript reactjs redux


【解决方案1】:

我为每条记录设置了isPatching 状态。在这种情况下,.isPatching 布尔值被添加到存储中的每条记录,在开始时设置为 true,在结束时设置为 false。按记录状态。

【讨论】:

    【解决方案2】:

    react-redux 示例:

    • 如果我们从数据库中加载数据,那么 over loader 将变为 true,当我们在 componentWillReceiveProps 中获取数据时,我们的加载器将变为 false。

       /**
        * home_container : component for home 
        * it is conected with redux store
        * 
        */
       import React, { Component } from 'react';
        import { connect } from 'react-redux';
        import { getBooks ,clearBook } from '../actions';
        import BookItem from '../widgetsUI/book_item';
    
    
        class HomeContainer extends Component {
            //loader
            state = {
                loading : true
            }
            //getBooks from database
            componentWillMount(){
                this.props.dispatch(getBooks(5,0,'desc'))
            }
    
       //if we receiving new props
        componentWillReceiveProps (nextProps) {
           // console.log(nextProps)
            this.setState({
                loading : false
            })
        } 
            //rendering bookItems
            renderItems = (books) => (
                books.list ? 
                books.list.map(item => (
                    <BookItem {...item} key = { item._id } />
                ))
                : null
            )
            //loadmore button
            loadmore = () => {
                this.setState({
                    loading : true
                })
                const count = this.props.books.list.length;
                this.props.dispatch(getBooks(5,count,'desc',this.props.books.list))
            }
            
            render() {
    
                if(this.state.loading){
                    return <div className="loader"> Loading... </div>
                }
                return(
                    <div>
                    {this.renderItems(this.props.books)}
                    <div className='loadmore'
                        onClick={this.loadmore}
                    >Load More</div>
                </div>
                )
            }
        }
    
        function mapStateToProps(state){
            //console.log(state)
            return {
                books : state.books
            }
    
        }
    
        export default   connect(mapStateToProps)(HomeContainer);

    希望对你有帮助

    【讨论】:

    • 谢谢,但我熟悉使用标志来显示加载状态,我的问题更多是关于加载减速器中单个项目的指示器的最佳实践,比如数组中的用户对象,我可以在其中显示加载每个单个用户条目的指示器
    • npmjs.com/package/react-lazyload 试试这个,您可以构建您的自定义占位符并处理加载。演示twobin.github.io/react-lazyload/examples/#/…
    • 对不起,但我不认为你明白我的意思,我尝试进一步描述:我不关心如何显示加载,而是关于架构选择如何在我的 redux 存储中构建加载标志在“最好的”方式
    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 2018-10-23
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多