Migrasi dari Vue 1.x

FAQ

Woah - halaman ini sangat panjang! Apakah ini berarti 2.0 benar-benar beda, Saya harus mempelajari semua dasarnya dari awal lagi, dan migrasi tidak mungkin dilakukan?

Saya senang Anda bertanya! Jawabannya adalah tidak. Sekitar 90% API masih sama dan konsep inti tidaklah berubah. Halaman ini panjang karena kami ingin memberikan penjelasan yang sangat mendetil dan berisikan banyak contoh-contoh. Tenanglah, ini bukan sesuatu yang Anda harus baca dari atas kebawah!

Darimana saya harus memulai sebuah migrasi?

  1. Awali dengan menjalankan pembantu migrasi dalam project saat ini. Kami telah berhati-hati untuk mengecilkan dan memampatkan pengembangan Vue menjadi sebuah command line interface sederhana. Kapan pun mereka mendeteksi adanya fitur yang usang, mereka akan memberitahu Anda, memberikan nasihat, dan menyediakan links ke lebih banyak informasi.
  1. Setelah itu, lihatlah daftar isi dari halaman ini yang ada di sidebar. Jika Anda melihat topik yang mungkin mempengaruhi migrasi Anda, namun tidak diberitahukan oleh “pembantu migrasi”, coba lihatlah topik tersebut.

  2. Jika Anda mempunyai sebuah tes, jalankan mereka dan amati apa saja yang masih gagal. Jika Anda tidak punya tes, bukalah aplikasi Anda di peramban (browser) dan periksalah peringatan-peringatan dan galat-galat (error) selagi anda bernavigasi di aplikasi Anda.

  1. Pada tahap ini, aplikasi Anda seharusnya sudah sepenuhnya termigrasi. Jika Anda masih ingin tahu lebih banyak lagi, Anda dapat membaca sisa dari halaman ini - atau menyelam ke petunjuk the begining yang baru dan lebih baik. Banyak bagian yang bisa di skim, karena Anda sudah familiar dengan konsep-konsep inti.

Berapa lama waktu yang dibutuhkan untuk memigrasi aplikasi Vue 1.x ke 2.0?

Ini bergantung pada beberapa faktor:

Jika Saya upgrade ke Vue 2, akankah Saya juga harus meng-upgrade Vuex dan Vue Router?

Hanya Vue Router 2 yang cocok dengan Vue 2, jadi ya, anda juga harus mengikuti jalur migrasi untuk Vue Router. Untungnya, kebanyakan aplikasi tidak memiliki banyak kode router, jadi melakukan hal ini sepertinya tidak akan memakan waktu lebih dari satu jam.

Untuk Vuex, versi 0.8 saja sudah cocok dengan Vue 2, jadi anda tidak dipaksa untu melakukan upgrade. Satu-satunya alasan anda jika ingin melakukan upgrade secepatnya adalah untuk mendapatkan manfaat dari fitur-fitur baru di Vuex 2, seperti modules dan boilerplate yang dikurangi.

Templat

Fragment Instances dihapus

Setiap komponen harus memiliki sebuah elemen root. Fragment instance tidak lagi diperbolehkan. Jika Anda memiliki templat seperti ini:

<p>foo</p>
<p>bar</p>

Disarankan untuk membungkus seluruh konten dalam sebuah elemen baru, seperti ini:

<div>
  <p>foo</p>
  <p>bar</p>
</div>

Jalur Upgrade

Jalankan rangkaian tes atau aplikasi Anda setelah melakukan peningkatan dan carilah peringatan konsol mengenai beberapa elemen root dalam sebuah templat.

Kait Siklus Hidup (Lifecycle Hooks)

beforeCompile dihapuskan

Gunakan kait created sebagai penggantinya.

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk melihat contoh kait berikut.

compiled digantikan

Gunakan kait mounted sebagai penggantinya.

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk melihat contoh kait berikut.

attached dihapuskan

Gunakan kastem in-DOM cek di dalam kait lain. Dengan contoh, untuk menggantikan:

attached: function () {
  doSomething()
}

Kamu bisa menggunakan:

mounted: function () {
  this.$nextTick(function () {
    doSomething()
  })
}

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk melihat contoh kait berikut.

detached dihapuskan

Gunakan kastem in-DOM cek di dalam kait lain. Dengan contoh, untuk menggantikan:

detached: function () {
  doSomething()
}

Kamu bisa menggunakan:

destroyed: function () {
  this.$nextTick(function () {
    doSomething()
  })
}

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk melihat contoh kait berikut.

init diubah nama

Gunakan kait beforeCreate sebagai pengganti, dimana merupakan hal yang sama. Digantikan nama dikarenakan merujuk pada konsistensi penamaan methods siklus hidup yang lain.

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk melihat contoh kait berikut.

ready digantikan

Gunakan kait baru mounted sebagai pengganti. Harus menjadi perhatian bahwa dengan mounted, tidak ada garansi untuk bahwa page sudah benar benar di load oleh browser. Untuk itu, gunakan Vue.nextTick/vm.$nextTick. Sebagai contoh

mounted: function () {
  this.$nextTick(function () {
    // kode anda dimana memastikan bahwa element sudah di load oleh browser
  })
}

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk melihat contoh kait berikut.

v-for

v-for Argumen Persoalan Order Dalam Array diubah

Saat menggunakan index, argumen order dalam array dulunya (index, value). Sekarang (value, index) untuk menjaga konsistensi dengan methods array JavaScript’s seperti forEach dan map.

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk menemukan contoh argumen order yang lama. Perlu diperhatikan jika anda menamai index dengan position atau num, alat bantu tidak akan memberikan peringatan.

v-for Argumen Order Tentang Objek diubah

Saat menggunakan key sebagai argumen order pada objek dulunya(key, value). Sekarang menjadi (value, key) untuk lebih konsisten dengan objek iterator pada umumnya seperti lodash.

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk menemukan contoh argumen order yang lama. Perlu diperhatikan jika anda menamai kunci argumen anda dengan name atau property alat bantu tidak akan memberikan peringatan.

