Merge pull request #2161 from sveltejs/gh-2129

Prevent reactive declaration assignees from being dependencies
pull/2188/head
Rich Harris 6 years ago committed by GitHub
commit c019150112
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1042,15 +1042,17 @@ export default class Component {
} }
if (node.type === 'AssignmentExpression') { if (node.type === 'AssignmentExpression') {
assignees.add(getObject(node.left).name); const { name } = getObject(node.left)
assignees.add(name);
dependencies.delete(name);
} else if (node.type === 'UpdateExpression') { } else if (node.type === 'UpdateExpression') {
assignees.add(getObject(node.argument).name); const { name } = getObject(node.argument);
assignees.add(name);
dependencies.delete(name);
} else if (isReference(node, parent)) { } else if (isReference(node, parent)) {
const object = getObject(node); const { name } = getObject(node);
const { name } = object;
const owner = scope.findOwner(name); const owner = scope.findOwner(name);
if ((!owner || owner === component.instance_scope) && (name[0] === '$' || component.var_lookup.has(name))) { if ((!owner || owner === component.instance_scope) && (name[0] === '$' || component.var_lookup.has(name)) && !assignees.has(name)) {
dependencies.add(name); dependencies.add(name);
} }

@ -56,8 +56,8 @@ function instance($$self, $$props, $$invalidate) {
if ('foo' in $$props) $$invalidate('foo', foo = $$props.foo); if ('foo' in $$props) $$invalidate('foo', foo = $$props.foo);
}; };
$$self.$$.update = ($$dirty = { bar: 1, foo: 1 }) => { $$self.$$.update = ($$dirty = { foo: 1 }) => {
if ($$dirty.bar || $$dirty.foo) { if ($$dirty.foo) {
bar = foo * 2; $$invalidate('bar', bar); bar = foo * 2; $$invalidate('bar', bar);
} }
}; };

@ -22,11 +22,11 @@ function instance($$self, $$props, $$invalidate) {
if ('x' in $$props) $$invalidate('x', x = $$props.x); if ('x' in $$props) $$invalidate('x', x = $$props.x);
}; };
$$self.$$.update = ($$dirty = { b: 1, x: 1, a: 1 }) => { $$self.$$.update = ($$dirty = { x: 1, b: 1 }) => {
if ($$dirty.b || $$dirty.x) { if ($$dirty.x) {
b = x; $$invalidate('b', b); b = x; $$invalidate('b', b);
} }
if ($$dirty.a || $$dirty.b) { if ($$dirty.b) {
a = b; $$invalidate('a', a); a = b; $$invalidate('a', a);
} }
}; };

@ -21,8 +21,8 @@ function instance($$self, $$props, $$invalidate) {
let max; let max;
$$self.$$.update = ($$dirty = { max: 1, Math: 1, a: 1, b: 1 }) => { $$self.$$.update = ($$dirty = { Math: 1, a: 1, b: 1 }) => {
if ($$dirty.max || $$dirty.a || $$dirty.b) { if ($$dirty.a || $$dirty.b) {
max = Math.max(a, b); $$invalidate('max', max); max = Math.max(a, b); $$invalidate('max', max);
} }
}; };

@ -11,11 +11,11 @@ export default {
<p>doubled: 4</p> <p>doubled: 4</p>
`); `);
component.doubled = 6; component.doubled = 3;
assert.equal(component.doubled, 4); assert.equal(component.doubled, 3);
assert.htmlEqual(target.innerHTML, ` assert.htmlEqual(target.innerHTML, `
<p>doubled: 4</p> <p>doubled: 3</p>
`); `);
} }
}; };

@ -0,0 +1,11 @@
export default {
test({ assert, component }) {
assert.deepEqual(component.foo, {});
component.bar = 'hello';
assert.deepEqual(component.foo, { hello: true });
component.bar = 'world';
assert.deepEqual(component.foo, { hello: true, world: true });
component.bar = false;
assert.deepEqual(component.foo, { hello: true, world: true });
}
};

@ -0,0 +1,7 @@
<script>
export let foo = {};
export let bar;
$: if (bar) {
foo[bar] = true;
}
</script>
Loading…
Cancel
Save