Rumah hujung hadapan web tutorial js 深入理解Vue全局API

深入理解Vue全局API

Dec 18, 2017 pm 01:50 PM
api dokumen

大家都了解API吗?本文主要介绍了深入理解Vue官方文档梳理之全局API,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

Vue.extend

配置项data必须为function,否则配置无效。data的合并规则(可以看《Vue官方文档梳理-全局配置》)源码如下:

传入非function类型的data(上图中data配置为{a:1}),在合并options时,如果data不是function类型,开发版会发出警告,然后直接返回了parentVal,这意味着extend传入的data选项被无视了。

我们知道实例化Vue的时候,data可以是对象,这里的合并规则不是通用的吗?注意上面有个if(!vm)的判断,实例化的时候vm是有值的,因此不同于Vue.extend,其实下面的注释也做了说明(in a Vue.extend merge, both should be function),这也是官方文档为何说data是个特例。

另外官方文档所说的“子类”,是因为Vue.extend返回的是一个“继承”Vue的函数,源码结构如下:


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
};
Salin selepas log masuk

Vue.nextTick

既然使用vue,当然要沿着数据驱动的方式思考,所谓数据驱动,就是不要直接去操作dom,dom的所有操作完全可以利用vue的各种指令来完成,指令将数据和dom进行了“绑定”,操作数据不仅能实现dom的更新,而且更方便。

如果浏览器支持Promise,或者用了Promise库(但是对外暴露的必须叫Promise,因为源码中的判断为typeof Promise !== 'undefined'),nextTick返回的就是Promise对象。


Vue.nextTick().then(() => {
  // do sth
})
Salin selepas log masuk

Vue执行nextTick的回调采用call的方式cb.call(ctx);ctx就是当前Vue实例,因此在回调中可以直接使用this调用实例的配置。
nextTick可以简单理解为将回调放到末尾执行,源码中如果当前不支持Promise和MutationObserver,那么会采用setTimeout的方式来执行回调,这不就是我们常用的延后执行代码的方式。


 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);
   };
 }
Salin selepas log masuk

举个例子来实际看下:


<p id="app">
  <p ref="dom">{{a}}</p>
