Redux - 使用getState不优雅还是低效?

时间:2018-02-07 23:56:28

标签: javascript reactjs redux react-redux

假设我在全球商店中有很多实体

  • 苹果
  • 商店
  • 果汁

如果我想使用函数getAppleJuicePrice,我可以用2-3种方式完成

  1. 通过参数

    function getAppleJuicePrice(apples, juices) {
        return apples * juices; // Some computing
    }
    
  2. 通过getState,没有参数

    function getAppleJuicePrice() {
        return (dispatch, getState) => {
            const {apples, juices} = getState();
    
            return apples * juices; // Some computing
        }
    }
    
  3. 通过getState和参数

    function getAppleJuicePrice(applesParam, juicesParam){
        return (dispatch, getState) => {
            const apples = applesParam || getState().apples;
            const juices = juicesParam || getState().juices;
    
            return apples * juices; // Some computing
        }
    }
    
  4. *如果是2,3,我需要发送函数

    你能否告诉我你的建议

    A)功能1,2,3 - 以这种方式可以吗?或者其中一些更好?

    B)架构(我的意思是我们在全局商店中有很多实体,所以我们甚至可以创建依赖它们的函数)

1 个答案:

答案 0 :(得分:0)

我强烈反对例如#1。

此功能纯粹,具有描述性,不依赖于外部知识。假设您已经可以访问状态,那么几乎总是更好地导出您所追求的值而不是直接请求状态。

如果那是不可能的,那么将数据检索分解为第二个函数,然后将值传递给第一个函数。这样你就可以清楚地分离关注点,你的方法很容易理解,你不依赖于副作用(状态值的存在),这两种方法都应该很容易测试。

天啊,你可以再进一步重构功能1,作为比较/组合无论的价格的通用实用工具,而不仅仅是苹果和果汁。

const stateObject = getState() // At top of whatever scope

// Generic, no side-effects
function processPrice (x, y) {
  return x * y; // Whatever processing
}

// Specific, injected dependency on state
function getAppleJuicePrice (state) {
  const { apples, juice } = state;
  return processPrice(apples, juice);
}

// Explicit value assignment
const appleJuicePrice = getAppleJuicePrice(stateObject)

快速评论商店架构:始终致力于尽可能保持简单,扁平和数据相关。为了方便计算价值,避免危及商店的数据结构。你可以在本地(而且很容易)得到任何你应该这样做的东西。商店不是复杂价值突变的地方。

(* preemptive 这不是一个严格的规则,只是一个指南