$index and $key dihapuskan

Secara implisit variabel $index dan $key dihapuskan karena secara explisit didefinisikan kedalam v-for. Ini membuat kode lebih gampang di baca untuk developer yang kurang berpengalaman dengan Vue dan juga membuat perilaku yang lebih jelas saat berkerja dengan nested loops.

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk menemukan variabel yang telah dihapuskan berikut. Jika kamu lupa untuk menhapusnya, kamu akan melihat console errors seperti: Uncaught ReferenceError: $index is not defined

track-by digantikan

track-by has been replaced with key, which works like any other attribute: without the v-bind: or : prefix, it is treated as a literal string. In most cases, you’d want to use a dynamic binding which expects a full expression instead of a key. For example, in place of:
track-by telah diganti dengan key, dimana berkerja seperti attribut lain: tanpa v-bind: atau : sebagai prefix, key di perlakukan sebagai literal string. DI banyak kasus, kamu mungkin ingin menggunakan binding dinamis dimana mengharapakan suatu full expression daripada kunci saja. Sebagai contoh :

<div v-for="item in items" track-by="id">

Kamu sekarang menuliskan :

<div v-for="item in items" v-bind:key="item.id">

Jalur upgrade

Jalankan alat bantu migrasi untuk menemukan contoh dari pada track-by.

v-for Nila Rentang diubah

Dulunya, v-for="number in 10" dengan number dimulai dari 0 ke 9. Sekarang dimulai dari 1 sampai dengan 10.

Jalur upgrade

Cari di kodebase anda /\w+ in \d+/. Dimana ini muncul pada v-for, lalu cek jika mungkin memberikan efek pada kode anda.

Props

coerce Opsi Pada Props dihapuskan

Jika kamu ingin memaksakan sebuah prop, gunakan nilai hitung berdasarkan prop tersebut. Sebagai contoh, daripada :

props: {
  username: {
    type: String,
    coerce: function (value) {
      return value
        .toLowerCase()
        .replace(/\s+/, '-')
    }
  }
}

Anda dapat menuliskan:

props: {
  username: String,
},
computed: {
  normalizedUsername: function () {
    return this.username
      .toLowerCase()
      .replace(/\s+/, '-')
  }
}

Disini ada beberapa keuntungan:

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk menemukan opsi coerce.

twoWay Prop Option dihapus

Prop sekarang selalu satu jalur ke bawah. Untuk menimbulkan efek pada scope induk, komponen harus secara explisit memberikan event daripada harus bergantung pada binding implisit. Untuk informasi selanjutnya, lihat:

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk menemukan opsi twoWay.

.once and .sync Modifiers on v-bind dihapus

Prop sekarang selalu satu jalur ke bawah. Untuk menimbulkan efek pada scope induk, komponen harus secara explisit memberikan event daripada harus bergantung pada binding implisit. Untuk informasi selanjutnya, lihat:

Jalur upgrade

Jalankan alat bantu migrasi di dalam kode anda untuk menemukan contoh pengubah .once dan .sync

Mutasi Prop usang

Mengubah prop sekarang merupakan sebuah anti-pattern (tidak disarankan dilakukan), contoh mendeklarasikan prop dan men-set prop this.myProp = 'someOtherValue' pada komponen. Dikarenakan mekanisame rendering yang baru, setiap komponen induk melakukan re-render, perubahan lokal komponen tersebut akan ditimpa.

Sebagian besar kasus penggunaan mutasi pada props dapat diganti dengan salah satu opsi ini:

Jalur upgrade

Upgrade Vue lalu jalankan *end-to-end* testing kamu, cari console warnings tentang mutasi prop.

Prop pada Akar Instance digantikan

Pada akar instances Vue (contoh, instances yang dibuat dengan new Vue({ ... })) kamu harus menggunakan propsData sebagai ganti props

Jalankan

Jalankan *end-to-end* tes, jika kamu mempunyainya. tes gagal akan memberikan peringatan bahwa prop yang dimasukan pada akar instances Vue sudah tidak berkerja lagi.

Properti Computed (Computed properties)

cache: false deprecated

Caching invalidation of computed properties will be removed in future major versions of Vue. Replace any uncached computed properties with methods, which will have the same result.

Pembatalan chaching dari senuah properti computed akan dihapuskan pada versi major Vue selanjutnya. Ganti semua uncached properti computed dengan method, dimana akan menghasailakn hal yang sama

Contoh:

template: '<p>message: {{ timeMessage }}</p>',
computed: {
  timeMessage: {
    cache: false,
    get: function () {
      return Date.now() + this.message
    }
  }
}

atau dengan komponen method:

template: '<p>message: {{ getTimeMessage() }}</p>',
methods: {
  getTimeMessage: function () {
    return Date.now() + this.message
  }
}

Jalur upgrade

Jalankan alat bantu migrasi di kode anda dan anda akan menemukan opsi cache: false

Direktif Bawaan

Truthiness/Falsiness dengan v-bind diubah

Ketika digunakan dengan v-bind, nilai yang bernilai false sekarang hanya: null, undefined, dan false. ini berarti 0 dan string kosong akan bernilai true. Contohnya, v-bind:draggable="''" diperbaiki menjadi draggable="true".

Untuk atribut yang disebutkan, selain nilai-nilai palsu diatas, nilai string "false" akan di-render sebagai attr="false".

Catatan untuk direktif lainnya (e.g. v-if and v-show), nilai-nilai truthiness JavaScript masih berlaku.

Jalur Upgrade

Jalankan *end-to-end test suite* Anda, Jika Anda memilikinya. Bagian *failed tests* akan memperingatkan Anda terhadap bagian-bagian dari aplikasi yang terkena dampak oleh perubahan ini.

Mengetahui nilai asli dengan v-on diubah/sup>

Ketika digunakan pada sebuah komponen, v-on hanya akan mendengarkan event-event yang ter- $emit oleh komponen tersebut. Untuk mendengarkan event DOM bawaan pada elemen root, Anda dapat menggunakan modifier .native. Contohnya:

