理性反应0.8

2020-05-14 05:29:27

PermalLink GitHub是5000多万开发人员的家园,他们一起工作,共同托管和审查代码、管理项目和构建软件。

报名。

V0.8.0是一个巨大的版本,它包括几个突破性的更改、维护修复和文档更新🎉。

useEffect、useLayoutEffect、useMemo、useCallback、useImperativeHandle Now都一直实现到useX7,以提高可用性。

支持Reaction Hooks API。允许编写具有状态和复杂交互的功能组件。

这些组件使用BuckleScript 5.0.0+附带的新PPX。有关更多信息,请阅读文档。

这里没有突破性的变化,但是如果您对迁移某些组件感兴趣,可以提供升级脚本。它将包装现有的ReasonReact组件,就像它们是Hooks组件一样。

DOM道具Crossorigin现在被正确命名为CrossOrigin。这是一个微小的突破性变化,因此版本颠簸(#290)。

突破性的小变化(只有当你有一段时间没有升级的时候)。迁移/升级脚本一如既往地在这里。

ReactEventRe现在已弃用,取而代之的是ReactEvent。它们是相似的,但后者带来了生活质量的极大提高,那就是把我们的老人变成:

也就是说,您现在可以使用->;快速管道(|)。在OCaml语法中),并且我们已经更改了各种ReactEvent模块中的target的定义,以便直接返回一个Js.t对象,而不是Dom.element。同样的情况也适用于其他这样的属性。

最后,bs.send.Pipe已被非正式弃用,因此我们也删除了这些用法。不使用e|>;ReactEventRe.Mouse.PrevenentDefault,而使用e->;ReactEvent.Mouse.PrevenentDefault或ReactEvent.Mouse.PrevenentDefault(E)。考虑到所有因素,bs.send.Pipe是最繁重的BuckleScript特殊批注。如果您的库正在使用它,请考虑也将其删除。谢谢!。

碎片已登陆!<;>;子1子2<;/>;。有关更多信息,请查看碎片上的ReactJS&39;文档。请注意,我们目前不支持:

此外,DOM组件子项扩展<;div>;.foo<;/div>;现在可以工作。不再需要使用ReasonReact.createDomElement后备!

DOM PROPS_TYPE、_OPEN等(参见下面的0.4.2版本说明)被正式删除。使用type_、open_等。

字段订阅已弃用,现在已完全删除。请改用新的订阅帮助器。

stringToElement、nullElement、arrayToElement也一去不复返了。使用ReasonReact.string、null、array。0.4.0中以前的迁移脚本已经解决了这一问题。

ReasonReact.createDomElement更改为ReactDOMRe.createElementVariadi。这与ReactDOMRe.createElement更加一致。两者都由JSX转换使用;后者是DOM元素的子级(如上所述),并且性能开销很小。

DOM组件现在无需修改即可支持aria-*属性:<;div ariaLabel=";foo";/>;。CamelCase ariaStuff将编译成咏叹调。

对于DOM属性,不使用_open、_type、_egin、_end、_in、_to,而使用新的尾部下划线版本以保持一致性:open_、type_等。现在不建议使用以前的前导下划线版本。

现在恢复ReasonReact.Callback模块,并在其上放置一个弃用警告。这样,至少您的第三方依赖项可以进一步编译。

放松wrapJsForReason和wrapReasonForJs类型,这样我们就可以使用bs.Summary进行互操作,而不是使用Js.t对象。

根据我们之前在文档中的警告,ddmount现在返回单位。要触发状态更新,请使用self.send(MyAction)。

真正删除self.duce;使用self.send(不要与Reducer混淆,后者仍然存在)。

Will ReceiveProps已弃用。我们将很快过渡到Reaction 16,并释放绑定到DerveStateFromProps。

此版本需要bs-Platform 2.2.2!如果你的应用程序还没有升级到它,别担心;你仍然可以使用ResonReact 0.3.2。只有两个小变化。

使用新的bs平台Js.Nullable.toOption。使用ReasonReact(此版本的主要目的)时,不再出现弃用警告。

self.duce现在被更改为self.send,具有更简单的语义,可以消除立即调用案例中的混乱。更高的性能和更少的分配!迁移脚本将为您转换大部分代码。

从技术上讲,这是一个突破性的变化,但只是因为删除了一些不受欢迎的东西。这次没有迁移脚本;因为您遇到的几个破坏性更改(如果有)应该已经被类型系统发现并在几秒内修复。

所有文件都是大写的。这遵循了新的社区习语。从技术上讲,内部更改不会影响您对ReasonReact的使用。

更多的DOM道具。每年新增的DOM道具比我们发布的数量还要多。活着真是一段有趣的时光。

Ref现在的类型为Js.nullable(Dom.element),而不是Js.null(Dom.element)。Js.nullable是来自BuckleScript的新社区习语。检查代码库并将state.myRef:=Js.Null.to_opt(TheRef)更改为state.myRef:=Js.Nullable.to_opt(TheRef)。我们还建议您删除所有提到的Js.null、Js.unfinded、Js.Null和Js.Unfinded。可以检查JavaScript null和未定义的Js.Nullable,从而使JS互操作更加健壮。在过去,人们键入某些值(特别是js对象字段),例如NULL,然后忘记它们可以是未定义的。