</p>
new Vue({
  el: &#39;#app&#39;,
  data: {
    a: 1
  },
  mounted: function name(params) {
    console.log(&#39;start&#39;);
    this.$nextTick(function () {
      console.log(&#39;beforeChange&#39;, this.$refs.dom.textContent)
    })
    this.a = 2;
    console.log(&#39;change&#39;);
    this.$nextTick(function () {
      console.log(&#39;afterChange&#39;, this.$refs.dom.textContent)
    })
    console.log(&#39;end&#39;);
  }
})
// 控制台依次打印
// start
// change
// end
// beforeChange 1
// afterChange 2
Salin selepas log masuk

你估计会有些纳闷,既然都是最后才执行,那为什么beforeChange输出的是1而不是2,这是因为this.a=2背后触发dom更新也是采用nextTick的方式,上面的代码实际执行的顺序是:beforeChange>更新dom>afterChange。

Vue.set

Vue.set( target, key, value ),target不能是 Vue 实例,或者 Vue 实例的根数据对象,因为源码中做了如下判断:


var ob = (target).__ob__;
if (target._isVue || (ob && ob.vmCount)) {
"development" !== &#39;production&#39; && warn(
  &#39;Avoid adding reactive properties to a Vue instance or its root $data &#39; +
  &#39;at runtime - declare it upfront in the data option.&#39;
);
return val
}
Salin selepas log masuk

target._isVue阻止了给Vue实例添加属性,ob && ob.vmCount阻止了给Vue实例的根数据对象添加属性。

Vue.delete

如果Vue能检测到delete操作,那么就不会出现这个api。如果一定要用delete来删除$data的属性,那就用Vue.delete,否则不会触发dom的更新。

同Vue.set,Vue.delete( target, key )的target不能是一个 Vue 示例或 Vue 示例的根数据对象。源码中的阻止方式和Vue.set相同。

在2.2.0+ 版本中target若为数组,key则是数组下标。因为Vue.delete删除数组实际是用splice来删除,delete虽然能用于删除数组,但位置还在,不能算真正的删除。


var a = [1, 2, 3];
delete a[0];
console.log(a); // [undefined, 2, 3]
Salin selepas log masuk

Vue.use

Vue.use 源码比较简单,可以全部贴出来。


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 === &#39;function&#39;) {
    plugin.install.apply(plugin, args);
  } else if (typeof plugin === &#39;function&#39;) {
    plugin.apply(null, args);
  }
  installedPlugins.push(plugin);
  return this
};
Salin selepas log masuk

安装的插件放到了 installedPlugins ,安装插件前通过installedPlugins.indexOf(plugin)来判断插件是否被安装过,进而阻止注册相同插件多次。

插件类型为 object,必须指定 install 属性来安装插件(typeof plugin.install === 'function'),另外插件执行采用plugin.install.apply(plugin, args);,因此 this 访问 object 的其他属性。此处的 args 是由 Vue(args.unshift(this);) 和 Vue.use 传入的除了 plugin 的其他参数(toArray(arguments, 1),1 表示从 arguments[1] 开始截取)。


Vue.use({
  a: 1,
  install: function (Vue) {
    console.log(this.a) // 1
    console.log(arguments) // [function Vue(options),"a", "b", "c"]
  }
}, &#39;a&#39;, &#39;b&#39;, &#39;c&#39;)
Salin selepas log masuk

插件类型为 function,安装调用plugin.apply(null, args);,因此在严格模式下插件运行时上下文 this 为 null,非严格模式为 Window。


&#39;use strict&#39;
Vue.use(function plugin() {
  console.log(this) // null
  console.log(arguments) // [function Vue(options),"a", "b", "c"]
}, &#39;a&#39;, &#39;b&#39;, &#39;c&#39;)
Salin selepas log masuk

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(
  &#39;<p>&#39; +
  &#39;<header><h1>no data binding</h1></header>&#39; +
  &#39;<section>{{prop}}</section>&#39; +
  &#39;</p>&#39;
)
console.log(compiled.render.toString())
console.log(compiled.staticRenderFns.toString())
// render
function anonymous() {
  with(this) {
    return _c(&#39;p&#39;, [_m(0), _c(&#39;section&#39;, [_v(_s(prop))])])
  }
}
// staticRenderFns
function anonymous() {
  with(this) {
    return _c(&#39;header&#39;, [_c(&#39;h1&#39;, [_v("no data binding")])])
  }
}
Salin selepas log masuk

原来没有和数据绑定的 dom 会放到 staticRenderFns 中,然后在 render 中以_m(0)来调用。但是并不尽然,比如上述模板去掉

,staticRenderFns 长度为 0,header 直接放到了 render 函数中。


function anonymous() {
  with(this) {
    return _c(&#39;p&#39;, [_c(&#39;header&#39;, [_v("no data binding")]), _c(&#39;section&#39;, [_v(_s(prop))])])
  }
}
Salin selepas log masuk

Vue.compile 对应的源码比较复杂,上述渲染

没有放到 staticRenderFns 对应源码的核心判断如下:


 // 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&#39;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;
 }
Salin selepas log masuk

不符判断条件 !(node.children.length === 1 && node.children[0].type === 3),
有一个子节点 TextNode(nodeType=3)。 注释也说明了一个 node 符合静态根节点的条件。

另外官网说明了此方法只在独立构建时有效,什么是独立构建?这个官网做了详细的介绍,不再赘述。对应官网地址:对不同构建版本的解释。

仔细观察编译后的 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;
Salin selepas log masuk

正如注释所说,这些方法是为了减少生成的 render 函数的体积。

全局 API 还剩 directive、filter、component、mixin,这几个比较类似,而且都对应着配置项,会在「选项」中再详细介绍。

相关推荐:

Vue官方文档梳理的全局配置详解

Vue拦截器vue-resource 拦截器使用详解

vue项目的构建,打包,发布详解

Atas ialah kandungan terperinci 深入理解Vue全局API. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Memori atau ruang cakera tidak mencukupi untuk mengepa semula atau mencetak dokumen ini Ralat Word Memori atau ruang cakera tidak mencukupi untuk mengepa semula atau mencetak dokumen ini Ralat Word Feb 19, 2024 pm 07:15 PM

Artikel ini akan memperkenalkan cara menyelesaikan masalah memori yang tidak mencukupi atau ruang cakera untuk halaman semula atau mencetak dokumen dalam Microsoft Word. Ralat ini biasanya berlaku apabila pengguna cuba mencetak dokumen Word. Jika anda menghadapi ralat yang serupa, sila rujuk cadangan yang diberikan dalam artikel ini untuk menyelesaikannya. Memori atau ruang cakera tidak mencukupi untuk halaman semula atau mencetak dokumen ini Ralat Word Bagaimana untuk menyelesaikan ralat pencetakan Microsoft Word "Tidak ada memori atau ruang cakera yang mencukupi untuk halaman semula atau mencetak dokumen." Kemas kini Microsoft Office Tutup aplikasi penyamaran memori Tukar pencetak lalai anda Mulakan Word dalam mod selamat Namakan semula fail NorMal.dotm Simpan fail Word sebagai yang lain

Bagaimana untuk menambah garis merah pada dokumen Word Bagaimana untuk menambah garis merah pada dokumen Word Mar 01, 2024 am 09:40 AM

Ia adalah 395 perkataan, iaitu 495. Artikel ini akan menunjukkan kepada anda cara menambah garis merah dalam dokumen Word. Menggariskan semula dokumen merujuk kepada membuat pengubahsuaian pada dokumen supaya pengguna dapat melihat perubahan dengan jelas. Ciri ini sangat penting apabila berbilang orang sedang mengedit dokumen bersama-sama. Maksud garis merah Menanda dokumen Garis merah bermaksud menggunakan garis merah atau serlahan ciri untuk menunjukkan perubahan, suntingan atau semakan pada dokumen. Istilah ini diilhamkan oleh amalan menggunakan pen merah untuk menandakan dokumen bercetak. Komen Redline digunakan secara meluas dalam senario yang berbeza, seperti menunjukkan dengan jelas perubahan yang disyorkan kepada pengarang, editor dan penyemak semasa mengedit dokumen. Cadangkan perubahan dan pengubahsuaian dalam perjanjian atau kontrak undang-undang Memberikan kritikan dan cadangan yang membina pada kertas kerja, pembentangan, dsb. Bagaimana untuk memberi W

Tidak boleh membuka hiperpautan dalam dokumen word Tidak boleh membuka hiperpautan dalam dokumen word Feb 18, 2024 pm 06:10 PM

Dalam beberapa tahun kebelakangan ini, dengan perkembangan berterusan teknologi rangkaian, kehidupan kita tidak dapat dipisahkan daripada pelbagai alat digital dan Internet. Semasa memproses dokumen, terutamanya dalam penulisan, kita sering menggunakan dokumen perkataan. Namun, kadangkala kita mungkin menghadapi masalah yang sukar, iaitu hiperpautan dalam dokumen perkataan tidak boleh dibuka. Isu ini akan dibincangkan di bawah. Pertama sekali, kita perlu menjelaskan bahawa hiperpautan merujuk kepada pautan yang ditambahkan dalam dokumen perkataan ke dokumen lain, halaman web, direktori, penanda halaman, dsb. Apabila kita klik pada pautan ini, saya

Ketahui fungsi os.Stdout.Write dalam dokumentasi bahasa Go untuk melaksanakan output standard Ketahui fungsi os.Stdout.Write dalam dokumentasi bahasa Go untuk melaksanakan output standard Nov 03, 2023 pm 03:48 PM

Ketahui fungsi os.Stdout.Write dalam dokumentasi bahasa Go untuk melaksanakan output standard Dalam bahasa Go, output standard dilaksanakan melalui os.Stdout. os.Stdout ialah pembolehubah jenis *os.File, yang mewakili peranti output standard. Untuk mengeluarkan kandungan kepada output standard, anda boleh menggunakan fungsi os.Stdout.Write. Artikel ini akan memperkenalkan cara menggunakan fungsi os.Stdout.Write untuk melaksanakan output standard dan menyediakan contoh kod khusus. os.

Dokumen Word kosong apabila dibuka pada Windows 11/10 Dokumen Word kosong apabila dibuka pada Windows 11/10 Mar 11, 2024 am 09:34 AM

Apabila anda menghadapi isu halaman kosong semasa membuka dokumen Word pada komputer Windows 11/10, anda mungkin perlu melakukan pembaikan untuk menyelesaikan situasi tersebut. Terdapat pelbagai sumber masalah ini, salah satu yang paling biasa ialah dokumen yang rosak itu sendiri. Tambahan pula, kerosakan fail Office juga boleh membawa kepada situasi yang sama. Oleh itu, pembaikan yang disediakan dalam artikel ini mungkin membantu anda. Anda boleh cuba menggunakan beberapa alat untuk membaiki dokumen Word yang rosak, atau cuba menukar dokumen kepada format lain dan membukanya semula. Selain itu, menyemak sama ada perisian Office dalam sistem perlu dikemas kini juga merupakan cara untuk menyelesaikan masalah ini. Dengan mengikuti langkah mudah ini, anda mungkin boleh membetulkan dokumen Word kosong apabila membuka dokumen Word pada Win

Tafsiran dokumentasi Java: Pengenalan terperinci kepada kaedah substring() kelas StringBuilder Tafsiran dokumentasi Java: Pengenalan terperinci kepada kaedah substring() kelas StringBuilder Nov 03, 2023 pm 04:31 PM

Tafsiran dokumentasi Java: Pengenalan terperinci kepada kaedah substring() kelas StringBuilder Pengenalan: Dalam pengaturcaraan Java, pemprosesan rentetan adalah salah satu operasi yang paling biasa. Java menyediakan satu siri kelas dan kaedah untuk pemprosesan rentetan, antaranya kelas StringBuilder ialah pilihan yang biasa digunakan untuk operasi rentetan yang kerap. Dalam kelas StringBuilder, kaedah substring() ialah kaedah yang sangat berguna untuk memintas substring rentetan. Artikel ini akan

Bagaimana untuk melaksanakan penggunaan asas dokumen Workerman Bagaimana untuk melaksanakan penggunaan asas dokumen Workerman Nov 08, 2023 am 11:46 AM

Pengenalan kepada cara melaksanakan penggunaan asas dokumen Workerman: Workerman ialah rangka kerja pembangunan PHP berprestasi tinggi yang boleh membantu pembangun membina aplikasi rangkaian konkurensi tinggi dengan mudah. Artikel ini akan memperkenalkan penggunaan asas Workerman, termasuk pemasangan dan konfigurasi, mencipta perkhidmatan dan port mendengar, mengendalikan permintaan pelanggan, dsb. Dan berikan contoh kod yang sepadan. 1. Pasang dan konfigurasikan Workerman Masukkan arahan berikut pada baris arahan untuk memasang Workerman: c

Penjelasan terperinci tentang operasi dokumen Word: gabungkan dua halaman menjadi satu Penjelasan terperinci tentang operasi dokumen Word: gabungkan dua halaman menjadi satu Mar 26, 2024 am 08:18 AM

Dokumen Word adalah salah satu aplikasi yang paling kerap digunakan dalam kerja dan pembelajaran harian kita. Apabila bekerja pada dokumen, kadangkala anda mungkin menghadapi situasi di mana anda perlu menggabungkan dua halaman menjadi satu. Artikel ini akan memperkenalkan secara terperinci cara menggabungkan dua halaman menjadi satu halaman dalam dokumen Word untuk membantu pembaca mengendalikan reka letak dokumen dengan lebih cekap. Dalam dokumen Word, operasi penggabungan dua halaman menjadi satu biasanya digunakan untuk menjimatkan kos kertas dan percetakan, atau untuk menjadikan dokumen lebih padat dan kemas. Berikut adalah langkah khusus untuk menggabungkan dua halaman menjadi satu: Langkah 1: Buka Word yang perlu dikendalikan

See all articles