序文: 各 ソース コード内で最終的にライフサイクルを実行する関数はすべて、 関数 callHook (vm: コンポーネント、フック: 文字列) をエクスポートします。 // #7573 ライフサイクルフックを呼び出すときに依存関係コレクションを無効にする プッシュターゲット() const ハンドラ = vm.$options[フック] if (ハンドラ) { (i = 0、j = handlers.length; i < j; i++) の場合 { 試す { ハンドラ[i].call(vm) } キャッチ (e) { handleError(e, vm, `${hook} フック`) } } } (vm._hasHookEvent)の場合{ vm.$emit('フック:' + フック) } ポップターゲット() }
1. beforeCreate & created Vue がインスタンス化されるとき、 Vue.prototype._init = 関数 (オプション?: オブジェクト) { // ... ライフサイクルの初期化(vm) イベントの初期化(vm) レンダリングの初期化(vm) フックを呼び出します(vm、'beforeCreate') initInjections(vm) // データ/プロパティの前にインジェクションを解決する 初期化状態(vm) initProvide(vm) // data/props の後に provide を解決する callHook(vm, '作成済み') // ... }
これら 2 つのフック関数が実行されると、DOM はレンダリングされないため、DOM にアクセスできません。一般的に、コンポーネントがロード時にバックエンドと対話する必要がある場合は、これら 2 つのフック関数で実行できます。 2. マウント前とマウント済み名前が示すように、 エクスポート関数mountComponent( vm: コンポーネント、 el: ?要素、 水分補給?: ブール値 ): 成分 { vm.$el = el // ... callHook(vm, 'beforeMount') コンポーネントを更新します /* イスタンブールは無視します */ process.env.NODE_ENV !== 'production' && config.performance && mark の場合 { 更新コンポーネント = () => { 定数名 = vm._name 定数 id = vm._uid const startTag = `vue-perf-start:${id}` const endTag = `vue-perf-end:${id}` マーク(開始タグ) 定数 vnode = vm._render() マーク(終了タグ) measure(`vue ${name} render`, startTag, endTag) マーク(開始タグ) vm._update(vnode、ハイドレーション) マーク(終了タグ) measure(`vue ${name} patch`, startTag, endTag) } } それ以外 { 更新コンポーネント = () => { vm._update(vm._render(), ハイドレーション) } } // ウォッチャーのコンストラクタ内でこれを vm._watcher に設定します // ウォッチャーの初期パッチは$forceUpdateを呼び出す可能性があるので(例えば、子プロセス内で)、 // コンポーネントのマウントされたフック)、これはvm._watcherが既に定義されていることに依存します 新しいウォッチャー(vm、updateComponent、noop、{ 前に () { (vm._isMounted) の場合 { callHook(vm, 'beforeUpdate') } } }, true /* isRenderWatcher */) 水分補給 = 偽 // 手動でマウントされたインスタンス、自身にマウントされた呼び出し // マウントは、挿入されたフック内のレンダリングによって作成された子コンポーネントに対して呼び出されます (vm.$vnode == null)の場合{ vm._isMounted = true callHook(vm, 'マウント済み') } 戻り値 }
コンポーネントの 関数invokeInsertHook(vnode、キュー、初期値){ // コンポーネントルートノードの挿入フックを遅延し、 // 要素が実際に挿入されます if (isTrue(initial) && isDef(vnode.parent)) { vnode.parent.data.pendingInsert = キュー } それ以外 { (i = 0; i < キューの長さ; ++i) の場合 { キュー[i].data.hook.insert(キュー[i]) } } } この関数は 定数componentVNodeHooks = { // ... 挿入 (vnode: MountedComponentVNode) { const { コンテキスト、コンポーネントインスタンス } = vnode コンポーネントインスタンスがマウントされている場合 コンポーネントインスタンス._isMounted = true callHook(componentInstance, 'マウント済み') } // ... }, } このフック関数では、各子コンポーネントが 3. beforeUpdate と updated名前が示すように、 エクスポート関数mountComponent( vm: コンポーネント、 el: ?要素、 水分補給?: ブール値 ): 成分 { // ... // ウォッチャーのコンストラクタ内でこれを vm._watcher に設定します // ウォッチャーの初期パッチは$forceUpdateを呼び出す可能性があるので(例えば、子プロセス内で)、 // コンポーネントのマウントされたフック)、これはvm._watcherが既に定義されていることに依存します 新しいウォッチャー(vm、updateComponent、noop、{ 前に () { (vm._isMounted) の場合 { callHook(vm, 'beforeUpdate') } } }, true /* isRenderWatcher */) // ... } ここで判断が行われることに注意してください。つまり、このフック関数はコンポーネントが 関数flushSchedulerQueue() { // ... // 更新されたキューを取得する 更新されたフックを呼び出します(更新されたキュー) } 関数callUpdatedHooks(キュー){ i = キューの長さとする (i--) { const ウォッチャー = キュー[i] 定数 vm = ウォッチャー.vm (vm._watcher === ウォッチャー && vm._isMounted) の場合 { callHook(vm, '更新') } } }
前にも述べたように、コンポーネントの エクスポート関数mountComponent( vm: コンポーネント、 el: ?要素、 水分補給?: ブール値 ): 成分 { // ... // これは省略形です let updateComponent = () => { vm._update(vm._render(), ハイドレーション) } 新しいウォッチャー(vm、updateComponent、noop、{ 前に () { (vm._isMounted) の場合 { callHook(vm, 'beforeUpdate') } } }, true /* isRenderWatcher */) // ... } 次に、 デフォルトクラスWatcherをエクスポートします{ // ... コンストラクタ( vm: コンポーネント、 expOrFn: 文字列 | 関数、 cb: 機能、 オプション?: ?オブジェクト、 isRenderWatcher?: ブール値 ){ this.vm = vm if (isRenderWatcher) { vm._watcher = これ } vm._watchers.push(これ) // ... } } 同時に、現在の 4. beforeDestroyとdestroy名前が示すように、 beforeDestroy および Vue.prototype.$destroy = 関数 () { const vm:コンポーネント = this (vm._isBeingDestroyed)の場合{ 戻る } callHook(vm, 'beforeDestroy') vm._isBeingDestroyed = true // 親から自分自身を削除する 定数親 = vm.$parent if (親 && !parent._isBeingDestroyed && !vm.$options.abstract) { 削除(親.$children, vm) } // ティアダウンウォッチャー (vm._watcher)の場合{ vm._watcher.ティアダウン() } i = vm._watchers.length とします。 (i--) { vm._watchers[i].ティアダウン() } // データオブジェクトから参照を削除する // 凍結されたオブジェクトにはオブザーバーがない可能性があります。 (vm._data.__ob__)の場合{ vm._data.__ob__.vmCount-- } // 最後のフックを呼び出します... vm._isDestroyed = 真 // 現在レンダリングされているツリーの破棄フックを呼び出す vm.__patch__(vm._vnode、null) // 火で破壊されたフック callHook(vm, '破棄されました') // すべてのインスタンス リスナーをオフにします。 vm.$オフ() // __vue__ 参照を削除 (vm.$el)の場合{ vm.$el.__vue__ = null } // 循環参照を解除する (#6759) (vm.$vnode) の場合 { vm.$vnode.parent = null } }
$destroy の実行中に、 5. 有効化と無効化activated および 要約: このセクションでは、主に Vue ライフサイクルにおける各フック関数の実行タイミングと順序を紹介します。分析により、 Vue のライフサイクルを理解するためのこの記事はこれで終わりです。Vue のライフサイクルに関するその他のコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: Dockerを使用して完全な開発環境を構築するための詳細なチュートリアル
序文Linux のファイル権限管理はとにかく素晴らしいです。SUID、SGID、SBIT の機能を確...
現代の Web ビジュアル デザインは、初期の情報の積み重ねから、その後のグラフィックスと抽象化、そ...
目次vueルーター1. ルーティングの概念を理解する1.1 ルーティングとは何ですか? 1.2. バ...
序文私たちの日常の開発プロセスでは、ソートが頻繁に使用され、そのような要求がある場合もあります。たと...
1. アップグレードプロセス: sudo apt-get updateパッケージが見つからない、パッ...
● 新しいプロジェクトのセキュリティを確保するためにクラウド データを購入する予定でした。 Alib...
目次1. プロジェクト環境: 2: DNSサーバーの設定i: 前方解析を構成する: ii: 逆解像度...
目次1. 手順2. 修飾語3. .sync 修飾子4. まとめ1. 手順指示とは命令です。文字通りの...
目次一般的なアップロードコンポーネントの開発以下の機能を実装する必要がありますカスタムテンプレートサ...
序文:場合によっては、MySQL に接続されたセッションが異常終了することが多く、エラー ログに「通...
序文この記事では、主にライブラリ内のすべてのテーブルを返すMysql8.0ドライバgetTables...
Vue プロジェクトで mock.js を使用する開発ツールの選択: Vscode 1. コマンドラ...
<br />何の警告もなく、cnBeta で TOM.COM の Web サイトが再設計...
目次1. 理論シリアル化可能繰り返し読み取りコミットされた読み取りコミットされていない読み取り2. ...
この記事では、WeChatアプレットのカスタムタブバーコンポーネントの具体的なコードを参考までに紹介...