まずは簡単な 新しいVue({ el: '#app', データ() { 戻る { a: 1、 b: 2, c: 3, d: 4, }; }, 作成された() { コンソールにログ出力します。 this.b = 'aaa'; }, テンプレート: '<div>Hello World{{a}}{{b}}</div>', }); Vueinstance/state.jsでは、各属性をプロキシするためにプロキシが使用されます。 定数キー = Object.keys(データ) 定数プロパティ = vm.$options.props const メソッド = vm.$options.methods i = キーの長さとする (i--) { 定数キー = キー[i] もしprops && hasOwn(props, key) であれば process.env.NODE_ENV !== 'production' && 警告( `データ プロパティ "${key}" はすでにプロパティとして宣言されています。` + `代わりにプロパティのデフォルト値を使用してください。`, 仮想 ) } そうでなければ (!isReserved(key)) { //プロキシオブジェクトのプロパティ proxy(vm, `_data`, key) } } // データを観察する 観察(データ、true /* asRootData */) データ内の各属性をハイジャックするには、defineReactive を使用します。 観察(データ、true /* asRootData */); // 観察する 定数キー = Object.keys(obj); (i = 0 とします; i < keys.length; i++) { Reactive を定義します (obj、キー [i])。 } // リアクティブを定義する Object.defineProperty(obj, キー, { 列挙可能: true、 設定可能: true、 取得: 関数reactiveGetter() { const value = getter ? getter.call(obj): val; // 重要なポイントはここです。後でテンプレートで属性が使用される場合、reactiveGetter関数が実行されます // Depクラスによって収集されます if (Dep.target) { console.log(`${key} プロパティは Dep クラスによって収集されます`) 依存関係 if (childOb) { childOb.dep.depend(); Array.isArray(値)の場合{ 依存配列(値); } } } 戻り値; }, 設定: 関数reactiveSetter(newVal) { const value = getter ? getter.call(obj): val; /* eslint は自己比較を無効にします */ if (newVal === 値 || (newVal !== newVal && 値 !== 値)) { 戻る; } if (セッター) { // 計算されたセット関数は次のとおりです。setter.call(obj, newVal); } それ以外 { val = 新しいVal; } childOb = !shallow && observe(newVal); // プロパティを変更すると、notify を呼び出してビューを非同期的に更新します。dep.notify(); }, }); $mountを実行してビューをマウントします (vm.$options.el)の場合{ vm.$mount(vm.$options.el); } $mount は Vue プロトタイプを呼び出すメソッドです。重要な点は最後の文 mount.call(this, el, hydrating) です。 Vue.prototype.$mount = 関数 ( el?: 文字列 | 要素、 水分補給?: ブール値 ): 成分 { el = el && クエリ(el); const オプション = this.$options; // template/el を解決し、レンダリング関数に変換します /** * レンダリング関数が存在するかどうかを確認しますか?存在しない場合は、テンプレートを解析します。テンプレート* Vue がページをレンダリングする場合、2 つの方法があります: 1. テンプレート、2. レンダリング。最終的には、すべてのテンプレート クラスをレンダリングを使用してレンダリングする必要があります。*/ if (!options.render) { テンプレートを options.template とします。 if (テンプレート) { if (typeof テンプレート === '文字列') { (template.charAt(0) === '#')の場合{ テンプレート = idToTemplate(テンプレート); /* イスタンブールは無視します */ process.env.NODE_ENV !== 'production' && !template) の場合 { 警告( `テンプレート要素が見つからないか空です: ${options.template}`, これ ); } } } それ以外の場合 (template.nodeType) { テンプレート = template.innerHTML; } それ以外 { process.env.NODE_ENV !== 'production' の場合 { warn('無効なテンプレートオプション:' + template, this); } これを返します。 } } そうでなければ (el) { // テンプレートが存在しない場合は、デフォルトの HTML テンプレートを作成します。 template = getOuterHTML(el); } } // Vue.prototype.$mount を書き換え、最後にキャッシュされた mount メソッドを呼び出して $mount のマウントを完了します。 return mount.call(this, el, hydrating); }; ここで、mount は mountComponent(this, el, hydrating) メソッドを呼び出し、mountComponent は _render 関数を実行し、最後に _render は render を呼び出して vnode を生成します。 const { render, _parentVnode } = vm.$options; vnode = render.call(vm._renderProxy、vm.$createElement); 最後の図は、 記事に間違いがありましたらご指摘いただければ、引き続き改善させていただきます。ありがとうございます。ソースコードをデバッグする必要がある場合は、ここをクリックして readme に従ってください。希望の星 これで、Vue データのプロパティを変更してビューを更新する方法に関するこの記事は終わりです。より関連性の高い Vue データ コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: CSS を使用してボックスを水平方向と垂直方向に中央揃えする方法 (8 つの方法)
ファイル サーバーは、企業内で最も一般的に使用されるサーバーの一つであり、主にファイル共有を提供する...
MySQL には以前、クエリ キャッシュ (Query Cache) がありました。8.0 以降では...
nginx.conf設定ファイルは次のとおりです。 ユーザー nginx; ワーカープロセス 1; ...
数日前、バスで仕事に行きました。バスのカードリーダーの実際の使用シーンを実際に見て、カードリーダーの...
前回の記事「Zen Coding: HTML/CSS コードを素早く記述する方法」を公開した後、一部...
1. 内閣府マスターノードを監視することで、他のスレーブノードへの自動フェイルオーバーを実現できます...
参考までに、JSを使用してランダム点呼システムを実装します。具体的な内容は次のとおりです。毎回の授業...
例: PHP バックグラウンド コードを通じて、従業員情報を削除したり、削除した従業員情報を復元した...
vue3 での computed の使い方。vue3 は vue2 のオプション API と互換性が...
新しい CSS 機能を使用する場合、その互換性は常に考慮されます。おそらく、その互換性、どのブラウザ...
この記事では、スクロール可能なポップアップウィンドウ効果を実現するためのVueの具体的なコードを参考...
序文フロントエンド開発では、目的のコンテンツを取得するためにループをトラバースする必要がある状況に頻...
目次1. コンポーネントの登録1.1 グローバル登録1.2 グローバルコンポーネントの登録プロセス1...
目次序文JSON.stringify の 6 つの機能特集1特集2特集3特集4特集5特集6手動で文字...
注記記事表示リストインターフェースを開発する場合、情報の基本的な概要を提供するために記事ヘッダーコン...