react.js v0.13 RC – unmount済みComponentでsetStateまたはforceUpdate

このエントリーをはてなブックマークに追加

setState and forceUpdate on an unmounted component now warns instead of throwing. That avoids a possible race condition with Promises.

アンマウントされたコンポーネントにてsetStateあるいはforceUpdateが呼ばれてしまった場合の挙動がreact.js v0.13rcから変わりました。今までは「例外」がスローされていたのですが、v0.13rc以降からはWarningに留まります。Promiseなどの遅延実行とのレースコンディションを避ける為に歩み寄っていただけたのかもしれません。

事の発端はこのIssueからで、やはりAJAXなリクエストを発行してから、返事が返ってくるまでの間にコンポーネントがアンマウントされてしまうと例外でアボンしてしまうのどうにかしてくださいってことだったみたいですね。

以下のJSFiddleで従来の挙動は確認可能です。(例外はデバッガで確認可能)JSFiddleの挙動としては、Helloコンポーネントをマウントしてから2秒後にアンマウントさせています。そしてさらにその1秒後にHelloコンポーネント内でsetStateを呼び出しています。

# react.js < v0.13rc
Uncaught Error: Invariant Violation: replaceState(...): Can only update a mounted or mounting component.

# v0.13rc <= react.js
Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op.

 

Written on March 1, 2015
このエントリーをはてなブックマークに追加