fix compound assignment dependencies in reactive statements (#3634)

pull/3666/head
Peter Maatman 5 years ago committed by Conduitry
parent 5e2c524825
commit 02f5efd9e7

@ -1265,10 +1265,16 @@ export default class Component {
}
if (node.type === 'AssignmentExpression') {
extract_identifiers(get_object(node.left)).forEach(node => {
const left = get_object(node.left);
extract_identifiers(left).forEach(node => {
assignee_nodes.add(node);
assignees.add(node.name);
});
if (node.operator !== '=') {
dependencies.add(left.name);
}
} else if (node.type === 'UpdateExpression') {
const identifier = get_object(node.argument);
assignees.add(identifier.name);

@ -0,0 +1,27 @@
export default {
html: `
<button>+1</button>
<p>count: 0</p>
`,
async test({ assert, component, target, window }) {
const click = new window.MouseEvent('click');
const button = target.querySelector('button');
await button.dispatchEvent(click);
assert.equal(component.x, 2);
assert.htmlEqual(target.innerHTML, `
<button>+1</button>
<p>count: 2</p>
`);
await button.dispatchEvent(click);
assert.equal(component.x, 6);
assert.htmlEqual(target.innerHTML, `
<button>+1</button>
<p>count: 6</p>
`);
}
};

@ -0,0 +1,8 @@
<script>
export let x = 0;
$: x *= 2;
</script>
<button on:click='{() => x += 1}'>+1</button>
<p>count: {x}</p>

@ -0,0 +1,29 @@
export default {
html: `
<button>+1</button>
<p>count: 1</p>
`,
async test({ assert, component, target, window }) {
const click = new window.MouseEvent('click');
const button = target.querySelector('button');
assert.equal(component.x, 1);
await button.dispatchEvent(click);
assert.equal(component.x, 3);
assert.htmlEqual(target.innerHTML, `
<button>+1</button>
<p>count: 3</p>
`);
await button.dispatchEvent(click);
assert.equal(component.x, 5);
assert.htmlEqual(target.innerHTML, `
<button>+1</button>
<p>count: 5</p>
`);
}
};

@ -0,0 +1,12 @@
<script>
export let x = 0;
$: x++;
function onClick() {
x += 1;
}
</script>
<button on:click='{() => x += 1}'>+1</button>
<p>count: {x}</p>
Loading…
Cancel
Save