不変データとは
不変データとは、一度作成すると変更できないデータを指します。
Immutable Data を使用することで、キャッシュ、ロールバック、データ変更検出などの問題をより簡単に処理できるようになり、開発が簡素化されます。
js 内の不変データ
JavaScript では、ディープ クローンを通じて不変データをシミュレートできます。つまり、データが操作されるたびに、新しいデータがディープ クローン化されます。
ディープクローン
/** * learning-immutable - clone-deep.js * Created by mds on 15/6/6. */ 'use strict'; var cloneDeep = require('lodash.clonedeep'); var data = { id: 'data', author: { name: 'mdemo', github: 'https://github.com/demohi' } }; var data1 = cloneDeep(data); console.log('equal:', data1===data); //false data1.id = 'data1'; data1.author.name = 'demohi'; console.log(data.id);// data console.log(data1.id);// data1 console.log(data.author.name);//mdemo console.log(data1.author.name);//demohi
もちろん、これが非常に遅いことに気づくかもしれません。以下に示すように、確かに非常に遅いです
immutable.js は Facebook によるオープンソース プロジェクトで、主に ハッシュ マップの Try と vector Trys より効率的な方法を提供します。
簡単に言うと、immutable.js は構造共有を通じてパフォーマンスの問題を解決します。まずはビデオを見て immutable.js がどのように動作するかを見てみましょう
set 操作がある場合、immutable.js は親レベルより上の部分のみをクローンし、その他は変更しないままにするため、全員が同じ部分を共有できるため、パフォーマンスが大幅に向上します。
React.js で不変データを使用する必要がある理由
完璧に聞こえますが、問題があります。状態が更新されるときに、データが変更されていない場合は、仮想 dom の差分も実行することになり、無駄が生じます。この状況は実際には非常に一般的です。もちろん、
PureRenderMixin を使用すると、上記の問題のいくつかを解決できると言うかもしれませんが、注意すれば見つかります。以下のヒントを参照してください。
解決策は、immutable.js を使用してこの問題を解決することです。データに変更がある限り、状態が更新されるたびに、PureRenderMixin はデータの変更を即座に判断できるため、パフォーマンスが大幅に向上します。この部分については、公式ドキュメント 要約: PureRenderMixin + immutable.js を使用します
参考