【问题标题】:Why this doesn't work with recompose and ramda?为什么这不适用于 recompose 和 ramda?
【发布时间】:2019-02-10 00:34:52
【问题描述】:

在我的 hoc 中,我有这个条件;

   branch(R.propSatisfies(R.isEmpty, "repos"), renderComponent(Loader)),
// branch(R.isEmpty("repos"), renderComponent(Loader)),

有什么区别,为什么第二个给我一个错误? test is not a function

同样的结果:

branch(R.isEmpty(R.props("repos")), renderComponent(Loader)),

【问题讨论】:

    标签: reactjs ramda.js recompose


    【解决方案1】:

    R. IsEmpty 是一元函数,它报告一个值是否是其类型的空值(例如空字符串、空对象或空数组。)。当你用"repos" 调用它时,你会得到false,因为"repos" 不是空字符串。大概您调用的branch 函数需要一个谓词函数作为第一个参数,并且当您发送此布尔值时它会失败。同样,由于R. props(您可能是说R.prop BTW,但同样的问题也适用)是一个二元函数,R.props("repos") 返回一个非空函数,所以isEmpty 返回 false。

    另一方面,R.propSatisfies 是一个接受谓词函数、属性名称和对象的三元函数。当你用isEmpty"repos" 调用它时,你会得到一个等待对象的函数。这会传递给branch,一切都很好。

    您不喜欢propSatisfies 版本有什么原因吗?

    【讨论】:

    • 感谢您的解释。不,我只是好奇:)
    【解决方案2】:

    这是因为R.propSatisfiesR.isEmpty 的方法签名不同。

    对于您的第一种方法:

    branch(R.propSatisfies(R.isEmpty, "repos"), renderComponent(Loader))
    

    R.propSatisfies 函数正在评估输入对象(即从renderComponent(Loader) 返回的对象)的属性 ("repos") 上的函数 (R.isEmpty)。

    对于您的第二种方法:

    // branch(R.isEmpty("repos"), renderComponent(Loader)),
    

    您在这里所做的是直接调用R.isEmptyR.isEmpty 方法需要一个数组,如果提供的数组为空,则返回 true。 R.isEmpty 无法确定对象中的属性(即“repos”)是否为空。为了更容易想象这里发生了什么,请考虑以下几点:

    // Your second approach:
    branch(R.isEmpty("repos"), renderComponent(Loader))
    
    // ...which when expanded, is equivalent to this. You can now see it 
    // shows incorrect usage of R.isEmpty
    branch(component => R.isEmpty("repos")(component), renderComponent(Loader))
    

    希望这能提供一些澄清 - 有关 R.isEmptysee this link 的更多信息

    【讨论】:

    • 不知何故,当我发布我的信息时,我没有看到这个。这就是我在手机上做 SO 的结果。 @karolis2017:我要删除我重复的答案。我建议您将此标记为正确的版本。
    • (我无法删除已接受的答案。但如果您选择这个,我稍后会尝试这样做。)
    • 嗨@ScottSauyet - 没问题(是的,SO + 移动不是最简单的组合;-))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2012-06-23
    • 2019-02-09
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多