Skip to content

Commit fb27f63

Browse files
committed
fix(jwc-runtime): vnode attrs do not be updated
1 parent 98ce5ed commit fb27f63

File tree

4 files changed

+38
-15
lines changed

4 files changed

+38
-15
lines changed

.vscode/launch.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
{
55
"type": "chrome",
66
"request": "launch",
7-
"name": "127.0.0.1 Debugger",
8-
"url": "http://127.0.0.1:5173",
7+
"name": "针对 localhost 启动 Chrome",
8+
"url": "http://localhost:5173",
99
"webRoot": "${workspaceFolder}"
1010
}
1111
]

packages/jwc-core/src/wc-class.ts

+12-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { createCSSElement, defineProxy, reactiveData, reactiveEvent } from "@jwcjs/reactively";
2-
import { createElement, diff, patch, removeIsNew, VNode } from "@jwcjs/runtime";
1+
import { createCSSElement, defineProxy } from "@jwcjs/reactively";
2+
import { createElement, diff, removeAttrs } from "@jwcjs/runtime";
33
import { COMPONENT_PROP_METADATA_KEY, COMPONENT_STATE_METADATA_KEY } from "./constants/metas.constant";
44
import { JwcElement, PropOptions } from "./types/jwc-element.interface";
55
import { WatcherOptions } from "./types/watcher.interface";
@@ -149,7 +149,8 @@ export class JwcComponent extends HTMLElement implements JwcElement {
149149
const previous = this.$lastRender;
150150
const current = this.render(this.$data);
151151
if (previous) {
152-
diff(removeIsNew(previous), removeIsNew(current), this.shadowRoot);
152+
this.$lastRender = null
153+
this.$lastRender = diff(removeAttrs(previous), removeAttrs(current), this.shadowRoot);
153154
}
154155
}
155156

@@ -174,19 +175,24 @@ export class JwcComponent extends HTMLElement implements JwcElement {
174175
* mounted
175176
*/
176177
const rendered = this.render(this.$data);
177-
this.rootNode = createElement(removeIsNew(rendered) as any);
178+
this.rootNode = createElement(removeAttrs(rendered) as any);
178179
if (this.$options.isMounted) {
179180
this.rootNode && shadowRoot.appendChild(this.rootNode);
180181
}
181182

182-
this.$lastRender = removeIsNew(rendered);
183+
this.$lastRender = removeAttrs(rendered);
184+
}
185+
186+
public disconnectedCallback() {
187+
this.$options.isMounted = false;
188+
this.rootNode && this.rootNode.remove();
183189
}
184190

185191
public attributeChangedCallback(name: string, oldValue: string, newValue: string) {
186192
if (oldValue !== newValue) {
187193
this.props[name] = newValue;
188194
}
189-
diff(this, this.$lastRender);
195+
this.$lastRender = diff(this, this.$lastRender);
190196
}
191197

192198
public render(data: {}): any { }

packages/jwc-runtime/v-dom/diff.ts

+8-6
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ export function diff(oldVNode: any, newVNode: any, host?: Node) {
6363
}
6464
}
6565
}
66+
67+
return removeAttrs(updated, ["isUpdated", "isNew", "isDeleted"]);
6668
}
6769

6870
export function patch(host: Node, vnode: VNode, old: VNode, index: number) {
@@ -310,14 +312,14 @@ function updateElement(oldNode: VNode, newNode: VNode) {
310312
return el;
311313
}
312314

313-
export function removeIsNew(vnode: VNode) {
314-
if (vnode.isNew) {
315-
vnode.isNew = false;
315+
export function removeAttrs(vnode: VNode, attrs: string[] = ["isNew",]) {
316+
for (const attr of attrs) {
317+
vnode[attr] ? vnode[attr] = false : null;
316318
}
317319
if (vnode.children) {
318-
vnode.children.forEach((child: VNode) => {
319-
removeIsNew(child);
320-
});
320+
for (const child of Object.values(vnode.children)) {
321+
removeAttrs(child, attrs);
322+
}
321323
}
322324
return vnode;
323325
}

packages/jwc-starter-vite-ts/src/App.tsx

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { JwcComponent, Component, Prop, Event } from "@jwcjs/core";
1+
import { JwcComponent, Component, Prop } from "@jwcjs/core";
22
import { h } from "@jwcjs/runtime";
33
import styles from './App.css?inline';
44

@@ -25,6 +25,21 @@ export class App extends JwcComponent {
2525
: "light";
2626
}
2727

28+
public override connectedCallback() {
29+
super.connectedCallback();
30+
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", (e) => {
31+
this.updateDiff();
32+
console.log("change");
33+
});
34+
}
35+
36+
public override disconnectedCallback() {
37+
super.disconnectedCallback();
38+
window.matchMedia("(prefers-color-scheme: dark)").removeEventListener("change", (e) => {
39+
this.updateDiff();
40+
});
41+
}
42+
2843
public override render() {
2944
return (
3045
<div>

0 commit comments

Comments
 (0)