【问题标题】:What is an imperative escape hatch?什么是必要的逃生舱口?
【发布时间】:2019-09-26 20:24:30
【问题描述】:

我一直在阅读 Dan Abramov 的文章 react as a rendering ui,看到了“势在必行的逃生舱口”这个词。

我的问题是这是什么?有人可以举一个例子吗?什么时候有用。

【问题讨论】:

    标签: javascript reactjs computer-science


    【解决方案1】:

    该术语是指命令式编程和函数式编程的结合。请参阅What is difference between functional and imperative programming languages? 以获得一些好的答案。

    使用纯函数式方法实现某些解决方案可能很困难,但如果您主要使用函数式编程和一些命令式编程元素,则可以接近。那些不是纯粹功能性的元素在链接的文章中被称为“势在必行的逃生舱口”。

    在纯函数式编程中,方法不会修改系统的状态,并且在给定相同输入时它们总是返回相同的输出。采用“Thomas”之类的名称并始终返回“Hello Thomas”的函数符合该描述。采用“Thomas”之类的名称、对用户进行地理定位并返回“Howdy Thomas”或“G'day Thomas”之类的区域问候语的函数不符合该描述。

    可以重写第二个函数以接受两个参数,一个名称和一个位置,然后始终根据输入返回相同的结果,从而使其符合函数范式。现在假设问候语基于日期、月份、星期几、一天中的时间、地区和性别。在函数式编程中,您需要将该状态打包成一些数据结构,然后传递给函数。实际上,调用 getGreeting('Thomas', { date: 5, month: 'Jan', dayOfWeek: 'Monday', etc. }) 而不是 getGreeting('Thomas') 并依赖于返回的系统状态其他函数或在全局变量中访问。

    一个更复杂的例子是调用一个需要不同时间来完成的异步子例程。假设每 2 秒获取一次股票价格,需要 1 到 5 秒才能完成。任务完成后,仅当这是最近发送的数据而不是最近接收的数据时才应更新 UI。在调用该方法时,您不知道 UI 是否会根据下一个股票价格请求在此请求返回之前进行更新,因此对于纯函数式编程来说这将是棘手的。不过,您可以使用一些必要的逃生舱口。如果您将最近呈现的请求发送的时间存储在全局变量中,您可以轻松决定何时使用返回的股票价格来更新 UI,以及何时丢弃缓慢返回的请求。

    【讨论】:

      【解决方案2】:

      Dan Abramov 文章中的术语可能与 React 文档的这一部分有关:https://reactjs.org/docs/design-principles.html#escape-hatches

      简而言之,有些情况下 React 的声明式方法不适用,因此您必须应用命令式解决方案。在 React 中使用 refs 来控制组件,例如对于 DOM 操作,被认为是必要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多