<my-component v-on:click.native="doSomething"></my-component>

Jalur Upgrade

Jalankan end-to-end, jika Anda memilikinya. Bagian *failed tests* akan memperingatkan Anda terhadap bagian-bagian dari aplikasi yang terkena dampak oleh perubahan ini.

debounce Atribut Param untuk v-model dihapus

Vue’s debounce parameter atribut untuk v-model membuat mudah untuk kasus - kasus sederhana, tetapi operasi ini sebenarnya ditolak oleh state updates daripada operasi yang mahal itu sendiri. Ini sebuah perbedaan yang halus, namun akan ada keterbatasan jika aplikasi tersebut tumbuh.

Keterbatasan itu akan muncul ketika merancang indikator pencarian, Seperti:

{{ Pencarian indikator }}

Menggunakan atribut debounce, tidak ada cara untuk mengenali “Tipe” state, karena kita kehilangan akses pada input real-time state. Namun memisahkan fungsi debounce dari Vue, kami hanya dapat debounce pada operasi yang kami ingin batasi, menghapus keterbatasan pada fitur dapat dikembangkan sebagai berikut:

<!--
Dengan menggunakan fungsi debounce dari lodash atau perpustakaan utilitas khusus lainnya, kami tahu implementasi debounce spesifik yang kami gunakan akan menjadi yang terbaik di kelasnya - dan kita dapat menggunakannya dimana saja. Tidak hanya di template kami.
-->
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.js"></script>
<div id="debounce-search-demo">
  <input v-model="searchQuery" placeholder="Type something">
  <strong>{{ searchIndicator }}</strong>
</div>
new Vue({
  el: '#debounce-search-demo',
  data: {
    searchQuery: '',
    searchQueryIsDirty: false,
    isCalculating: false
  },
  computed: {
    searchIndicator: function () {
      if (this.isCalculating) {
        return '⟳ Fetching new results'
      } else if (this.searchQueryIsDirty) {
        return '... Typing'
      } else {
        return '✓ Done'
      }
    }
  },
  watch: {
    searchQuery: function () {
      this.searchQueryIsDirty = true
      this.expensiveOperation()
    }
  },
  methods: {
    // This is where the debounce actually belongs.
    expensiveOperation: _.debounce(function () {
      this.isCalculating = true
      setTimeout(function () {
        this.isCalculating = false
        this.searchQueryIsDirty = false
      }.bind(this), 1000)
    }, 500)
  }
})

Keuntungan lain dari pendekatan ini adalah akan ada waktu ketika debouncing tidak cukup sebagai fungsi wrapper. Misalnya, saat memanggil API untuk pencarian saran, menunggu untuk menawarkan saran sampai setelah pengguna berhenti mengetik untuk jangka waktu tertentu bukanlah pengalaman yang ideal. Yang mungkin Anda inginkan adalah fungsi throttling. Sekarang karena Anda sudah menggunakan pustaka utilitas seperti lodash, refactoring untuk menggunakan fungsi throttle sebagai gantinya hanya membutuhkan beberapa detik.

Jalur Upgrade

Jalankan alat bantu migrasi dari codebase Anda untuk mencari contoh-contoh atribut *debounce*.

lazy atau number Atribut Param untuk v-model diganti

lazy dan number param atribut dapat di modifikasi, untuk membuat lebih jelas, artinya:

<input v-model="name" lazy>
<input v-model="age" type="number" number>

Kamu dapat menggunakan:

<input v-model.lazy="name">
<input v-model.number="age" type="number">

Jalur Upgrade

Jalankan alat bantu migrasi dari codebase Anda untuk mencari contoh-contoh atribut .

value Atribut dengan v-model dihapus

v-model tidak peduli dengan nilai awal dari barisan atribut value. Untuk bisa diprediksi, v-model akan memperlakukan data dari Vue intance sebagai sumber kebenaran.

Maksud dari elemen ini:

<input v-model="text" value="foo">

Didukung dengan data ini:

data: {
  text: 'bar'
}

Akan render dengan nilai “bar” daripada “foo”. Hal yang sama berlaku untuk <textarea> dengan konten yang ada. Daripada:

<textarea v-model="text">
  hello world
</textarea>

Anda harus memastikan nilai awal text adalah “hello world”.

Jalur Upgrade

Jalankan *end-to-end test suite* atau peningkatan setelah pengujian aplikasi dan mencari console warnings tentang kebenaran nilai dalam atribut v-model.

v-model dengan v-for Nilai Primtif Iterasidihapus

Kasus seperti ini tidak berfungsi lagi pada:

<input v-for="str in strings" v-model="str">

Alasannya adalah kesetaraan Javascript yang akan di *compile dari <input> tersebut:

strings.map(function (str) {
  return createElement('input', ...)
})

Seperti yang Anda lihat, v-model pengikatan dua arah ini tidak masuk akal . Menetapkan str menjadi nilai lain dalam fungsi iterasi tetapi tidak akan melakukan apa-apa karena itu hanya variabel lokal yang berada dalam cakupan fungsi.

Sebagai gantinya, Anda seharusnya menggunakan array objects sehingga v-model bisa memperbaharui field dalam object tersebut. Seperti:

<input v-for="obj in objects" v-model="obj.str">

Jalur Upgrade>

Jalankan *your test suite*, jika Anda memilikinya. Bagian *failed tests* akan memperingatkan Anda terhadap bagian-bagian dari aplikasi yang terkena dampak oleh perubahan ini.

v-bind:style dengan Object Syntax dan !important dihapus

Konsep ini tidak lagi berfungsi:

<p v-bind:style="{ color: myColor + ' !important' }">hello</p>

Jika Anda ingin menimpa !important lainnya, Anda harus menggunakan string syntax:

<p v-bind:style="'color: ' + myColor + ' !important'">hello</p>

Jalur Upgrade

