深浅にVue.js-V Nodeを出す
4621 ワード
一、何がVNodeですか?
(1)Vue.jsにはVNodeクラスがあり、それを使用して異なるタイプのvnodeのインスタンスを実装でき、異なるタイプのvnodeのインスタンスはそれぞれ異なるタイプのDOM要素を表している.
(2)本当はvnodeは名前だけで、本質的にはJavascriptの中の一つの普通の対象であり、VNode類から実用化された対象である.このJavascriptオブジェクトを使用して、実際のDOM要素を記述すると、DOM要素のすべての属性はVNodeというオブジェクトに対応する属性が存在する.
(3)vnodeは、ノード記述オブジェクトとして理解され、どのように真実なDOMノードを作成すべきかを説明する.例えば、一つの要素ノードの名前を表し、textは一つのテキストノードのテキストを表し、childrenはサブノードなどを表します.
(4)vnodeは真実なDOM要素を表しています.すべての本当のDOMノードはvnodeを使って作成してページに挿入します.(vnode=)DOM=>ビュー)
(5)vnodeとビューは一対一で対応しています.私たちはvnodeをJavascriptオブジェクトバージョンのDOM要素として理解することができます.
(6)ビューをレンダリングするプロセスは、まずvnodeを作成し、その後vnodeを使って本当のDOM要素を生成し、最後にページレンダリングビューを挿入する.
二、VNodeの役割
(1)ビューをレンダリングするたびにvnodeを作成し、実際のDOMを使用してページに挿入するので、前回のレンダリングビューの際に作成されたvnodeをキャッシュして、後でビューを再レンダリングする必要があるたびに、新たに作成されたvnodeと前回キャッシュされたvnodeとを比較して、それらの間の違いを確認します.これらの異なるところを探し出し、これに基づいて真実のDOMを修正する.
(2)Vue.jsは現在状態の探測戦略に中程度の粒度を採用している.状態が変化した場合は、コンポーネントレベルのみに通知し、コンポーネント内で仮想DOMを使用してビューをレンダリングする.
(3)ある状態が変化したら、この状態を使ったコンポーネントだけを通知します.
(4)コンポーネントが使用している多くの状態の中で一つが変化したら、コンポーネント全体を再レンダリングする.
三、Vnodeのタイプ
(1)vnodeのタイプ
注釈ノード
テキストノード
元素ノード
コンポーネントノード
関数コンポーネント
クローンノード
(2)vnodeはJavascriptの中の一つのオブジェクトであり、異なるタイプのvnodeの間は属性が異なるだけで、正確には有効属性が異なる.VNodeクラスを使用してvnodeを作成する場合、パラメータを例にして属性を設定すると、無効な属性はデフォルトでundefinedまたはfalseとして付与されます.vnodeに対して無効な属性はそのまま無視すればいいです.注釈ノード テキストノード クローンノード (1)クローンノードは、新たに作成されたノードとクローンされたノードの属性が一致するように、既存のノードの属性を新たなノードに割り当て、クローン効果を実現する.
(2)作用:静的ノードとスロットノードを最適化する.
(3)静的ノードを例にとると、コンポーネント内のある状態が変化した後、現在のコンポーネントは仮想DOMによってビューを再レンダリングし、静的ノードはそのコンテンツが変更されないので、最初のレンダリングはレンダリング関数を実行してvnodeを取得する必要がある以外に、後続の更新はレンダリング関数を実行してvnodeを再生成する必要がない.したがって、このとき、クローンノードを作成する方法を用いて、vnodeを一つの部分にクローンし、クローンノードを用いてレンダリングする.このようにして、レンダリング関数を再実行して新しい静的ノードのvnodeを生成する必要がなく、ある程度の性能を向上させる.
(5)クローンノードとクローンノードとの間の唯一の違いはisCloed属性であり、クローンノードのisCloedはtrueであり、クローンされた元ノードのisCloedはfalseである.要素ノード (1)要素ノードには通常、以下の4つの有効な属性が存在する.(例えば、ul、p、li、divなど). data:この属性はいくつかのノードのデータを含んでいます.例えば、atrs、class、スタイルなどです. children:現在ノードのサブノードリスト. context:現在のコンポーネントのVue.jsの例です. (2)例
真実の要素ノードコンポーネントノード (1)コンポーネントノードと要素ノードは類似しており、以下の2つの固有の属性がある.componentOptions:コンポーネントノードのオプションパラメータにはpropdata、タグ、チルドレンなどの情報が含まれています. component Instance:コンポーネントの例、つまりVue.jsの例.実際には、Vue.jsでは、各コンポーネントはVue.jsのインスタンスです. (2)例
コンポーネントノード関数式コンポーネント (1)関数式コンポーネントとコンポーネントノードは似ています.2つの固有の属性functional Contectとfunctional Optionsがあります.
(2)通常、関数式コンポーネントのvnodeは次のようです.
(1)vnodeはクラスであり、異なるタイプのvnodeのインスタンスを生成することができ、異なるタイプのvnodeは異なるタイプの真実のDOM要素を表す.
(2)Vue.jsはコンポーネントに仮想DOMを採用してビューを更新していますので、属性が変化するとコンポーネント全体を再レンダリングする操作を行いますが、コンポーネント内はすべてのDOMノードが更新する必要があるわけではないので、vnodeキャッシュを現在新たに生成したvnodeと前回キャッシュしたoldVnodeとを比較します.更新が必要な部分だけDOM操作すると多くの性能が向上します.
(3)vnodeには様々なタイプがありますが、それらは本質的にはすべてVnodeクラスのインスタンスから化されたオブジェクトであり、その唯一の違いは属性が異なるだけです.
(1)Vue.jsにはVNodeクラスがあり、それを使用して異なるタイプのvnodeのインスタンスを実装でき、異なるタイプのvnodeのインスタンスはそれぞれ異なるタイプのDOM要素を表している.
(2)本当はvnodeは名前だけで、本質的にはJavascriptの中の一つの普通の対象であり、VNode類から実用化された対象である.このJavascriptオブジェクトを使用して、実際のDOM要素を記述すると、DOM要素のすべての属性はVNodeというオブジェクトに対応する属性が存在する.
(3)vnodeは、ノード記述オブジェクトとして理解され、どのように真実なDOMノードを作成すべきかを説明する.例えば、一つの要素ノードの名前を表し、textは一つのテキストノードのテキストを表し、childrenはサブノードなどを表します.
(4)vnodeは真実なDOM要素を表しています.すべての本当のDOMノードはvnodeを使って作成してページに挿入します.(vnode=)DOM=>ビュー)
(5)vnodeとビューは一対一で対応しています.私たちはvnodeをJavascriptオブジェクトバージョンのDOM要素として理解することができます.
(6)ビューをレンダリングするプロセスは、まずvnodeを作成し、その後vnodeを使って本当のDOM要素を生成し、最後にページレンダリングビューを挿入する.
二、VNodeの役割
(1)ビューをレンダリングするたびにvnodeを作成し、実際のDOMを使用してページに挿入するので、前回のレンダリングビューの際に作成されたvnodeをキャッシュして、後でビューを再レンダリングする必要があるたびに、新たに作成されたvnodeと前回キャッシュされたvnodeとを比較して、それらの間の違いを確認します.これらの異なるところを探し出し、これに基づいて真実のDOMを修正する.
(2)Vue.jsは現在状態の探測戦略に中程度の粒度を採用している.状態が変化した場合は、コンポーネントレベルのみに通知し、コンポーネント内で仮想DOMを使用してビューをレンダリングする.
(3)ある状態が変化したら、この状態を使ったコンポーネントだけを通知します.
(4)コンポーネントが使用している多くの状態の中で一つが変化したら、コンポーネント全体を再レンダリングする.
三、Vnodeのタイプ
(1)vnodeのタイプ
注釈ノード
テキストノード
元素ノード
コンポーネントノード
関数コンポーネント
クローンノード
(2)vnodeはJavascriptの中の一つのオブジェクトであり、異なるタイプのvnodeの間は属性が異なるだけで、正確には有効属性が異なる.VNodeクラスを使用してvnodeを作成する場合、パラメータを例にして属性を設定すると、無効な属性はデフォルトでundefinedまたはfalseとして付与されます.vnodeに対して無効な属性はそのまま無視すればいいです.
export const createEmptyVNode = text =>{
const node = new VNode();
node.text = text;
node.isComment = true;
return node
}
(1)一つの注釈ノードは二つの有効な属性しかありません.textとisComment、残りの属性は全部デフォルトのundefinedまたはfalseです.//
// vnode :
{
text:" ",
isComment:true
}
export function createTextVNode(val){
return new VNode(undefined,undefined,undefined,String(val))
}
(1)テキストタイプのvnodeが作成された場合、text属性は一つしかありません.// vnode
{
text:"Hello Berwin"
}
(2)作用:静的ノードとスロットノードを最適化する.
(3)静的ノードを例にとると、コンポーネント内のある状態が変化した後、現在のコンポーネントは仮想DOMによってビューを再レンダリングし、静的ノードはそのコンテンツが変更されないので、最初のレンダリングはレンダリング関数を実行してvnodeを取得する必要がある以外に、後続の更新はレンダリング関数を実行してvnodeを再生成する必要がない.したがって、このとき、クローンノードを作成する方法を用いて、vnodeを一つの部分にクローンし、クローンノードを用いてレンダリングする.このようにして、レンダリング関数を再実行して新しい静的ノードのvnodeを生成する必要がなく、ある程度の性能を向上させる.
export function cloneVNode(vnode,deep){
const cloned = new VNode(
vnode.tag,
vnode.data,
vnode.children,
vnode.text,
vnode.elm,
vnode.context,
vnode.componentOptions,
vnode.asyncFactory
)
cloned.ns = vnode.;
cloned.isStatic = vnode.isStatic;
cloned.key = vnode.key;
cloned.isComment = vnode.isComment;
cloned.isCloned = true;
if(deep&&vnode.children){
cloned.chlidren = cloneVNodes(vnode.children);
}
return cloned;
}
(4)既存のノードをクローンする場合は、既存のノードの属性をすべて新しいノードに割り当てるだけでよい.(5)クローンノードとクローンノードとの間の唯一の違いはisCloed属性であり、クローンノードのisCloedはtrueであり、クローンされた元ノードのisCloedはfalseである.
真実の要素ノード
HelloBerwin
対応するvnode{
children:[VNode,VNode],
context:{...},
data:{...},
tag:"p",
....
}
コンポーネントノード
対応するvnodeは以下の通りです.{
componentInstance:{...},
componentOptions:{...},
context:{...},
data:{...},
tag:"vue-component-1-child",
....
}
(2)通常、関数式コンポーネントのvnodeは次のようです.
{
functionalContext:{...},
functionalOptions:{...},
context:{...},
data:{...},
tag:"div",
....
}
四、まとめ(1)vnodeはクラスであり、異なるタイプのvnodeのインスタンスを生成することができ、異なるタイプのvnodeは異なるタイプの真実のDOM要素を表す.
(2)Vue.jsはコンポーネントに仮想DOMを採用してビューを更新していますので、属性が変化するとコンポーネント全体を再レンダリングする操作を行いますが、コンポーネント内はすべてのDOMノードが更新する必要があるわけではないので、vnodeキャッシュを現在新たに生成したvnodeと前回キャッシュしたoldVnodeとを比較します.更新が必要な部分だけDOM操作すると多くの性能が向上します.
(3)vnodeには様々なタイプがありますが、それらは本質的にはすべてVnodeクラスのインスタンスから化されたオブジェクトであり、その唯一の違いは属性が異なるだけです.