Skip to content

*ngForのtrackByについて #12

Answered by lacolaco
lacolaco asked this question in Questions
Discussion options

You must be logged in to vote

Posted by lacolaco on 2020-01-29T07:01:33.776Z

indexでtrackByした場合、たとえば

items = [{key: "foo"}, {key: "bar"}, {key: "baz"}]

という配列があったとき、それぞれをトラッキングするキーが、 [0, 1, 2] となります。

この配列がたとえば次のように変化したとき、問題があります。

items = [{key: "foo"}, {key: "bar"}, {key: "boo"}, {key: "baz"}]

この配列はトラッキングするキーは [0, 1, 2, 3] になります。
このとき、trackByの結果が3というのは前回存在しなかったものなので、 {key: "baz"}] は新たに追加された要素とみなされます。4つの要素に対応するDOMレンダリングは、[更新、更新、更新、追加] となります。
これでよいならいいのですが、 :enter など使ったアニメーションが絡むと本当に追加されたのは {key: "boo"} だと思われるので、不都合があります。

trackByをitem.key を返すようにしておくと、4つの要素に対応するDOMレンダリングは、[更新、更新、追加、更新] となります。

trackByがitem を返すと、オブジェクトの厳密比較で判断するようになります。配列の変更がmutableなら、これでも[更新、更新、追加、更新]となるでしょう

Replies: 3 comments

Comment options

lacolaco
Jan 3, 2023
Maintainer Author

You must be logged in to vote
0 replies
Answer selected by lacolaco
Comment options

lacolaco
Jan 3, 2023
Maintainer Author

You must be logged in to vote
0 replies
Comment options

lacolaco
Jan 3, 2023
Maintainer Author

You must be logged in to vote
0 replies
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
archive 旧フォーラムのアーカイブから転記したスレッドです
1 participant