代码之家  ›  专栏  ›  技术社区  ›  Augustin Riedinger

redux容器呈现要传递哪些参数的集合?

  •  0
  • Augustin Riedinger  · 技术社区  · 6 年前

    我们正在使用react+redux,效果很好。但有一种情况我永远不知道该用哪种策略。

    当我需要在一个集合上循环时,我可以写:

    1. 传递元素

    代码:

    render() {
      collection.map(element => <ElementItem key={element.id} element={element} />)
    }
    
    1. 通过扩展元素

    代码:

    render() {
      collection.map(element => <ElementItem key={element.id} {...element} />)
    }
    
    1. 通过ID

    代码:

    render() {
      collection.map(element => <ElementItem key={element.id} id={element.id} />)
    }
    

    ElementItem.js 以下内容:

    connect((state, ownProps) => {
      element: state.collection.find(_el => _el.id === ownProps.id)
    })(ElementItem)
    
    1. 一体化文件:

    代码:

    render() {
      collection.map(element => <li key={element.id}><p>{element.name}</p></li>)
    }
    
    • 解决方案4是不可重用的,所以不太有趣。
    • 我不喜欢解决方案2,因为属性淹没在其他属性中
    • 我发现3是最干净的,因为它是一个与较少的依赖和转发道具。最大的折衷是,推出 .find 为每个人 ElementItem

    所以我想这是第一个赢的。但我觉得这不是 红土路 做一些事情,是吗?如果我通过了 element 参数,为什么我不能通过更多?那么我们就失去了隔离的好处 container presentation 组件,不是吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   jhujhul    6 年前

    解决方案1和2非常好,因为在这种情况下 ElementItem 是表示组件,从道具接收数据。

    解决方案3没有意义,因为在集合上循环的组件已经获得了状态的集合部分(或者是因为此组件连接到redux,或者是因为它是从props获得的)。

    在redux文档中,有一个 example 当它们呈现一个todo集合时:它们使用两个表示组件: Todo ,一个todo项,以及 TodoList ,显示待办事项的列表。还有一个容器组件, VisibleTodoList ,它从状态计算可见的todo列表,并使用 任务列表 是的。当您想循环访问集合时,可以使用相同的策略。

    另一点:如果你不想使用 find 为了得到正确的物品,你可以 normalize your state ,因此每个“collection table”都将项存储在一个对象中,并将项的id作为键。这样,您就可以得到这样的正确项目:

    const element = state.collection[elementId];