From 2bb702f8e72931c0c3e6d769784021b785da80d0 Mon Sep 17 00:00:00 2001 From: Alexandre Lepretre Date: Wed, 27 Dec 2023 16:42:39 -0500 Subject: [PATCH 1/5] fix: already init component --- packages/alpinejs/src/lifecycle.js | 3 +++ packages/alpinejs/src/mutation.js | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/alpinejs/src/lifecycle.js b/packages/alpinejs/src/lifecycle.js index 81c1226d7..4b3f797c0 100644 --- a/packages/alpinejs/src/lifecycle.js +++ b/packages/alpinejs/src/lifecycle.js @@ -82,6 +82,9 @@ export function interceptInit(callback) { initInterceptors.push(callback) } export function initTree(el, walker = walk, intercept = () => {}) { deferHandlingDirectives(() => { walker(el, (el, skip) => { + if (el._x_isInit) return; + el._x_isInit = true + intercept(el, skip) initInterceptors.forEach(i => i(el, skip)) diff --git a/packages/alpinejs/src/mutation.js b/packages/alpinejs/src/mutation.js index 72905ec8b..29e396784 100644 --- a/packages/alpinejs/src/mutation.js +++ b/packages/alpinejs/src/mutation.js @@ -194,10 +194,6 @@ function onMutate(mutations) { node._x_ignore = true }) for (let node of addedNodes) { - // If an element gets moved on a page, it's registered - // as both an "add" and "remove", so we want to skip those. - if (removedNodes.includes(node)) continue - // If the node was eventually removed as part of one of his // parent mutations, skip it if (! node.isConnected) continue From 83456d3c7c2c4f9b13652836e75112eb65487cf1 Mon Sep 17 00:00:00 2001 From: Alexandre Lepretre Date: Wed, 10 Jan 2024 17:18:36 -0500 Subject: [PATCH 2/5] Revert to previous stage The only way to apply this on the node is to execute it on the mutation. Otherwise, we have to rewrite a big part of the lifecycle system. --- packages/alpinejs/src/lifecycle.js | 3 --- packages/alpinejs/src/mutation.js | 5 +++++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/alpinejs/src/lifecycle.js b/packages/alpinejs/src/lifecycle.js index 4b3f797c0..81c1226d7 100644 --- a/packages/alpinejs/src/lifecycle.js +++ b/packages/alpinejs/src/lifecycle.js @@ -82,9 +82,6 @@ export function interceptInit(callback) { initInterceptors.push(callback) } export function initTree(el, walker = walk, intercept = () => {}) { deferHandlingDirectives(() => { walker(el, (el, skip) => { - if (el._x_isInit) return; - el._x_isInit = true - intercept(el, skip) initInterceptors.forEach(i => i(el, skip)) diff --git a/packages/alpinejs/src/mutation.js b/packages/alpinejs/src/mutation.js index 29e396784..22c3d9291 100644 --- a/packages/alpinejs/src/mutation.js +++ b/packages/alpinejs/src/mutation.js @@ -194,10 +194,15 @@ function onMutate(mutations) { node._x_ignore = true }) for (let node of addedNodes) { + // If the node is already init, it means it's a move operation + if (node._x_isInit) continue + // If the node was eventually removed as part of one of his // parent mutations, skip it if (! node.isConnected) continue + node._x_isInit = true + delete node._x_ignoreSelf delete node._x_ignore onElAddeds.forEach(i => i(node)) From 622d2e2d6b08dfdd8166f8d5b57a82a5a5add23e Mon Sep 17 00:00:00 2001 From: Alexandre Lepretre Date: Fri, 19 Jan 2024 13:31:19 -0500 Subject: [PATCH 3/5] Add _x_isInit in initTree walker --- packages/alpinejs/src/lifecycle.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/alpinejs/src/lifecycle.js b/packages/alpinejs/src/lifecycle.js index 81c1226d7..3b69e8d8e 100644 --- a/packages/alpinejs/src/lifecycle.js +++ b/packages/alpinejs/src/lifecycle.js @@ -88,6 +88,7 @@ export function initTree(el, walker = walk, intercept = () => {}) { directives(el, el.attributes).forEach(handle => handle()) + el._x_isInit = true el._x_ignore && skip() }) }) From 9cfc4f7cb394ba3342ac25d91878db7d35e7bbc9 Mon Sep 17 00:00:00 2001 From: Alexandre Lepretre Date: Fri, 19 Jan 2024 14:03:16 -0500 Subject: [PATCH 4/5] Update initTree condition for x init --- packages/alpinejs/src/lifecycle.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/alpinejs/src/lifecycle.js b/packages/alpinejs/src/lifecycle.js index 3b69e8d8e..c5c24bfd4 100644 --- a/packages/alpinejs/src/lifecycle.js +++ b/packages/alpinejs/src/lifecycle.js @@ -88,8 +88,11 @@ export function initTree(el, walker = walk, intercept = () => {}) { directives(el, el.attributes).forEach(handle => handle()) - el._x_isInit = true - el._x_ignore && skip() + if (el._x_ignore) { + skip() + } else { + el._x_isInit = true + } }) }) } From c68aba00001d2a5df8c3b632a79ac0bf90fcedc0 Mon Sep 17 00:00:00 2001 From: Alexandre Lepretre Date: Fri, 19 Jan 2024 15:14:46 -0500 Subject: [PATCH 5/5] move everything to lifecycle --- packages/alpinejs/src/lifecycle.js | 14 ++++++++------ packages/alpinejs/src/mutation.js | 5 ----- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/alpinejs/src/lifecycle.js b/packages/alpinejs/src/lifecycle.js index c5c24bfd4..7511f8275 100644 --- a/packages/alpinejs/src/lifecycle.js +++ b/packages/alpinejs/src/lifecycle.js @@ -82,16 +82,17 @@ export function interceptInit(callback) { initInterceptors.push(callback) } export function initTree(el, walker = walk, intercept = () => {}) { deferHandlingDirectives(() => { walker(el, (el, skip) => { - intercept(el, skip) + if (!el._x_isInit) { + intercept(el, skip) - initInterceptors.forEach(i => i(el, skip)) - - directives(el, el.attributes).forEach(handle => handle()) + initInterceptors.forEach(i => i(el, skip)) + directives(el, el.attributes).forEach(handle => handle()) + } if (el._x_ignore) { - skip() + skip() } else { - el._x_isInit = true + el._x_isInit = true } }) }) @@ -101,5 +102,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 22c3d9291..29e396784 100644 --- a/packages/alpinejs/src/mutation.js +++ b/packages/alpinejs/src/mutation.js @@ -194,15 +194,10 @@ function onMutate(mutations) { node._x_ignore = true }) for (let node of addedNodes) { - // If the node is already init, it means it's a move operation - if (node._x_isInit) continue - // If the node was eventually removed as part of one of his // parent mutations, skip it if (! node.isConnected) continue - node._x_isInit = true - delete node._x_ignoreSelf delete node._x_ignore onElAddeds.forEach(i => i(node))