【问题标题】:Reusability of redux/react based containers [closed]基于 redux/react 的容器的可重用性
【发布时间】:2019-01-27 00:42:43
【问题描述】:

我没有找到任何文章正确解释了这样做的方法。所以问题如下。想象一下,你有一个连接到 redux store 的 react 容器,并与一个 BE 通信。现在您需要在多个页面和(最坏的情况)列表中重用它。那么你将如何使用动作、选择器和减速器来实现这一点。我现在使用的解决方案是可怕的尖峰,它们将每个容器都紧紧地压在应用程序架构上,我想不出比这更糟糕的了。最好的情况是为每个容器创建新的 redux 实例。这有点工作,但会导致我们遇到其他问题,并让我考虑反应上下文与 redux。如果你有这样的问题,请分享你的想法。你是怎么解决的?

【问题讨论】:

    标签: reactjs redux scalability reusability


    【解决方案1】:

    不确定我是否 100% 理解您的问题,如果我错了,请纠正我。您有一个链接到 redux 状态的容器,并且您想多次重复使用它而不每次都获取数据?

    您可以将该容器包装到另一个容器中。包装器将负责获取数据(例如在挂载时)。这将更新您的 redux 状态,然后您的容器将拥有新数据。一次 BE 调用。

    编辑:

    function getData(id) {
        // Call to backend
        dispatch({ type: 'GET_DATA', payload: { id: id, item: response } })
    }
    
    export default function reducer(state, action) {
        switch (action.type) {
            case 'GET_DATA':
                return {
                    ...state,
                    items: { ...state.items, [action.payload.id]: action.payload.item },
                }
             }
        }
    }
    

    【讨论】:

    • 或多或少是正确的,但说他们有一些用于获取数据的 id。每个实例使用不同的 id。并说我想创建一个包。
    • 所以基本上我想重用相同的reducers、selector和actions来修改不同的状态分支。
    • 不确定你所说的包是什么意思。如果您没有 API 可以在一次调用中获取所有数据(例如返回项目列表),那么您当时就不得不获取它们。通常我会尝试公开一个 API,在那里我可以获得我所有项目的列表(或我需要显示的简短对象),并为更详细的项目提供另一个。
    • 包是指像npm这样的javascript包。
    • 好的,一个容器实例在同一页面上获取 id=1 的数据另一个 id=2 的数据,它们可以使用相同的缩减器、操作和选择器,但我无法使用标准实现redux 工具。
    【解决方案2】:

    如果我正确理解您对@Fleezy 的回复,我想您可能正在寻找类似的东西(简化版)。

    组件

    class Container extends Component {
      ...
      someHandler = ({safeId, params}) => dispatch.someAction({safeId, params})
    
      render() {
        return <p onClick={this.someHandler({safeId, params})}>Model Stuff</p>
      }
    }
    
    export default connect(store => {
      const safeId = this.props.model.id.toString()
    
      [safeId]: store.content[safeId]
    })(Container)
    

    减速器

    const content = (state ={}, action) => {
      const safeId = action.safeId.UpperCase()
    
      switch (action.type) {
       case `SOME_${safeId}_CONTENT`:
         return myContentFunc(state, action)
       default:
        return state
      }
    }
    

    您应该能够通过添加一个 get 传递的 ID 变量来重构您的标准设置来实现您想要做的事情。

    【讨论】:

    • 这几乎是一回事。只是在我的模块中我有更多数据(如 isLoaded、isLoading、lastReceived 等),并且我有一个 data 字段,用于跟踪我的后端数据。最后,我根据 ID 向数组/对象添加数据
    • 是的,这是解决方案,但它远非完美,当我说类似以下内容时,我希望进行设置:“import Container from 'mypackage'; " 然后砰!有用。而且我绝对不想使用根级减速器。
    • 但它肯定会将我们带到全新的复杂程度。所以我可能同意你描述的方式是目前我能想到的唯一可能的方式。
    • @Fleezy,我也是这样做的。 Store 可能会变得相当复杂,但我使用类型、集合和模型存储来保持其井井有条。如果它结构良好,它可以是一个相当复杂情况的非常简单的解决方案。真正的工作发生在我的 api 操作中。
    猜你喜欢
    • 2017-02-09
    • 2018-07-03
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多