Rumah hujung hadapan web tutorial js Vue 单向数据流的原理深入解析

Vue 单向数据流的原理深入解析

Dec 22, 2017 pm 01:10 PM
prinsip pergi dalam

本文主要介绍了深入理解Vue 单向数据流的原理,详细的介绍了Vue 单向数据流的原理和使用,具有一定的参考价值,有兴趣的可以了解一下,希望能帮助到大家。

单向数据流是什么

单向数据流指只能从一个方向来修改状态。下图是单向数据流的极简示意:

单向数据流的极简示意

与单向数据流对对应的是双向数据流(也叫双向绑定)。在双向数据流中,Model(可以理解为状态的集合) 中可以修改自己或其他Model的状态, 用户的操作(如在输入框中输入内容)也可以修改状态。这使改变一个状态有可能会触发一连串的状态的变化,最后很难预测最终的状态是什么样的。使得代码变得很难调试。如下图所示:

与双向数据流比,在单向数据流中,当你需要修改状态,完全重新开始走一个修改的流程。这限制了状态修改的方式,让状态变得可预测,容易调试。

单向数据流的使用场景

多个组件会共享状态时,共享状态和组件间(兄弟组件)通信变的不容易。我们把共享状态抽取出来,用单向数据流的方式会变得容易。

从v-model开始讲起

1、v-model 用在 input 元素上

v-model在使用的时候很像双向绑定的(实际上也是。。。),但是 Vue 是单项数据流,v-model 只是语法糖而已:


<input v-model="something" />
<input v-bind:value="something" v-on:input="something = $event.target.value" />
Salin selepas log masuk

第一行的代码其实只是第二行的语法糖。然后第二行代码还能简写成这样:


<input :value="something" @input="something = $event.target.value" />
Salin selepas log masuk

要理解这行代码,首先你要知道 input 元素本身有个 oninput 事件,这是 HTML5 新增加的,类似 onchange ,每当输入框内容发生变化,就会触发 oninput ,通过 $event 把最新的 value 传递给 something。

我们仔细观察语法糖和原始语法那两行代码,可以得出一个结论: 在给 input 元素添加 v-model 属性时,默认会把 value 作为元素的属性,然后把 'input' 事件作为实时传递 value 的触发事件

2、v-model 用在组件上

v-model 不仅仅能在 input 上用,在组件上也能使用,拿官网上的demo看。


<currency-input v-model="price"></currency-input>
Vue.component(&#39;currency-input&#39;, {
 template: &#39;\
 <span>\
  $\
  <input\
  ref="input"\
  v-bind:value="value"\
  v-on:input="updateValue($event.target.value)"\
  >\
 </span>\
 &#39;,
 props: [&#39;value&#39;], // 为什么这里要用 value 属性,value在哪里定义的?
 methods: {
 // 不是直接更新值,而是使用此方法来对输入值进行格式化和位数限制
 updateValue: function (value) {
  var formattedValue = value
  // 删除两侧的空格符
  .trim()
  // 保留 2 位小数
  .slice(
   0,
   value.indexOf(&#39;.&#39;) === -1
   ? value.length
   : value.indexOf(&#39;.&#39;) + 3
  )
  // 如果值尚不合规,则手动覆盖为合规的值
  if (formattedValue !== value) {
  this.$refs.input.value = formattedValue
  }
  // 通过 input 事件带出数值
  // <!--为什么这里把 &#39;input&#39; 作为触发事件的事件名?`input` 在哪定义的?-->
  this.$emit(&#39;input&#39;, Number(formattedValue))
 }
 }
})
Salin selepas log masuk

如果你知道这两个问题的答案,那么恭喜你真正掌握了 v-model,如果你没明白,那么可以看下这段代码:


<currency-input v-model="price"></currency-input>
所以在组件中使用时,它相当于下面的简写:
//上行代码是下行的语法糖
<currency-input :value="price" @input="price = arguments[0]"></currency-input>
Salin selepas log masuk

所以,给组件添加 v-model 属性时,默认会把 value 作为组件的属性,然后把 'input' 值作为给组件绑定事件时的事件名。这在写组件时特别有用。

3、v-model 的缺点和解决办法

在创建类似复选框或者单选框的常见组件时,v-model就不好用了。


<input type="checkbox" v-model="something" />
Salin selepas log masuk

v-model 给我们提供好了 value 属性和 oninput 事件,但是,我们需要的不是 value 属性,而是 checked 属性,并且当你点击这个单选框的时候不会触发 oninput 事件,它只会触发 onchange 事件。

因为 v-model 只是用到了 input 元素上,所以这种情况好解决:


<input type="checkbox" :checked="value" @change="change(value, $event)"
Salin selepas log masuk

当 v-model 用到组件上时:


<checkbox v-model="value"></checkbox>

Vue.component(&#39;checkbox&#39;, {
 tempalte: &#39;<input type="checkbox" @change="change" :checked="currentValue"/>&#39;
 props: [&#39;value&#39;],
 data: function () {
  return {
   //这里为什么要定义一个局部变量,并用 prop 的值初始化它。
   currentValue: this.value
  };
 },
 methods: {
 change: function ($event) {
  this.currentValue = $event.target.checked;
  this.$emit(&#39;input&#39;, this.currentValue); 
 }
})
Salin selepas log masuk

在 Vue 2.2 版本,你可以在定义组件时通过 model 选项的方式来定制 prop/event 。

4、vue 组件数据流

从上面 v-model 的分析我们可以这么理解,双向数据绑定就是在单向绑定的基础上给可输入元素(input、textare等)添加了 change(input) 事件,来动态修改 model 和 view ,即通过触发($emit)父组件的事件来修改mv来达到 mvvm 的效果。而 vue 组件间传递数据是单向的,即数据总是由父组件传递到子组件,子组件在其内部可以有自己维护的数据,但它无权修改父组件传递给它的数据,当开发者尝试这样做的时候,vue 将会报错。这样做是为了组件间更好的解耦,在开发中可能有多个子组件依赖于父组件的某个数据,假如子组件可以修改父组件数据的话,一个子组件变化会引发所有依赖这个数据的子组件发生变化,所以 vue 不推荐子组件修改父组件的数据,直接修改 props 会抛出警告。流程图如下:


所以,当你想要在子组件去修改 props 时,把这个子组件当成父组件那样用,所以就有了

1、定义一个局部变量,并用 prop 的值初始化它。
2、定义一个计算属性,处理 prop 的值并返回。

相关推荐:

vue.js中有关组件数据流问题的解决办法

一个php数据流应用的小例子

Python 数据流操作

Atas ialah kandungan terperinci Vue 单向数据流的原理深入解析. 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

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

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)

Analisis fungsi dan prinsip nohup Analisis fungsi dan prinsip nohup Mar 25, 2024 pm 03:24 PM

Analisis peranan dan prinsip nohup Dalam sistem pengendalian seperti Unix dan Unix, nohup ialah arahan yang biasa digunakan yang digunakan untuk menjalankan arahan di latar belakang Walaupun pengguna keluar dari sesi semasa atau menutup tetingkap terminal, arahan itu boleh masih terus dilaksanakan. Dalam artikel ini, kami akan menganalisis fungsi dan prinsip arahan nohup secara terperinci. 1. Peranan nohup: Menjalankan arahan di latar belakang: Melalui arahan nohup, kita boleh membiarkan arahan yang berjalan lama terus dilaksanakan di latar belakang tanpa terjejas oleh pengguna yang keluar dari sesi terminal. Ini perlu dijalankan

Perbincangan mendalam tentang prinsip dan amalan rangka kerja Struts Perbincangan mendalam tentang prinsip dan amalan rangka kerja Struts Feb 18, 2024 pm 06:10 PM

Analisis prinsip dan penerokaan praktikal rangka kerja Struts Sebagai rangka kerja MVC yang biasa digunakan dalam pembangunan JavaWeb, rangka kerja Struts mempunyai corak reka bentuk dan skalabiliti yang baik dan digunakan secara meluas dalam pembangunan aplikasi peringkat perusahaan. Artikel ini akan menganalisis prinsip rangka kerja Struts dan menerokanya dengan contoh kod sebenar untuk membantu pembaca memahami dan menggunakan rangka kerja itu dengan lebih baik. 1. Analisis prinsip rangka kerja Struts 1. Seni bina MVC Rangka kerja Struts adalah berdasarkan MVC (Model-View-Con

Pemahaman mendalam tentang prinsip pelaksanaan Insert batch dalam MyBatis Pemahaman mendalam tentang prinsip pelaksanaan Insert batch dalam MyBatis Feb 21, 2024 pm 04:42 PM

MyBatis ialah rangka kerja lapisan ketekunan Java yang popular yang digunakan secara meluas dalam pelbagai projek Java. Antaranya, sisipan kelompok adalah operasi biasa yang boleh meningkatkan prestasi operasi pangkalan data dengan berkesan. Artikel ini akan meneroka secara mendalam prinsip pelaksanaan Sisipan kelompok dalam MyBatis, dan menganalisisnya secara terperinci dengan contoh kod khusus. Sisipan Batch dalam MyBatis Dalam MyBatis, operasi Sisipan kelompok biasanya dilaksanakan menggunakan SQL dinamik. Dengan membina S yang mengandungi berbilang nilai yang dimasukkan

Perbincangan mendalam tentang fungsi dan prinsip alat RPM Linux Perbincangan mendalam tentang fungsi dan prinsip alat RPM Linux Feb 23, 2024 pm 03:00 PM

Alat RPM (RedHatPackageManager) dalam sistem Linux ialah alat yang berkuasa untuk memasang, menaik taraf, menyahpasang dan mengurus pakej perisian sistem. Ia ialah alat pengurusan pakej yang biasa digunakan dalam sistem RedHatLinux dan juga digunakan oleh banyak pengedaran Linux yang lain. Peranan alat RPM adalah sangat penting Ia membolehkan pentadbir sistem dan pengguna menguruskan pakej perisian dengan mudah pada sistem. Melalui RPM, pengguna boleh memasang pakej perisian baharu dan menaik taraf perisian sedia ada dengan mudah

Penjelasan terperinci tentang prinsip pemalam paging MyBatis Penjelasan terperinci tentang prinsip pemalam paging MyBatis Feb 22, 2024 pm 03:42 PM

MyBatis ialah rangka kerja lapisan kegigihan yang sangat baik yang menyokong operasi pangkalan data berdasarkan XML dan anotasi Ia mudah dan mudah digunakan, dan juga menyediakan mekanisme pemalam yang kaya. Antaranya, pemalam paging adalah salah satu pemalam yang lebih kerap digunakan. Artikel ini akan menyelidiki prinsip pemalam paging MyBatis dan menggambarkannya dengan contoh kod khusus. 1. Prinsip pemalam paging MyBatis sendiri tidak menyediakan fungsi paging asli, tetapi anda boleh menggunakan pemalam untuk melaksanakan pertanyaan paging. Prinsip pemalam paging adalah terutamanya untuk memintas MyBatis

Analisis mendalam tentang fungsi dan prinsip kerja perintah chage Linux Analisis mendalam tentang fungsi dan prinsip kerja perintah chage Linux Feb 24, 2024 pm 03:48 PM

Perintah chage dalam sistem Linux ialah perintah yang digunakan untuk mengubah suai tarikh tamat kata laluan akaun pengguna Ia juga boleh digunakan untuk mengubah suai tarikh terpanjang dan terpendek yang boleh digunakan bagi akaun tersebut. Perintah ini memainkan peranan yang sangat penting dalam mengurus keselamatan akaun pengguna dengan berkesan boleh mengawal tempoh penggunaan kata laluan pengguna dan meningkatkan keselamatan sistem. Cara menggunakan arahan chage: Sintaks asas perintah chage ialah: chage [option] nama pengguna Contohnya, untuk mengubah suai tarikh tamat kata laluan pengguna "testuser", anda boleh menggunakan arahan berikut

Prinsip dan kaedah asas pelaksanaan kaedah pewarisan di Golang Prinsip dan kaedah asas pelaksanaan kaedah pewarisan di Golang Jan 20, 2024 am 09:11 AM

Prinsip asas dan kaedah pelaksanaan kaedah pewarisan Golang Di Golang, pewarisan merupakan salah satu ciri penting pengaturcaraan berorientasikan objek. Melalui pewarisan, kita boleh menggunakan sifat dan kaedah kelas induk untuk mencapai penggunaan semula dan kebolehlanjutan kod. Artikel ini akan memperkenalkan prinsip asas dan kaedah pelaksanaan kaedah pewarisan Golang, dan memberikan contoh kod khusus. Prinsip asas kaedah pewarisan Di Golang, pewarisan dilaksanakan dengan membenamkan struktur. Apabila struktur dibenamkan dalam struktur lain, struktur terbenam telah dibenamkan

Prinsip pertaruhan Astar, pembongkaran pendapatan, projek dan strategi airdrop & strategi peringkat pengasuh operasi Prinsip pertaruhan Astar, pembongkaran pendapatan, projek dan strategi airdrop & strategi peringkat pengasuh operasi Jun 25, 2024 pm 07:09 PM

Jadual Kandungan Prinsip Staking Astar Dapp Staking Hasil Pembongkaran Projek Airdrop Berpotensi: AlgemNeurolancheHealthreeAstar Degens DAOVeryLongSwap Staking Strategi & Operasi "AstarDapp Staking" telah dinaik taraf kepada versi V3 pada awal tahun ini, dan banyak pelarasan telah dibuat pada staking peraturan. Pada masa ini, kitaran pertaruhan pertama telah tamat, dan kitaran kecil "pengundian" kitaran pertaruhan kedua baru sahaja bermula. Untuk mendapatkan faedah "ganjaran tambahan", anda perlu memahami peringkat kritikal ini (dijangka akan berlangsung sehingga 26 Jun, berbaki kurang daripada 5 hari). Saya akan memecahkan pendapatan pertaruhan Astar secara terperinci,

See all articles