|
|
@ -16,6 +16,7 @@ import Binding from './Binding';
|
|
|
|
import EventHandler from './EventHandler';
|
|
|
|
import EventHandler from './EventHandler';
|
|
|
|
import Expression from './shared/Expression';
|
|
|
|
import Expression from './shared/Expression';
|
|
|
|
import { AppendTarget } from '../../interfaces';
|
|
|
|
import { AppendTarget } from '../../interfaces';
|
|
|
|
|
|
|
|
import addToSet from '../../utils/addToSet';
|
|
|
|
|
|
|
|
|
|
|
|
export default class Component extends Node {
|
|
|
|
export default class Component extends Node {
|
|
|
|
type: 'Component';
|
|
|
|
type: 'Component';
|
|
|
@ -161,10 +162,16 @@ export default class Component extends Node {
|
|
|
|
const initialProps = [];
|
|
|
|
const initialProps = [];
|
|
|
|
const changes = [];
|
|
|
|
const changes = [];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const allDependencies = new Set();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.attributes.forEach(attr => {
|
|
|
|
|
|
|
|
addToSet(allDependencies, attr.dependencies);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
this.attributes.forEach(attr => {
|
|
|
|
this.attributes.forEach(attr => {
|
|
|
|
const { name, dependencies } = attr;
|
|
|
|
const { name, dependencies } = attr;
|
|
|
|
|
|
|
|
|
|
|
|
const condition = dependencies.size > 0
|
|
|
|
const condition = dependencies.size > 0 && (dependencies.size !== allDependencies.size)
|
|
|
|
? [...dependencies].map(d => `changed.${d}`).join(' || ')
|
|
|
|
? [...dependencies].map(d => `changed.${d}`).join(' || ')
|
|
|
|
: null;
|
|
|
|
: null;
|
|
|
|
|
|
|
|
|
|
|
@ -181,20 +188,22 @@ export default class Component extends Node {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
block.addVariable(levels);
|
|
|
|
block.builders.init.addBlock(deindent`
|
|
|
|
|
|
|
|
var ${levels} = [
|
|
|
|
statements.push(deindent`
|
|
|
|
|
|
|
|
${levels} = [
|
|
|
|
|
|
|
|
${initialProps.join(',\n')}
|
|
|
|
${initialProps.join(',\n')}
|
|
|
|
];
|
|
|
|
];
|
|
|
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
statements.push(deindent`
|
|
|
|
for (var #i = 0; #i < ${levels}.length; #i += 1) {
|
|
|
|
for (var #i = 0; #i < ${levels}.length; #i += 1) {
|
|
|
|
${name_initial_data} = @assign(${name_initial_data}, ${levels}[#i]);
|
|
|
|
${name_initial_data} = @assign(${name_initial_data}, ${levels}[#i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`);
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const conditions = [...allDependencies].map(dep => `changed.${dep}`).join(' || ');
|
|
|
|
|
|
|
|
|
|
|
|
updates.push(deindent`
|
|
|
|
updates.push(deindent`
|
|
|
|
var ${name_changes} = @getSpreadUpdate(${levels}, [
|
|
|
|
var ${name_changes} = ${allDependencies.size === 1 ? `${conditions}` : `(${conditions})`} && @getSpreadUpdate(${levels}, [
|
|
|
|
${changes.join(',\n')}
|
|
|
|
${changes.join(',\n')}
|
|
|
|
]);
|
|
|
|
]);
|
|
|
|
`);
|
|
|
|
`);
|
|
|
@ -381,6 +390,12 @@ export default class Component extends Node {
|
|
|
|
|
|
|
|
|
|
|
|
const updateMountNode = this.getUpdateMountNode(anchor);
|
|
|
|
const updateMountNode = this.getUpdateMountNode(anchor);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (updates.length) {
|
|
|
|
|
|
|
|
block.builders.update.addBlock(deindent`
|
|
|
|
|
|
|
|
${updates}
|
|
|
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
block.builders.update.addBlock(deindent`
|
|
|
|
block.builders.update.addBlock(deindent`
|
|
|
|
if (${switch_value} !== (${switch_value} = ${snippet})) {
|
|
|
|
if (${switch_value} !== (${switch_value} = ${snippet})) {
|
|
|
|
if (${name}) ${name}.destroy();
|
|
|
|
if (${name}) ${name}.destroy();
|
|
|
@ -408,8 +423,7 @@ export default class Component extends Node {
|
|
|
|
|
|
|
|
|
|
|
|
if (updates.length) {
|
|
|
|
if (updates.length) {
|
|
|
|
block.builders.update.addBlock(deindent`
|
|
|
|
block.builders.update.addBlock(deindent`
|
|
|
|
else {
|
|
|
|
else if (${switch_value}) {
|
|
|
|
${updates}
|
|
|
|
|
|
|
|
${name}._set(${name_changes});
|
|
|
|
${name}._set(${name_changes});
|
|
|
|
${this.bindings.length && `${name_updating} = {};`}
|
|
|
|
${this.bindings.length && `${name_updating} = {};`}
|
|
|
|
}
|
|
|
|
}
|
|
|
|