DOM组件(ReactDOMRe)的OPEN、END和IN属性现在更改为_OPEN、_END和_IN,以避免使用保留关键字。只有当您正在使用这些属性并且使用旧语法时,这才是有害的。

重大更新,但再次没有破坏性更改,并再次使用方便的迁移脚本!=)。

此版本中最大的变化是不推荐使用statefComponent和statefComponentWithRetainedProps。statelessComponent保持不变。

阅读本迁移指南后,使用(或不使用)迁移脚本,如下所示:NodeReasonFile.re:Node node_modules/reason-react/migrate/from02xTo024.js myReasonFile.re。

不再需要ReasonReact.statefulComponent。现在,每个状态更改都通过称为Reducer";(也就是状态机的炒作词)的专用、集中、反应光纤就绪的本地组件机制来控制。

例如,将self.update handleClick(其中handleClick是Fun Self=>;ReasonReact.Update{.self.state,foo:bar})替换为self.duce(FUN_=>;Click)。Click只是您定义的一个变体构造函数。让我们称它为行动吧。

减速器:有趣的操作状态=>;切换操作{|Click=>;ReasonReact。更新{.state,foo:bar}}。

有关操作、减量和新增更新的相关章节在主要文档中。

以前,我们推荐使用ReasonReact.SilentUpdate来处理ReactJS';实例变量模式(例如,将属性附加到组件类本身,如计时器ID、订阅、引用等)。现在我们已经转到使用原因引用单元格(而不是Reaction引用,即可变原因引用)。请参阅更新的实例变量部分。

新的建议还解决了在渲染中指定多个引用的角例错误。

ReasonReact中未来的ReactJS纤程不能很好地处理返回新状态的生命周期事件,也就是:

请返回前者的ReasonReact.NoUpdate(目前不能为后者做太多事情,请返回Will ReceiveProps。保持原样)。如果您确实需要触发状态更改,那么在返回之前使用self.duce(Fun()=>;Bar)(),也就是立即应用Reduce。

我们将在未来使所有生命周期返回单位;这将是一个更改ReasonReact.NoUpdate为空的简单代码。

REACTION/REACTION-dom现在是依赖项,而不是peerDependency。这遵循将绑定库作为实现细节的Reason/BS习惯用法。NPM/Yarn仍然可以正确地删除多个版本的REACTION/REACTION-DOM;不用担心这一点。

我们终于删除了ReactRe。它从0.1.4开始就被弃用了。我们已经在下面的0.1.4部分提供了全面的迁移。

我们已经给了人们一点喘息的空间,在打破变化方面;现在我们重新发布了另一个,这一次是一个小的迁移脚本。安装Reason-Reaction之后,使用节点node_modules/reason-react/oldScriptCarefulMigrateFrom015To020.js myReasonFile.re

我们现在已经将状态转到了Self中,而不是有趣的状态Self=>;.,现在,您有了乐趣{state,Handle}=>;.。整张唱片都是我自己的。你可以随意拆卸,得到你需要的任何东西!

Self现在包含一个新的道具,retainedProps。这是一个新的(非中断的)功能,解决了以前将道具转发到状态的稍微不方便的方式,如旧API的生命周期方法中所描述的那样。现在有一个专门的API为它!文档详细描述了这一点。

不间断更新。与bs-platform>;=1.8.0配合使用效果更好,它附带以下ReasonReact JSX修复:

调整ReactDOMRe';的道具和样式,以包含更准确的DOM和样式属性和样式(#9、#15、#17)。

添加ReactDOMRe.Style.unsafeAddProp以不安全的方式将道具添加到现有样式。确保你知道你在做什么!

修复不同位置的reactRef&39;的类型。Reaction引用实际上总是可以为空的;我们以前只为DOM引用确认了它,现在我们也为自定义(复合)组件引用确认了它。更详细的解释在这里。这在我们的文档的参考部分也有记录。

重大更新!虽然这是100%向后兼容的,所以没有重大的版本跳跃。我们已经根据你们所有了不起的人的反馈修改了整个API,并且我们提供了一个渐进的迁移路径。

安装新的依赖项后,您的现有代码仍然可以工作。那不是很棒吗?你可以递增地把东西转换过来。旧模块将一直保留到下一个或下一个版本。别急!

ReactDOMRe、ReactDOMServerRe和ReactEventRe保持原样。现在不推荐使用ReactRe(但仍然保留),而支持新的实现ReasonReact。

API不再需要模块/函数器(请不要为新的函数组合功能而疯狂!)。

以下定义原封不动地从ReactRe延续到ReasonReact。一个简单的搜索和替换就可以修复所有这些问题:

createElement(如果您还记得,这不是无处不在的ReactJS React.createElement)。它只在逃生舱门的情况下使用。如果你从未用过它:太棒了!

