You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte/src/shared/keyed-each.js

97 lines
2.4 KiB

import { assign } from './utils.js';
export function destroyIteration(iteration, lookup) {
var first = iteration.first
if (first && first.parentNode) {
iteration.u();
}
iteration.d();
lookup[iteration.key] = null;
}
export function outroAndDestroyIteration(iteration, lookup) {
iteration.o(function() {
iteration.u();
iteration.d();
lookup[iteration.key] = null;
});
}
export function updateKeyedEach(component, key, changed, key_prop, dynamic, list, head, lookup, node, has_outro, create_each_block, intro_method, get_context) {
var expected = head;
var keep = {};
var should_remount = {};
for (var i = 0; i < list.length; i += 1) {
var key = list[i][key_prop];
var iteration = lookup[key];
if (dynamic && iteration) iteration.p(changed, get_context(i));
if (expected && (key === expected.key)) {
var first = iteration && iteration.first;
var parentNode = first && first.parentNode;
var next_item = list[i + 1];
var next = next_item && lookup[next_item[key_prop]];
if (!parentNode || (iteration && iteration.next) != next) should_remount[key] = 1;
expected = iteration.next;
} else if (iteration) {
should_remount[key] = 1;
expected = iteration.next;
} else {
// key is being inserted
iteration = lookup[key] = create_each_block(component, key, get_context(i));
iteration.c();
should_remount[key] = 1;
}
lookup[key] = iteration;
keep[iteration.key] = 1;
}
var destroy = has_outro
? outroAndDestroyIteration
: destroyIteration;
iteration = head;
while (iteration) {
if (!keep[iteration.key]) destroy(iteration, lookup);
iteration = iteration.next;
}
var next = null;
var next_iteration = null;
for (i = list.length - 1; i >= 0; i -= 1) {
var data = list[i];
var key = data[key_prop];
iteration = lookup[key];
if (key in should_remount) {
var anchor;
if (has_outro) {
var next_key = next && next.key;
var neighbour = iteration.next;
var anchor_key;
while (neighbour && anchor_key != next_key && !keep[anchor_key]) {
anchor = neighbour && neighbour.first;
neighbour = neighbour.next;
anchor_key = neighbour && neighbour.key;
}
} else {
anchor = next_iteration && next_iteration.first;
}
iteration[intro_method](node, anchor);
}
iteration.next = next_iteration;
if (next_iteration) next_iteration.last = iteration;
next_iteration = iteration;
}
}