Skip to content

Commit

Permalink
feat: add vnode children patch
Browse files Browse the repository at this point in the history
  • Loading branch information
cuixiaorui committed Jun 26, 2020
1 parent 2da3649 commit 5ed76ba
Show file tree
Hide file tree
Showing 10 changed files with 593 additions and 40 deletions.
62 changes: 38 additions & 24 deletions example/App.js
Original file line number Diff line number Diff line change
@@ -1,37 +1,51 @@
import { h,ref } from "../lib/mini-vue.esm.js";
import { h, ref, reactive } from "../lib/mini-vue.esm.js";
import PatchChildren from "./components/PatchChildren.js"
// import HelloWorld from "./components/HelloWorld.js";
// import { h, ref } from "../../lib/mini-vue.esm.js";

const count = ref(1);
const HelloWorld = {
name: "HelloWorld",
setup() {},
render() {
return h(
"div",
{ tId: "helloWorld" },
`hello world: count: ${count.value}`
);
},
};
// const count = ref(1);
// text_children 类型的 update
// const HelloWorld = {
// name: "HelloWorld",
// setup() {},
// render() {
// return h(
// "div",
// { tId: "helloWorld" },
// `hello world: count: ${count.value}`
// );
// },
// };

// props 的 update
// const HiProps = {
// name:"HiProps",
// setup(){},
// render(){
// return h("div",{id:count.value})
// }
// }

// let hiPropsInfo = reactive({ id: 1, tId: "ahahah" });
// const HiProps = {
// name: "HiProps",
// setup() {},
// render() {
// return h("div", { id: hiPropsInfo.id, tId: hiPropsInfo.tId });
// },
// };




export default {
name: "App",
setup() {},

render() {
return h("div", { tId: 1 }, [
h("p", {}, "你好,我是p"),
h(
"button",
{
onclick: () => {
count.value++;
},
},
"点我啊!"
),
h(HelloWorld),
h("p", {}, "主页"),
h(PatchChildren),
]);
},
};
1 change: 0 additions & 1 deletion example/components/HelloWorld.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { h, ref } from "../../lib/mini-vue.esm.js";
// 这需要实现 proxy

const count = ref(1);
window.count = count;
export default {
name: "HelloWorld",
setup() {},
Expand Down
131 changes: 131 additions & 0 deletions example/components/PatchChildren.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
import { h } from "../../lib/mini-vue.esm.js";
import { ref } from "../../lib/mini-vue.esm.js";

const isChange = ref(false);
// 默认是顺序不变,新旧节点的数量不变,属性不变
// 第一种情况:(从前往后依次对比)
// 属性变了
// const prevChildren = [h("div", { key: "a", id: "old-a" }, "a")];
// const nextChildren = [h("div", { key: "a", id: "new-a" }, "a")];

//第二种情况:
// 新节点的数量增加了一个
// const prevChildren = [h("div", { key: "a", id: "old-a" }, "a")];
// const nextChildren = [
// h("div", { key: "a", id: "new-a" }, "a"),
// h("div", { key: "b" }, "b"),
// ];

// 新节点数量增加两个
// const prevChildren = [h("div", { key: "a", id: "old-a" }, "a")];
// const nextChildren = [
// h("div", { key: "a", id: "new-a" }, "a"),
// h("div", { key: "b" }, "b"),
// h("div", { key: "c" }, "c"),
// ];

// 第三种情况:
// 新节点的数量减少了一个
// const prevChildren = [
// h("div", { key: "a" }, "a"),
// h("div", { key: "b" }, "b"),
// h("div", { key: "c" }, "c"),
// ];

// const nextChildren = [h("div", { key: "a" }, "a"), h("div", { key: "b" }, "b")];

// 新节点的数量减少了两个
// const prevChildren = [
// h("div", { key: "a" }, "a"),
// h("div", { key: "b" }, "b"),
// h("div", { key: "c" }, "c"),
// ];

// const nextChildren = [h("div", { key: "a" }, "a")];

// 第四种情况:(从后往前依次对比)
// a (b)
// (b)
// const prevChildren = [
// h("div", { key: "a" }, "a"),
// h("div", { key: "b", id: "old-id" }, "b"),
// ];
// const nextChildren = [h("div", { key: "b", id: "new-id" }, "b")];

// 第五种情况
// 顺序变了,但是新老节点都存在
// 先只验证节点的 props 是否正常更新
// todo: 还需要移动位置
// a,b
// b,a
// const prevChildren = [
// h("div", { key: "a", id: "old-a" }, "a"),
// h("div", { key: "b", id: "old-b" }, "b"),
// ];
// const nextChildren = [
// h("div", { key: "b", id: "new-b" }, "b"),
// h("div", { key: "a", id: "new-a" }, "a"),
// ];

// 第六种情况
// 顺序变了,老节点在 newChildren 里面不存在
// 还需要处理一下位置的移动
// a,b,c
// b,a
// const prevChildren = [
// h("div", { key: "a", id: "old-a" }, "a"),
// h("div", { key: "b", id: "old-b" }, "b"),
// h("div", { key: "c", id: "old-c" }, "c"),
// ];
// const nextChildren = [
// h("div", { key: "b", id: "new-b" }, "b"),
// h("div", { key: "a", id: "new-a" }, "a"),
// ];

// 第七种情况
// 顺序变了,新节点在 oldChildren 里面不存在
// 需要创建新节点
// 还需要移动元素位置( anchor 有值的情况下 )
// const prevChildren = [
// h("div", { key: "a", id: "old-a" }, "a"),
// h("div", { key: "b", id: "old-b" }, "b"),
// ];
// const nextChildren = [
// h("div", { key: "b", id: "new-b" }, "b"),
// h("div", { key: "a", id: "new-a" }, "a"),
// h("div", { key: "c", id: "new-c" }, "c"),
// ];


// 第八种情况
// 移动元素位置( anchor 没有值的情况下 )
// 要移动的元素是属于最后一个位置
const prevChildren = [
h("div", { key: "a", id: "old-a" }, "a"),
h("div", { key: "b", id: "old-b" }, "b"),
];
const nextChildren = [
h("div", { key: "b", id: "old-b" }, "b"),
h("div", { key: "a", id: "old-a" }, "a"),
];



export default {
name: "PatchChildren",
setup() {},
render() {
return h("div", {}, [
h(
"button",
{
onclick: () => {
isChange.value = !isChange.value;
},
},
"测试子组件之间的 patch 逻辑"
),
h("children", {}, isChange.value === true ? nextChildren : prevChildren),
]);
},
};
Loading

0 comments on commit 5ed76ba

Please sign in to comment.