diff --git a/packages/alpinejs/src/lifecycle.js b/packages/alpinejs/src/lifecycle.js index 639266048..5c5ac4bca 100644 --- a/packages/alpinejs/src/lifecycle.js +++ b/packages/alpinejs/src/lifecycle.js @@ -81,13 +81,18 @@ export function interceptInit(callback) { initInterceptors.push(callback) } export function initTree(el, walker = walk, intercept = () => {}) { deferHandlingDirectives(() => { walker(el, (el, skip) => { - intercept(el, skip) - - initInterceptors.forEach(i => i(el, skip)) - - directives(el, el.attributes).forEach(handle => handle()) - - el._x_ignore && skip() + if (!el._x_isInit) { + intercept(el, skip) + + initInterceptors.forEach(i => i(el, skip)) + directives(el, el.attributes).forEach(handle => handle()) + } + + if (el._x_ignore) { + skip() + } else { + el._x_isInit = true + } }) }) } @@ -96,5 +101,6 @@ export function destroyTree(root) { walk(root, el => { cleanupAttributes(el) cleanupElement(el) + delete el._x_isInit }) } diff --git a/packages/alpinejs/src/mutation.js b/packages/alpinejs/src/mutation.js index e669c5429..dedf1cc9a 100644 --- a/packages/alpinejs/src/mutation.js +++ b/packages/alpinejs/src/mutation.js @@ -196,7 +196,6 @@ function onMutate(mutations) { for (let node of addedNodes) { // If the node was eventually removed as part of one of his // parent mutations, skip it - if (removedNodes.has(node)) continue if (! node.isConnected) continue delete node._x_ignoreSelf diff --git a/tests/cypress/integration/mutation.spec.js b/tests/cypress/integration/mutation.spec.js index 283de6c70..cf4244086 100644 --- a/tests/cypress/integration/mutation.spec.js +++ b/tests/cypress/integration/mutation.spec.js @@ -136,6 +136,36 @@ test('can pause and queue mutations for later resuming/flushing', } ) +test('add and move element are been initialized', + html` +