Jalankan alat bantu migrasi pada baris kode Anda menemukan contoh-contoh dengan ikatan gaya *!important* dalam objek.

v-el and v-ref diganti

Untuk kesederhanaan, v-el dan v-ref sudah digabungkan menjadi atribut ref , dapat diakses melalui komponen instance $refs. Maksudnya v-el:my-element akan muncul ref="myElement" dan v-ref:my-component nampak ref="myComponent".Ketika digunakan pada elemen normal, ref akan ke DOM elemen, dan ketika menggunakan dalam komponen tersebut , ref akan kembali menggunakan komponen instance.

Karena v-ref bukan lagi sebuah direktif, tetapi adalah atribut spesial, dapat juga didefinisikan secara dinamis. Ini sangat berguna dalam kombinasi dengan v-for. Seperti:

<p v-for="item in items" v-bind:ref="'item' + item.id"></p>

Sebelumnya, v-el/v-ref kombinasi dengan v-for akan menghasilkan array pada elemen/komponen, karena tidak ada cara memberi nama yang unik pada setiap item. Anda masih dapat mencapai ini dengan memberikan item ref yang sama:

<p v-for="item in items" ref="items"></p>

Tidak seperti 1.x, $refs ini tidak reactive, karena mereka sudah terdaftar/diperbaharui selama proses render itu sendiri. Membuat mereka reactive akan membutuhkan duplikasi render pada setiap perubahan.

Disamping itu, $refs dirancang untuk program dalam javascript - Tidak disaranakan penggunaan dalam tampilan, karena akan merujuk pada negara bukan pada instance itu sendiri. Akan terkana pelanggaran dalam tampilan model Vue js sendiri.

Jalur Upgrade

Jalankanalat bantu migrasi dari codebase untuk mencari contoh-contoh v-el dan v-ref.

v-else with v-show di hapus

v-else tidak lagi berfungsi dengan v-show. Menggunakan v-if dengan sebuah ekpresi negasi sebagai gantinya. Untuk contohnya, daripada:

<p v-if="foo">Foo</p>
<p v-else v-show="bar">Not foo, but bar</p>

Anda dapat menggunakan:

<p v-if="foo">Foo</p>
<p v-if="!foo && bar">Not foo, but bar</p>

Jalur Upgrade

Jalankan alat bantu migrasi dari codebase untuk mencari contoh-contoh v-else dengan v-show.

Direktif Kustom yang disederhanakan

Direktif-direktif memiliki cakupan tanggung jawab yang sangat dikurangi: mereka sekarang hanya digunakan untuk menerapkan manipulasi DOM pada low level secara langsung. Umumnya, Anda seharusnya menggunakan komponen sebagai abtraksi utama code-reuse.

Beberapa perbedaan yang paling menonjol termasuk:

Untungnya, karena direktif-direktif baru jauh lebih sederhana, maka kamu dapat menguasainya lebih mudah. Baca Panduan direktif kustom untuk mempelajari lebih lanjut.

Jalur upgrade

Jalankan alat bantu migrasi dari codebase Anda untuk mencari contoh-contoh pada direktif. Helper akan menandai mereka semua, karena dalam kebanyakan kasus yang ingin Anda refactory ke dalam komponen.

Direktif Pengubah .literal dihapus

Pengubah .literal sudah dihapus, karena hal yang sama dapat dilakukan dengan mudah memberikan strings literal sebagai nilainya.

Sebagai contoh, Anda bisa memperbaharui:

<p v-my-directive.literal="foo bar baz"></p>

Jadi:

<p v-my-directive="'foo bar baz'"></p>

Jalur upgrade

Jalankan alat bantu migrasi dari codebase Anda untuk mencari contoh-contoh pada direktif modifikasi `.literal`.

Transisi

Atribut transition diubah

Vue’s transition system has changed quite drastically and now uses <transition> and <transition-group> wrapper elements, rather than the transition attribute. It’s recommended to read the new Transitions guide to learn more.

Sistem transisi sistem sekarang sudah berganti cukup drastis dan sekarang menggunakan <transition> dan <transition-group> elemen pembungkus, daripada memakai atribut transisi. Di rekomendasikan untuk membaca dokumentasi terbaru tentang transisi untuk info lebih lanjut.

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk menemukan contoh penggunaan attribut transition.

Vue.transition untuk transisi yang dapat digunakan kembali diubah

Dengan sistem transisi yang terbaru anda dapat menggunakan komponen.

Jalur upgrade

Jalankan alat bantu migrasi di kode anda untuk menemukan contoh penggunaan attribut Vue.transition.

Transition stagger Attribute removed

Jika kamu ingin membuat transisi list stagger kamu dapat mengontrol timing dengan menyeting dan meng-akses data-index (atau attribut yang sama lain-nya) di dalam elemen. Lihat contoh disini.

Jalur upgrade

Jalankan alat bantu migrasi di dalam kode anda untuk menemukan contoh pneggunaan atribut transition. Saat aplikasi ter-update, kamu dapat mentransisikan ke dalam strategi `stagger` terbaru juga.

Events

opsi events dihapus

The events option has been removed. Event handlers should now be registered in the created hook instead. Check out the $dispatch and $broadcast migration guide for a detailed example.

Opsi events telah dihapuskan. Event handler untuk sekarang harus di registrasikan pada kait created. Cek dokumentasi migrasi $dispatch dan $broadcast

Vue.directive('on').keyCodes diganti

Cara baru dan ringkas untuk mengatur keyCodes ini adalah melalui Vue.config.keyCodes. Contoh :

// izinkan v-on:keyup.f1
Vue.config.keyCodes.f1 = 112

Jalur upgrade

Jalankan alat bantu migrasi di dalam kode anda untuk menemukan sintaks konfigurasi lama keyCode.

$dispatch dan $broadcast digantikan

$dispatch dan $broadcast sudah dihapuskan untuk lebih explisit saat melakukan komunikasi antar komponen dan menghasilakn state management yang lebih dapat di pelihara, contoh Vuex

Masalahnya adalah event yang mengalir tergantung pada struktur pohon komponen sangat sangatlah sulit untuk dipikirkan, sangat rapuh saat pohon komponen menjadi besar. Hal tersebut sangat susah untuk di-scaling dan hanya membuat sakit kepala pada nantinya. $dispatch dan $broadcast tidak juga menyelesaikan masalah sibling komponen (komponen yang menggunakan props value sama).

Salah satu contoh yang biasa digunakan pada methods ini adalah untuk berkomunikasi antara induk komponen dengan anak langsung induk komponen tersebut. Pada kasus berikut, kamu dapat menggunakan event $emit dari komponen anak menggunakan v-on. Ini membuatmu menjaga kenyamanan pada event dengan menambah secara ekplisit pada event tersebut.

Bagaimanapun itu, saat berkomunikasi antar komponen induk/anak yang jauh, $emit tidak dapat menolongmu. Untuk itu, solusi paling simple adalah dengan menggunakan event hub yang ter-sentralisasi. Cara ini menambahkan keuntungan dengan mengizinkan komunikasi antar komponen, dimanapun posisi komponen itu berada dalam struktur pohon komponen, dikarenakan instance Vue meng-implementasikan antar muka event emitter, kamu sebenarnya dapat menggunakan instance Vue kosong untuk hal ini.

Contoh, katakanlah kita mempunyai sebuah todo app terstruktur seperti berikut:

Todos
├─ NewTodoInput
└─ Todo
   └─ DeleteTodoButton

Kita dapat mengelola komunikasi antar komponen dengan satu event hub:

// Ini adalah event hub yang kita
// gunakan untuk berkomunu kasi antar komponen
var eventHub = new Vue()

Then in our components, we can use $emit, $on, $off to emit events, listen for events, and clean up event listeners, respectively:

Lalu di dalam komponen, kita dapat menggunakan $emit, $on, $off untuk memasukan event, mendengar event, dan menghapus event, dengan benar:

// NewTodoInput
// ...
methods: {
  addTodo: function () {
    eventHub.$emit('add-todo', { text: this.newTodoText })
    this.newTodoText = ''
  }
}
// DeleteTodoButton
// ...
methods: {
  deleteTodo: function (id) {
    eventHub.$emit('delete-todo', id)
  }
}
// Todos
// ...
created: function () {
  eventHub.$on('add-todo', this.addTodo)
  eventHub.$on('delete-todo', this.deleteTodo)
},
// Sangat disarankan untuk menghapus *Event.listener* sebelum \
// komponen di hancurkan (sebelum kait `destroyed`)
beforeDestroy: function () {
  eventHub.$off('add-todo', this.addTodo)
  eventHub.$off('delete-todo', this.deleteTodo)
},
methods: {
  addTodo: function (newTodo) {
    this.todos.push(newTodo)
  },
  deleteTodo: function (todoId) {
    this.todos = this.todos.filter(function (todo) {
      return todo.id !== todoId
    })
  }
}

Pola ini dapat digunakan sebagai ganti $dispatch dan $broadcast pada skenario yang mudah, untuk kasus yang lebih komplex, direkomendasikan menggunakan state management sendiri seperti Vuex.

jalur upgrade

Jalankan alat bantu migrasidi dalam kode anda untuk menemukan sintaks $dispatch dan $broadcast.

Filter

Filter di Luar Interpolasi Teks dihapuskan

Filter sekarang hanya dapat digunakan dalam interpolasi text ({{ }} tags). Pada dulunya kita menemukan bahwa menggunakan filter didalam directive seperti v-model, v-on, etc malah mendatangkan kompleksitas daripada kenyamanan. Untuk filter list pada v-for juga lebih baik memindahkan filter sebagai computed properties, jadi dapat digunakan kembali di seluruh komponen.

Secara umum, dimana sesuatu dapat dicapai dengan Javascript biasa, kita ingin menghindari sintaks spesial seperti filter untuk menangani hal yang secara umum sama. Berikut adalah cara bagaimana kamu dapat mengganti filter directive bawaan pada Vue:

Menggantikan Filter debounce

Daripada menggunakan:

<input v-on:keyup="doStuff | debounce 500">
methods: {
  doStuff: function () {
    // ...
  }
}

Gunakan lodash’s debounce (atau mungkin throttle) untuk melimitasi memanggil method yang berat. Kamu dapat menggunakan ini untuk mendapatkan hasil sama seperti diatas:

<input v-on:keyup="doStuff">
methods: {
  doStuff: _.debounce(function () {
    // ...
  }, 500)
}

Untuk lebih lanjut tentang kelebihan strategi ini, lihat the example here with v-model.

Menggantikan filter limitBy

Daripada menggunakan:

<p v-for="item in items | limitBy 10">{{ item }}</p>

gunakan Javascript .slice method pada computed property:

<p v-for="item in filteredItems">{{ item }}</p>
computed: {
  filteredItems: function () {
    return this.items.slice(0, 10)
  }
}

Menggantikan filter filterBy

Daripada menggunakan:

<p v-for="user in users | filterBy searchQuery in 'name'">{{ user.name }}</p>

Gunakan Javascript .filter method pada computed property:

<p v-for="user in filteredUsers">{{ user.name }}</p>
computed: {
  filteredUsers: function () {
    var self = this
    return self.users.filter(function (user) {
      return user.name.indexOf(self.searchQuery) !== -1
    })
  }
}

Method Javascript .filter juga dapat mengelola operasi penyaringan yang lebih kompleks. Sebagai contoh, jika kamu ingin menemukan setiap user
yang aktif secara case-sensitive cocok dengan nama dan email mereka:

var self = this
self.users.filter(function (user) {
  var searchRegex = new RegExp(self.searchQuery, 'i')
  return user.isActive && (
    searchRegex.test(user.name) ||
    searchRegex.test(user.email)
  )
})

Menggantikan filter orderBy

Daripada menggunakan:

<p v-for="user in users | orderBy 'name'">{{ user.name }}</p>

Gunakan lodash’s orderBy (atau sortBy) pada computed property:

<p v-for="user in orderedUsers">{{ user.name }}</p>
computed: {
  orderedUsers: function () {
    return _.orderBy(this.users, 'name')
  }
}

You can even order by multiple columns:

_.orderBy(this.users, ['name', 'last_login'], ['asc', 'desc'])

jalur upgrade

Jalankan alat bantu migrasidi dalam kode anda untuk menemukan contoh filter yang digunakan dalam direktif. Jika kamu melupakan salah satu lihat juga konsol galat

Filter Argumen Sintaks diganti

Sintaks filters untuk argumen sekarang lebih selaras dengan fungsi invokasi pada Javascript.

<p>{{ date | formatDate 'YY-MM-DD' timeZone }}</p>

kita kelilingi argumen dengan tanda kurung dan membatasi argumen dengan koma:

<p>{{ date | formatDate('YY-MM-DD', timeZone) }}</p>

jalur Upgrade

Jalankan alat bantu migrasi di dalam kode anda untuk menemukan filter. Jika kamu melewatkannya , silahkan lihat pada konsol galat.

Filter text bawaan dihapuskan

Walaupun filter pada interpolasi teks masih diperbolehkan, semua filter telah dihapuskan. Sebagai gantinya, sangat di rekomendasikan untuk menggunakan pustaka khusus untuk memecahkan problem pada setiap domain (contoh: date-fns untuk men-format tanggal dan accounting untuk mata uang)

For each of Vue’s built-in text filters, we go through how you can replace them below. The example code could exist in custom helper functions, methods, or computed properties.

Untuk setiap direktif filter bawaan Vue, kita mambahas bagaimana kamu dapat menggantinya dibawah ini. Contoh kode dapat ada pada fungsi kastem, method, ataupun computed properties

Menggantikan Filter json

Kamu sebenarnya tidak membuhtukan ini untuk debugging lagi, Vue otomatis akan mem-format output baik itu teks, angka, array, maupun sebuah objek. Jika kamu ingin mendapatkan fungsionalitas yang sama maka fungsi JSON.stringify dapat membantu, dan kamu dapat menggunakannya pada method atau computed properties

Menggantikan Filter capitalize

text[0].toUpperCase() + text.slice(1)

Menggantikan Filter uppercase

text.toUpperCase()

Menggantikan Filter lowercase

text.toLowerCase()

Menggantikan Filter pluralize

Paket pluralize di NPM dapat digunakan untuk tujuan ini, tapi jika kamu ingin menjamakkan beberapa kata spesifik atau sebuah keluaran khusus seperti saat mendapatkan 0, maka kamu dapat mendefinisikan fungsi jamak-mu sendiri:

function pluralizeKnife (count) {
  if (count === 0) {
    return 'no knives'
  } else if (count === 1) {
    return '1 knife'
  } else {
    return count + 'knives'
  }
}

Replacing the currency Filter

Untuk implementasi yang sangat naif, kamu dapat melakukan dengan cara ini

'$' + price.toFixed(2)

Walau di banyak kasus, kamu akan menemukan perilaku aneh (contoh: 0.035.toFixed(2) dibulatkan ke atas menjadi 0.04, tapi 0.045 dibulatkan kebawah menjadi 0.04), Untuk itu kamu dapat menggunakan pustaka accounting untuk menformat mata uang.

Jalur Upgrade

Jalankan alat bantu migrasidi dalam kode anda dan temukan filter text yang dihapuskan. Jika kamu melewatkan sesuatu, lihatlah pada konsol galat.

Filter Dua Arah diganti

Beberapa pengguna nyaman menggunakan filter 2 arah dengan v-model untuk membuat isian unik dengan kode yang sedikit. Walaupun kelihatannya mudah tetapi, filter 2 arah juga menyembunyikan kompleksitas yang besar - dan bahkan mendukung UX yang sangat buruk dengan menunda memperbaharui state. Sebagai gantinya, komponen yang membungkus isian sangat di rekomendasikan sebagai cara eksplisit dan kaya fitur untuk membuat isian kastem.

Sebagai contoh, kita akan melakukan migrasi filter dua arah pada mata uang:

Contoh itu hampir berkerja dengan baik, tapi penundaan pembaharuan state dapat menyebabkan perilaku aneh. Contoh, klik pada tab Result dan coba isikan 9.999 pada salah satu isian tersebut. Pada saat isian hilang fokus-nya, nilai pdaa isian akan berubah ke $10.00. Tapi pada saat melihat total kalkulasi yang tersimpan pada data menunjukan ‘9.999’. Versi realitas yang dilihat user kita tidak sinkron.

Untuk memulai transisi kedepannya dengan solusi yang lebih mudah di Vue 2.0 mari kira bungkus filter ini pada komponen <currency-input>:

This allows us add behavior that a filter alone couldn’t encapsulate, such as selecting the content of an input on focus. Now the next step will be to extract the business logic from the filter. Below, we pull everything out into an external currencyValidator object:

Ini memungkinkan kita untuk menambahkan perilaku yang tidak dapat diringkas, seperti memilih konten dari sebuah isian yang sedang kondisi fokus. Langkah selanjutnya adalah meng-ekstrak logis bisnis pada filter. Dibawah, ini kita menarik keluar semuanya menjadi objek currencyValidator:

Ini menambahkan modularitas, tidak hanya membuat mudah untuk migrasi ke Vue 2, tapi juga memungkinkan penguraian mata uang dan format dapat:

Setelah validator ini diekstrak, kita juga dapat menggunakannya untuk memecahnkan solusi solusi yang lain. Keanehan pada state sudah dieliminasi dan sebenarnya ini tidak memungkinkan pengguna untuk memasukan isian yang salah, seperti pada isian asli browser.

Kita masih terbatas, dengan filter dan Vue 1.0 secara umum, jadi mari kita selesaikan upgrade ke Vue 2.0:

Kamu mungkin memperhatikan bahwa:

Jalur Upgrade

Jalankan alat bantu migrasidi dalam kode anda dan temukan filter text yang dihapuskan. Jika kamu melewatkan sesuatu, lihatlah pada konsol galat.

Slot

Slot Duplikat dihapuskan

It is no longer supported to have <slot>s with the same name in the same template. When a slot is rendered it is “used up” and cannot be rendered elsewhere in the same render tree. If you must render the same content in multiple places, pass that content as a prop.

Vue tidak lagi mendukung adanya <slot> dengan nama yang sama di template yang sama. Saat slot di render slot akan “terpakai” dan tidak dapat di render kembali pada pohon render yang sama. Jika kamu harus merender konten yang sama di beberapa tempat, lempar konten tersebut sebagai prop.

Jalur Upgrade

Jalankan *end-to-end* tes kamu atau aplikasimu setelah upgrade dan cari peringatan pada konsol tentang duplikat slot v-model.

Atribut gaya pada slot removed

Konten yang dimasukan lewat <slot> bernama sudah tidak lagi menjaga atribut slot. Gunakan elemen pembungkus untuk memberikan gaya, atau untuk kasus penggunaan lanjutan, ubah konten yang dimasukan secara terprogram dengan render functions.

Jalur upgrade

Jalankan alat bantu migrasi dalam kode anda find untuk menemukan gaya CSS yang menargetkan slot bernama (contoh: [slot="my-slot-name"]).

Attribut Spesial

keep-alive Attribute replaced

keep-alive is no longer a special attribute, but rather a wrapper component, similar to <transition>. For example:

keep-alive sekarang sudah tidak termasuk attribut spesial, tetapi sebuah komponen pembungkus, sama halnya seperti <transition>. Contoh:

<keep-alive>
  <component v-bind:is="view"></component>
</keep-alive>

Ini membuat attribut keep-alive dapat digunakan pada banyak komponen anak berkondisi:

<keep-alive>
  <todo-list v-if="todos.length > 0"></todo-list>
  <no-todos-gif v-else></no-todos-gif>
</keep-alive>

Saat <keep-alive> mempunyai banyak komponen anak, mereka pada akhirnya harus mengevaluasi pada satu anak komponen. Komponen anak mana pun selain yang pertama akan diabaikan.

Saat digunakan bersama <transition>, pastikan ada di dalam komponen tersebut:

<transition>
  <keep-alive>
    <component v-bind:is="view"></component>
  </keep-alive>
</transition>

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan atributkeep-alive.

interpolasi

Interpolasi diantara atribut dihapuskan

Interpolasi diantara atribut sudah tidak lagi valid. Sebagai contoh:

<button class="btn btn-{{ size }}"></button>

Harus diperbaharui untuk menggunakan ekspresi sebaris:

<button v-bind:class="'btn btn-' + size"></button>

Atau sebagai data/properti computed

<button v-bind:class="buttonClasses"></button>
computed: {
  buttonClasses: function () {
    return 'btn btn-' + size
  }
}

Upgrade Path

Run the migration helper on your codebase to find examples of interpolation used within attributes.

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh interpolasi yang digunakan diantara atribut.

Interpolasi HTML dihapuskan

Interpolasi ({{{ foo }}}) telah dihapuskan demi v-html directive.

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh interpolasi pada HTML.

Satu kali binding digantikan

Satu kali binding ({{* foo }}) telah digantikan oleh v-once directive.

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan binding satu kali.

Reaktifitas

vm.$watch digantikan

Pengamat (Watchers) yang dibuat dengan vm.$watch sekarang terpanggil sebelum komponen yang terasosiasi di render. Ini memberikanmu untuk lebih lanjut memperbaharui state sebelum komponen di render, sehingga menghindari pembaharuan yang tidak perlu. Contoh, kamu dapat memantau properti (prop) sebuah komponen dan memperbaharui data saat properti komponen berubah.

Jika kamu sebelumnya bergantung pada vm.$watch untuk melakukan sesuatu dalam DOM setelah komponen diperbaharui, kamu dapat juga melakukannya pada updated kait suklus hidup Vue.

Jalur upgrade

Jalankan end-to-end test anda, jika kamu memilikinya. Tes yang gagal akan memperingatkanmu jika pengamat (watcher) masih bergantung/menggunakan cara lama.

vm.$set digantikan

vm.$set sekarang adalah padanan dari Vue.set.

Jalur upgrade

Jalankan alat bantu migrasi pada kode untuk menemukan contoh penggunaan yang sudah usang.

vm.$delete digantikan

vm.$delete sekarang merupakan padanan dari Vue.delete.

Jalur upgrade

Jalankan alat bantu migrasi pada kode untuk menemukan contoh penggunaan yang sudah usang.

Array.prototype.$set dihapuskan

Gunakan Vue.set sebagai gantinya.

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh .$set pada array. Jika kamu melewatkannya , silahkan lihat pada konsol galat dari metode yang hilang.

Array.prototype.$remove dihapuskan

Gunakan Array.prototype.splice sebagai gantinya. Contoh:

methods: {
  removeTodo: function (todo) {
    var index = this.todos.indexOf(todo)
    this.todos.splice(index, 1)
  }
}

Atau lebih baik, berikan parameter index pada method hapus:

methods: {
  removeTodo: function (index) {
    this.todos.splice(index, 1)
  }
}

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh .$remove pada array. Jika kamu melewatkan sesuatu, coba lihat konsol galat dari method yang kamu lewatkan.

Vue.set dan Vue.delete pada instance Vue dihapuskan

Vue.set dan Vue.delete tidak dapat berkerja lagi pada instance Vue. Sekarang merupakan sebuah kewajiban untuk mendeklarasikan dengan benar properti reaktif tingkat-atas pada opsi data. Jika kamu ingin menghapus properti pada instance Vue atau $data setel ke nol (null).

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh Vue.set atau Vue.delete pada instance Vue. Jika kamu melewatkan sesuatu, hal tersebut akan menimbulkan peringatan pada konsol.

vm.$data dihapuskan

