みんなAPIって知ってますか?この記事では主に Vue 公式ドキュメントのグローバル API について詳しく紹介しています。編集者が非常に優れていると考えたので、参考として共有します。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。
Vue.extend
設定項目データは関数である必要があります。そうでない場合、設定は無効です。データ結合ルール (「Vue 公式ドキュメント - グローバル構成」を参照) のソース コードは次のとおりです:
関数型以外のデータを渡します (上の図のデータ構成は {a:1} です) )、オプションをマージした後、データが関数型でない場合、開発バージョンは警告を発行し、その後、parentVal を直接返します。これは、extend によって渡されたデータ オプションが無視されることを意味します。
Vue をインスタンス化するときに、データがオブジェクトになる可能性があることはわかっています。ここでのマージ ルールは普遍的なものではないでしょうか?上記の if(!vm) の判定があることに注意してください。vm はインスタンス化時に値を持つため、Vue.extend とは異なります。実際、次のコメントでも説明されています (Vue.extend のマージでは、両方とも関数である必要があります)。 ) 、これが、公式ドキュメントでデータが特殊なケースであると記載されている理由です。
なお、公式ドキュメントで「サブクラス」と記載されているのは、Vue.extend が Vue を「継承」した関数を返すためであり、ソースコードの構造は次のとおりです。
Vue を使用するので、当然データ駆動型で考える必要があります。いわゆるデータ駆動型とは、DOM 上のすべての操作を Vue のさまざまな命令を使用して完了することを意味します。データを dom に「バインド」する命令により、DOM の更新が可能になるだけでなく、より便利になります。
ブラウザが Promise をサポートしている場合、または Promise ライブラリを使用している場合 (ただし、ソース コード内の判断は typeof Promise !== 'unknown' であるため、外部に公開されるライブラリは Promise と呼ばれる必要があります)、nextTick は Promise オブジェクトを返します。
Vue.extend = function (extendOptions) { //*** var Super = this; var SuperId = Super.cid; //*** var Sub = function VueComponent(options) { this._init(options); }; Sub.prototype = Object.create(Super.prototype); Sub.prototype.constructor = Sub; //*** return Sub };
nextTick を実行するための Vue のコールバックは、呼び出しメソッド cb.call(ctx) を使用します。ctx は現在の Vue インスタンスなので、これを直接使用してコールバック内のインスタンス構成を呼び出すことができます。
nextTick は、単に実行のために最後にコールバックを配置することとして理解できます。Promise と MutationObserver が現在ソース コードでサポートされていない場合、setTimeout がコードの実行を遅らせる一般的な方法ではありません。
Vue.nextTick().then(() => { // do sth })
実際に見てみましょう:
if (typeof Promise !== 'undefined' && isNative(Promise)) { } else if (typeof MutationObserver !== 'undefined' && ( isNative(MutationObserver) || // PhantomJS and iOS 7.x MutationObserver.toString() === '[object MutationObserverConstructor]' )) { } else { // fallback to setTimeout /* istanbul ignore next */ timerFunc = function () { setTimeout(nextTickHandler, 0); }; }
少し混乱するかもしれませんが、なぜ beforeChange は 2 ではなく 1 を出力するのでしょうか。 this .a=2 の背後でトリガーされる dom update も nextTick を使用します。上記のコードの実際の実行順序は、beforeChange>update dom>afterChange です。
Vue.set
Vue.set( target, key, value )、target は Vue インスタンスまたは Vue インスタンスのルート データ オブジェクトであってはなりません。これは、ソース コードで次の判断が行われるためです:
<p id="app"> <p ref="dom">{{a}}</p> </p> new Vue({ el: '#app', data: { a: 1 }, mounted: function name(params) { console.log('start'); this.$nextTick(function () { console.log('beforeChange', this.$refs.dom.textContent) }) this.a = 2; console.log('change'); this.$nextTick(function () { console.log('afterChange', this.$refs.dom.textContent) }) console.log('end'); } }) // 控制台依次打印 // start // change // end // beforeChange 1 // afterChange 2target ._isVue は Vue インスタンスへの属性の追加を防ぎ、 ob && ob.vmCount は Vue インスタンスのルート データ オブジェクトへの属性の追加を防ぎます。
Vue.delete
Vue が削除操作を検出できる場合、この API は表示されません。 $data 属性を削除するために delete を使用する必要がある場合は、Vue.delete を使用してください。そうしないと、dom 更新がトリガーされません。
Vue.set と同様に、Vue.delete(target, key) のターゲットは Vue インスタンスまたは Vue インスタンスのルート データ オブジェクトであってはなりません。ソースコード上のブロック方法はVue.setと同じです。
バージョン 2.2.0 以降では、ターゲットが配列の場合、キーは配列の添字です。 Vue.delete は実際には splice を使用して配列を削除するため、delete を使用して配列を削除することはできますが、位置はまだ存在しており、真の削除とはみなされません。
var ob = (target).__ob__; if (target._isVue || (ob && ob.vmCount)) { "development" !== 'production' && warn( 'Avoid adding reactive properties to a Vue instance or its root $data ' + 'at runtime - declare it upfront in the data option.' ); return val }
Vue.use
Vue.use ソースコードは比較的シンプルなので全文掲載可能です。
var a = [1, 2, 3]; delete a[0]; console.log(a); // [undefined, 2, 3]インストールされたプラグインは、installedPlugins に配置されます。プラグインをインストールする前に、installedPlugins.indexOf(plugin) を使用して、そのプラグインが以前にインストールされているかどうかを確認し、同じプラグインがインストールされることを防ぎます。複数回登録されることはありません。
プラグインのタイプはオブジェクトであり、プラグインをインストールするには install 属性を指定する必要があります (typeof plugin.install === 'function')。また、プラグインの実行には plugin.install.apply が使用されます。 (plugin, args); なので、これはオブジェクト属性の他の部分にアクセスします。ここでの引数は、Vue (args.unshift(this);) と Vue.use (toArray(arguments, 1), 1 は argument[1] からインターセプトすることを意味します) によって渡されるプラグイン以外のパラメーターです。
Vue.use = function (plugin) { var installedPlugins = (this._installedPlugins || (this._installedPlugins = [])); if (installedPlugins.indexOf(plugin) > -1) { return this } // additional parameters var args = toArray(arguments, 1); args.unshift(this); if (typeof plugin.install === 'function') { plugin.install.apply(plugin, args); } else if (typeof plugin === 'function') { plugin.apply(null, args); } installedPlugins.push(plugin); return this };
プラグインのタイプは function で、インストールは plugin.apply(null, args); を呼び出すため、厳密モードではプラグインのランタイム コンテキストは null になり、非厳密モードではウィンドウです。
Vue.use({ a: 1, install: function (Vue) { console.log(this.a) // 1 console.log(arguments) // [function Vue(options),"a", "b", "c"] } }, 'a', 'b', 'c')
Vue.compile
和众多 JS 模板引擎的原理一样,预先会把模板转化成一个 render 函数,Vue.compile 就是来完成这个工作的,目标是将模板(template 或 el)转化成 render 函数。
Vue.compile 返回了{render:Function,staticRenderFns:Array},render 可直接应用于 Vue 的配置项 render,而 staticRenderFns 是怎么来的,而且按照官网的例子,Vue 还有个隐藏的配置项 staticRenderFns,先来个例子看看。
var compiled = Vue.compile( '<p>' + '<header><h1 id="no-nbsp-data-nbsp-binding">no data binding</h1></header>' + '<section>{{prop}}</section>' + '</p>' ) console.log(compiled.render.toString()) console.log(compiled.staticRenderFns.toString()) // render function anonymous() { with(this) { return _c('p', [_m(0), _c('section', [_v(_s(prop))])]) } } // staticRenderFns function anonymous() { with(this) { return _c('header', [_c('h1', [_v("no data binding")])]) } }
原来没有和数据绑定的 dom 会放到 staticRenderFns 中,然后在 render 中以_m(0)来调用。但是并不尽然,比如上述模板去掉
,staticRenderFns 长度为 0,header 直接放到了 render 函数中。
function anonymous() { with(this) { return _c('p', [_c('header', [_v("no data binding")]), _c('section', [_v(_s(prop))])]) } }
Vue.compile 对应的源码比较复杂,上述渲染
// For a node to qualify as a static root, it should have children that // are not just static text. Otherwise the cost of hoisting out will // outweigh the benefits and it's better off to just always render it fresh. if (node.static && node.children.length && !( node.children.length === 1 && node.children[0].type === 3 )) { node.staticRoot = true; return } else { node.staticRoot = false; }
另外官网说明了此方法只在独立构建时有效,什么是独立构建?这个官网做了详细的介绍,不再赘述。对应官网地址:对不同构建版本的解释。
仔细观察编译后的 render 方法,和我们自己写的 render 方法有很大区别。但是仍然可以直接配置到 render 配置选项上。那么里面的那些 _c()、_m() 、_v()、_s() 能调用?随便看一个 Vue 的实例的 __proto__ 就会发现:
// internal render helpers. // these are exposed on the instance prototype to reduce generated render // code size. Vue.prototype._o = markOnce; Vue.prototype._n = toNumber; Vue.prototype._s = toString; Vue.prototype._l = renderList; Vue.prototype._t = renderSlot; Vue.prototype._q = looseEqual; Vue.prototype._i = looseIndexOf; Vue.prototype._m = renderStatic; Vue.prototype._f = resolveFilter; Vue.prototype._k = checkKeyCodes; Vue.prototype._b = bindObjectProps; Vue.prototype._v = createTextVNode; Vue.prototype._e = createEmptyVNode; Vue.prototype._u = resolveScopedSlots; Vue.prototype._g = bindObjectListeners;
正如注释所说,这些方法是为了减少生成的 render 函数的体积。
全局 API 还剩 directive、filter、component、mixin,这几个比较类似,而且都对应着配置项,会在「选项」中再详细介绍。
相关推荐:
以上がVue グローバル API についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

WebStorm Mac版
便利なJavaScript開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









