【发布时间】:2019-09-26 20:24:30
【问题描述】:
我一直在阅读 Dan Abramov 的文章 react as a rendering ui,看到了“势在必行的逃生舱口”这个词。
我的问题是这是什么?有人可以举一个例子吗?什么时候有用。
【问题讨论】:
标签: javascript reactjs computer-science
我一直在阅读 Dan Abramov 的文章 react as a rendering ui,看到了“势在必行的逃生舱口”这个词。
我的问题是这是什么?有人可以举一个例子吗?什么时候有用。
【问题讨论】:
标签: javascript reactjs computer-science
该术语是指命令式编程和函数式编程的结合。请参阅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,以及何时丢弃缓慢返回的请求。
【讨论】:
Dan Abramov 文章中的术语可能与 React 文档的这一部分有关:https://reactjs.org/docs/design-principles.html#escape-hatches。
简而言之,有些情况下 React 的声明式方法不适用,因此您必须应用命令式解决方案。在 React 中使用 refs 来控制组件,例如对于 DOM 操作,被认为是必要的。
【讨论】: