diff --git a/src/compiler/compile/render_dom/index.ts b/src/compiler/compile/render_dom/index.ts index 9fdaa0cbaa..f1cc3b1443 100644 --- a/src/compiler/compile/render_dom/index.ts +++ b/src/compiler/compile/render_dom/index.ts @@ -94,7 +94,7 @@ export default function dom( const body = []; const not_equal = component.component_options.immutable ? `@not_equal` : `@safe_not_equal`; - let dev_props_check; + let dev_props_check; let inject_state; let capture_state; props.forEach(x => { const variable = component.var_lookup.get(x.name); @@ -151,6 +151,21 @@ export default function dom( }`)} `; } + + capture_state = (uses_props || writable_props.length > 0) ? deindent` + () => { + return { ${component.vars.map(prop => prop.name).join(", ")} }; + } + ` : null; + + inject_state = (uses_props || writable_props.length > 0) ? deindent` + ${$$props} => { + ${uses_props && component.invalidate('$$props', `$$props = @assign(@assign({}, $$props), $$new_props)`)} + ${component.vars.map(prop => deindent` + if ('${prop.name}' in $$props) ${component.invalidate(prop.name, `${prop.name} = ${$$props}.${prop.name}`)}; + `)} + } + ` : null; } // instrument assignments @@ -430,6 +445,10 @@ export default function dom( ${set && `$$self.$set = ${set};`} + ${capture_state && `$$self.$capture_state = ${capture_state};`} + + ${inject_state && `$$self.$inject_state = ${inject_state};`} + ${injected.length && `let ${injected.join(', ')};`} ${reactive_declarations.length > 0 && deindent`