Mengantikan instance komponen pada akar $data sekarang telah dilarang. Ini mencegah beberapa kasus langka pada sistem reaktifitas Vue dan membuat state pada komponen lebih dapat di prediksi (khususnya dengan sistem pengecekan-tipe).

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh penimpaan vm.$data. Jika kamu melewatkannya, peringatan pada konsol akan dimunculkan.

vm.$get dihapuskan

Sebagai gantinya, mengambil data reaktif secara langsung.

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh vm.$get. Jika kamu melewatkan sesuatu, kamu akan melihat konsol galat.

Metode Instance DOM-terfokus (DOM-Focused Instance Methods)

vm.$appendTo dihapuskan

Gunakan API DOM asli (native):

myElement.appendChild(vm.$el)

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh vm.$appendTo. Jika kamu melewatkan sesuatu, kamu akan melihat galat pada konsol.

vm.$before dihapuskan

Gunakan API DOM asli (native):

myElement.parentNode.insertBefore(vm.$el, myElement)

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk melihat contoh vm.$before. Jika kamu melewatkan sesuatu, kamu akan melihat galat pada konsol.

vm.$after dihapuskan

Gunakan API DOM asli (native):

myElement.parentNode.insertBefore(vm.$el, myElement.nextSibling)

Atau jika myElement merupakan komponen anak terakhir

myElement.parentNode.appendChild(vm.$el)

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk melihat contoh vm.$after. Jika kamu melewatkan sesuatu, kamu kan melihat galat pada konsol.

vm.$remove dihapuskan

Gunakan API DOM asli (native):

vm.$el.remove()

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contohvm.$remove. Jika kamu melewatkan sesuatu, kamu akan melihat galat pada konsol.

Metode pada Meta Instance (Meta Instance Methods)

vm.$eval dihapuskan

Tidak ada gunanya. Jika kamu ternyata bergantung pada fitur ini dan tidak tahu bagaimana harus menggantinya, silahkan membuka obrolan pada forum Vue.js untuk ide.

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh vm.$eval. Jika kamu melewatkan sesuatu, kamu akan melihat galat pada konsol.

vm.$interpolate dihapuskan

Tidak ada gunanya. Jika kamu ternyata bergantung pada fitur ini dan tidak tahu bagaimana harus menggantinya, silahkan membuka obrolan pada forum Vue.js untuk ide.

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh vm.$interpolate. Jika kamu melewatkan sesuatu, kamu akan melihat galat pada konsol.

vm.$log dihapuskan

Gunakan Vue Devtools untuk pengalaman debugging yang optimal.

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh vm.$log. Jika kamu melewatkan sesuatu, kamu akan melihat galat pada konsol.

Opsi pada Instance DOM (Instance DOM Options)

replace: false dihapuskan

Tiap - tiap komponen sekarang selalu menggantikan element yang terkait dengan mereka. Untuk mengsimulasikan sifat dari replace: false, kamu dapat membungkus akar komponen dengan elemen yang sama terhadap elemen yang kamu ganti. Contoh:

new Vue({
  el: '#app',
  template: '<div id="app"> ... </div>'
})

Atau menggunakan fungsi render:

new Vue({
  el: '#app',
  render: function (h) {
    h('div', {
      attrs: {
        id: 'app',
      }
    }, /* ... */)
  }
})

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh replace: false.

Global Config

Vue.config.debug removed

No longer necessary, since warnings come with stack traces by default now.

Upgrade Path

Run the migration helper on your codebase to find examples of Vue.config.debug.

Vue.config.async removed

Async is now required for rendering performance.

Upgrade Path

Run the migration helper on your codebase to find examples of Vue.config.async.

Vue.config.delimiters replaced

This has been reworked as a component-level option. This allows you to use alternative delimiters within your app without breaking 3rd-party components.

Upgrade Path

Run the migration helper on your codebase to find examples of Vue.config.delimiters.

Vue.config.unsafeDelimiters removed

HTML interpolation has been removed in favor of v-html.

Upgrade Path

Run the migration helper on your codebase to find examples of Vue.config.unsafeDelimiters. After this, the helper will also find instances of HTML interpolation so that you can replace them with `v-html`.

API Global

Vue.extend dengan el dihapuskan

Opsi el sudah tidak dapat digunakan pada Vue.extend. Sekarang hal ini hanay valid sebagai opsi pembuatan instance.

Jalur upgrade

Jalankan end-to-end testing pada aplikasi anda atau setelah anda meng-update Vue cari peringatan pada konsol soal penggunaan opsi el dengan Vue.extend.

Vue.elementDirective dihapuskan

Gunakan komponen sebagai gantinya.

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh penggunaan dari Vue.elementDirective.

Vue.partial dihapuskan

Partials telah dihapus dengan alasan untuk menjaga aliran data antara komponen, menggunakan props komponen. Kecuali kamu menggunakan partial pada area yang memerlukan performa lebih, rekomendasi untuk masalah tersebut adalah dengan menggunakan komponen biasa sebagai gantinya. Jika kamu secara dinamis mengikat name dari sebuah partial, kamu dapat menggunakan komponen dinamis.

Jika kamu ternyata menggunakan partial di applikasi andad pada tempat yang membutuhkan performa lebih cepat, maka kamu harus ganti dengan komponen fungsional. Komponen tersebut harus di deklarasikan dengan JS/JSX file (bukan menggunakan .vue file) dan juga stateless dan instanceless, seperti partials. Ini membuat kecepatan render sangat cepat

Keuntungan menggunakan komponen fungsional daripada partial adalah komponen fungsional lebih dinamis, dikarenakan kamu dapat menggunakan javascript seutuhnya pada komponen. Tetapi ada juga hal yang harus di bayar saat menggunakan komponen fungsional. Jika kamu belum pernah menggunakan kerangka kerja dengan fungsi render sebelumnya, mungkin kamu perlu waktu agak lama untuk mempelajarinya.

Jalur upgrade

Jalankan alat bantu migrasi pada kode anda untuk menemukan contoh penggunaan Vue.partial.