小写jsx<;div>;任何<;/div>;没有更改<;/div>;。uppercase<;foo ref=a key=b bar=baz>;hello再见<;/foo>;用于转换为Foo.createElement ref::a key::b bar::baz[hello,再见]。它现在转换为ReasonReact.element ref::a key::b(Foo.make bar::baz[|hello,再见|])。我们已经提取了ref和key,并专门调用了一个好的措施,现在我们使用array,而不是使用list作为子级。更惯用的ReactJS,list<;->;数组转换搅动。

要使用新的JSX,请将bsconfig.json';的{";Reaction";:{";Reaction-JSX";:true}}更改为{";Reaction";:{";Reaction-JSX";:2}}。虽然您在开始时可能不会这样做,因为这样会更改整个项目中的所有JSX,并且会导致到处都是类型错误。相反,请保持您的旧bsconfig.json不变,对于您想要有选择地转换的JSX,请在文件顶部添加一个[@bs.config{jsx:2}];。一旦您转换了所有内容,请切换到bsconfig.json中的{";act-jsx";:2}并删除每个文件顶部的@bs.config。

或者,您可以直接转到bsconfig.json中的{";react-jsx";:2},并在要使用旧的大写JSX转换的文件顶部放置一个[@bs.config{jsx:1}]。

在开始下面几节之前,请先简单浏览一下文档页面上的新API。

createElement现在称为Foo.make。make在Reason/OCaml中是一个更惯用的术语,也是type的缩写!

ComponentBag的概念现在称为Self。我们认为它会是一个更合适的名字。新的Self不再包含道具、state、setState和instanceVars;在新的ReasonReact中不再需要这些。

替换为新的make(以前为createElement)调用,该调用接受带标签的参数。请参阅本节中的更多内容。

现在如何在更新/处理回调中访问道具?您可以将这些回调定义移到make函数体中。

不再需要了。在ReactJS中,将实例变量附加到组件一直是引入1.可变状态(2.不会触发重新呈现)的一种狡猾方式。现在,将您的值置于状态并在回调&;生命周期中使用ReasonReact.SilentUpdate(不触发重新呈现,但更新状态)取代了整个概念。

不要与您经常使用的ReactJS setState混淆(不过,如果您正在阅读本迁移指南,您可能已经知道了这一点)。这是一个逃生舱口,例如,当您不能从更新器返回选项状态时,因为您希望以强制方式和异步方式设置状态。新的习惯用法是只使用self.update myhandler()。注意update myhandler像以前一样返回一个回调,但是现在您立即应用了该回调。

更新程序和处理程序现在称为更新和处理程序。它们应该是一个容易搜索和替换的工具。

他们接受的回调签名已更改。代替例如更新程序(FUN{props,state,instanceVars}event=>;ome{.state,foo:true}),它现在更新(Fun事件状态Self=>;ReasonReact.Update{.state,foo:true})。新回调的正式简化类型:payload=>;state=>;self=>;update state。

REF现在驻留在state中,如上面ComponentBag.instanceVars中所述。您现在使用update并返回ReasonReact.SilentUpdate{.state,ref:theRef},而不是ComponentBag.Handler+muating instanceVars。在初始状态下,参照和其他参照可能默认为无。

我们最终决定在生命周期方法中去掉组件前缀!ComponentDidMount现在仅称为didMount,依此类推。签名稍有更改;请在新的生命周期事件部分查看它们。

子帮助器&;类型reactJsChildren、listToElement和jsChildrenToReason都从ReasonReact中消失了,因为我们现在使用数组而不是List。

不清楚为什么我们在旧的API中这样调用它。请告诉@_chenglou,他应该在一个严肃的项目上更严肃地命名。新名称为wrapJsForReason。签名没有太多更改;参数现在已标记,并显式接受最后位置的未标记子项。示例:

外部myJSReactClass:ReasonReact。reactClass=";myJSReactClass";[@@bs.。模块];let createElement name::(name:string)age::(age:option int)=?=>;ReactRe.wrapPropsShamelless myJSReactClass{";name";:name,";age";:js。可空.From_opt age};

外部myJSReactClass:ReasonReact。reactClass=";myJSReactClass";[@@bs.。模块];让make name::(name:string)age::(age:option int)=?Child=>;ReasonReact.wrapJsForReason reactClass::myJSReactClass道具::{";name";:name,";age";:js。可以为空。From_opt age}子代;

不要忘记,一旦这些转换完成,这些组件的调用站点将需要使用上面描述的新JSX转换。否则,它们将生成类型错误。

现在称为wrapReasonForJs。为该互操作提供服务的文件级include已经不存在了;它曾经魔术般地导出支持组件comp以供JS使用。现在,您必须通过新的wrapReasonForJs手动导出comp。上一个示例的续篇:

let component=.;let make.;let comp=ReasonReact.wrapReasonForJs::Component(Fun jsProps=>;make name::jsProps##name age::?(js.。可空.to_opt jsProps##age)[||]);

该函数接受带标签的Reason组件,以及一个在给定js属性的情况下要求您在传入正确转换的参数的同时调用make的函数。

DOM引用现在被类型化为Js.null Dom.element,而不仅仅是Dom.element(https://github.com/reasonml/reason-react/commit/6f2a75b).。简单的迁移:https://github.com/reasonml-community/reason-react-example/commit/b44587a