run bindings in derived

Jack Goodall 2 weeks ago
parent d4417cb245
commit 9d74e2220d

@ -16,15 +16,21 @@ export function init_spread_bindings(spread_expression, { state, visit }) {
? b.literal(source.slice(spread_expression.start, spread_expression.end))
: undefined;
const id = state.scope.generate('$$spread_binding');
const get = b.id(id + '_get');
const set = b.id(id + '_set');
const id = b.id(state.scope.generate('$$spread_binding'));
state.init.push(
b.const(
b.array_pattern([get, set]),
b.call('$.validate_spread_bindings', expression, expression_text)
id,
b.call(
'$.derived',
b.thunk(b.call('$.validate_spread_bindings', expression, expression_text))
)
)
);
const is_server = state.options.generate === 'server';
const binding = is_server ? b.call(id) : b.call('$.get', id);
const get = b.thunk(b.call(b.member(binding, b.literal(0), true)));
const set = b.thunk(b.call(b.member(binding, b.literal(1), true), b.id('$$value')));
return { get, set };
}

@ -0,0 +1,17 @@
import { flushSync } from 'svelte';
import { test } from '../../test';
export default test({
async test({ assert, target, logs }) {
assert.htmlEqual(target.innerHTML, `<input><button>Toggle</button>`);
assert.deepEqual(logs, [false]);
const button = target.querySelector('button');
button?.click();
flushSync();
assert.deepEqual(logs, [false, true]);
}
});

@ -0,0 +1,17 @@
<script>
let state = $state(false);
let value = $state('hello')
function binding(state) {
console.log(state);
return [
() => value,
(v) => value = v
];
}
</script>
<input bind:value={...binding(state)} />
<button onclick={() => (state = !state)}>Toggle</button>
Loading…
Cancel
Save