Vue 3.0 實(shí)例方法

2021-11-03 16:29 更新

#$watch

  • 參數(shù):

  • {string | Function} source

  • {Function | Object} callback

  • {Object} [options]

  • {boolean} deep
  • {boolean} immediate
  • {string} flush

  • 返回:{Function} unwatch

  • 用法:

偵聽(tīng)組件實(shí)例上的響應(yīng)式 property 或函數(shù)計(jì)算結(jié)果的變化?;卣{(diào)函數(shù)得到的參數(shù)為新值和舊值。我們只能將頂層的 data、propcomputed property 名作為字符串傳遞。對(duì)于更復(fù)雜的表達(dá)式,用一個(gè)函數(shù)取代。

  • 示例:

  1. const app = Vue.createApp({
  2. data() {
  3. return {
  4. a: 1,
  5. b: 2,
  6. c: {
  7. d: 3,
  8. e: 4
  9. }
  10. }
  11. },
  12. created() {
  13. // 頂層property 名
  14. this.$watch('a', (newVal, oldVal) => {
  15. // 做點(diǎn)什么
  16. })
  17. // 用于監(jiān)視單個(gè)嵌套property 的函數(shù)
  18. this.$watch(
  19. () => this.c.d,
  20. (newVal, oldVal) => {
  21. // 做點(diǎn)什么
  22. }
  23. )
  24. // 用于監(jiān)視復(fù)雜表達(dá)式的函數(shù)
  25. this.$watch(
  26. // 表達(dá)式 `this.a + this.b` 每次得出一個(gè)不同的結(jié)果時(shí)
  27. // 處理函數(shù)都會(huì)被調(diào)用。
  28. // 這就像監(jiān)聽(tīng)一個(gè)未被定義的計(jì)算屬性
  29. () => this.a + this.b,
  30. (newVal, oldVal) => {
  31. // 做點(diǎn)什么
  32. }
  33. )
  34. }
  35. })

當(dāng)偵聽(tīng)的值是一個(gè)對(duì)象或者數(shù)組時(shí),對(duì)其屬性或元素的任何更改都不會(huì)觸發(fā)偵聽(tīng)器,因?yàn)樗鼈円孟嗤膶?duì)象/數(shù)組:

  1. const app = Vue.createApp({
  2. data() {
  3. return {
  4. article: {
  5. text: 'Vue is awesome!'
  6. },
  7. comments: ['Indeed!', 'I agree']
  8. }
  9. },
  10. created() {
  11. this.$watch('article', () => {
  12. console.log('Article changed!')
  13. })
  14. this.$watch('comments', () => {
  15. console.log('Comments changed!')
  16. })
  17. },
  18. methods: {
  19. // 這些方法不會(huì)觸發(fā)偵聽(tīng)器,因?yàn)槲覀冎桓牧薕bject/Array的一個(gè)property,
  20. // 不是對(duì)象/數(shù)組本身
  21. changeArticleText() {
  22. this.article.text = 'Vue 3 is awesome'
  23. },
  24. addComment() {
  25. this.comments.push('New comment')
  26. },
  27. // 這些方法將觸發(fā)偵聽(tīng)器,因?yàn)槲覀兺耆鎿Q了對(duì)象/數(shù)組
  28. changeWholeArticle() {
  29. this.article = { text: 'Vue 3 is awesome' }
  30. },
  31. clearComments() {
  32. this.comments = []
  33. }
  34. }
  35. })

$watch 返回一個(gè)取消偵聽(tīng)函數(shù),用來(lái)停止觸發(fā)回調(diào):

  1. const app = Vue.createApp({
  2. data() {
  3. return {
  4. a: 1
  5. }
  6. }
  7. })
  8. const vm = app.mount('#app')
  9. const unwatch = vm.$watch('a', cb)
  10. // later, teardown the watcher
  11. unwatch()

  • 選項(xiàng):deep

為了發(fā)現(xiàn)對(duì)象內(nèi)部值的變化,可以在選項(xiàng)參數(shù)中指定 deep: true。注意監(jiān)聽(tīng)數(shù)組的變更不需要這么做。

  1. vm.$watch('someObject', callback, {
  2. deep: true
  3. })
  4. vm.someObject.nestedValue = 123
  5. // callback is fired

  • 選項(xiàng):immediate

在選項(xiàng)參數(shù)中指定 immediate: true 將立即以表達(dá)式的當(dāng)前值觸發(fā)回調(diào):

  1. vm.$watch('a', callback, {
  2. immediate: true
  3. })
  4. // 立即以 `a` 的當(dāng)前值觸發(fā) `callback`

注意,在帶有 immediate 選項(xiàng)時(shí),你不能在第一次回調(diào)時(shí)取消偵聽(tīng)給定的 property。

  1. // 這會(huì)導(dǎo)致報(bào)錯(cuò)
  2. const unwatch = vm.$watch(
  3. 'value',
  4. function() {
  5. doSomething()
  6. unwatch()
  7. },
  8. { immediate: true }
  9. )

如果你仍然希望在回調(diào)內(nèi)部調(diào)用一個(gè)取消偵聽(tīng)的函數(shù),你應(yīng)該先檢查其函數(shù)的可用性:

  1. let unwatch = null
  2. unwatch = vm.$watch(
  3. 'value',
  4. function() {
  5. doSomething()
  6. if (unwatch) {
  7. unwatch()
  8. }
  9. },
  10. { immediate: true }
  11. )

  • Option: flush

flush選項(xiàng)允許更好地控制回調(diào)的時(shí)間。它可以設(shè)置為pre、postsync。

默認(rèn)值為pre,它指定在呈現(xiàn)之前應(yīng)調(diào)用回調(diào)。這允許回調(diào)在模板運(yùn)行之前更新其他值。

post可用于將回調(diào)延遲到呈現(xiàn)之后。如果回調(diào)需要通過(guò)$refs訪問(wèn)更新的DOM或子組件,則應(yīng)使用此選項(xiàng)。

如果flush設(shè)置為sync,則只要值發(fā)生更改,就會(huì)同步調(diào)用回調(diào)。

對(duì)于prepost,回調(diào)都使用隊(duì)列進(jìn)行緩沖?;卣{(diào)只會(huì)添加到隊(duì)列一次,即使關(guān)注的值更改多次。臨時(shí)值將被跳過(guò),不會(huì)傳遞給回調(diào)。

緩沖回調(diào)不僅可以提高性能,而且有助于確保數(shù)據(jù)一致性。在執(zhí)行數(shù)據(jù)更新的代碼完成之前,不會(huì)觸發(fā)監(jiān)視程序。

sync觀察者應(yīng)該謹(jǐn)慎使用,因?yàn)樗麄儧](méi)有這些好處。

  1. 有關(guān)`flush`的詳細(xì)信息,請(qǐng)參見(jiàn)[效果刷新計(jì)時(shí)](http://www.o2fo.com/vuejs3/vuejs3-35qs3f4h.html)。

#$emit

  • 參數(shù):

  • {string} eventName
  • [...args]

觸發(fā)當(dāng)前實(shí)例上的事件。附加參數(shù)都會(huì)傳給監(jiān)聽(tīng)器回調(diào)。

  • 示例:

只配合一個(gè)事件名使用 $emit:

  1. <div id="emit-example-simple">
  2. <welcome-button v-on:welcome="sayHi"></welcome-button>
  3. </div>

  1. const app = Vue.createApp({
  2. methods: {
  3. sayHi() {
  4. console.log('Hi!')
  5. }
  6. }
  7. })
  8. app.component('welcome-button', {
  9. template: `
  10. <button v-on:click="$emit('welcome')">
  11. Click me to be welcomed
  12. </button>
  13. `
  14. })
  15. app.mount('#emit-example-simple')

配合額外的參數(shù)使用 $emit

  1. <div id="emit-example-argument">
  2. <advice-component v-on:give-advice="showAdvice"></advice-component>
  3. </div>

  1. const app = Vue.createApp({
  2. methods: {
  3. showAdvice(advice) {
  4. alert(advice)
  5. }
  6. }
  7. })
  8. app.component('advice-component', {
  9. data() {
  10. return {
  11. adviceText: 'Some advice'
  12. }
  13. },
  14. template: `
  15. <div>
  16. <input type="text" v-model="adviceText">
  17. <button v-on:click="$emit('give-advice', adviceText)">
  18. Click me for sending advice
  19. </button>
  20. </div>
  21. `
  22. })

  • 參考

#$forceUpdate

  • 用法:

迫使組件實(shí)例重新渲染。注意它僅僅影響實(shí)例本身和插入插槽內(nèi)容的子組件,而不是所有子組件。

#$nextTick

  • 參數(shù):

  • {Function} [callback]

  • 用法:

將回調(diào)延遲到下次 DOM 更新循環(huán)之后執(zhí)行。在修改數(shù)據(jù)之后立即使用它,然后等待 DOM 更新。它跟全局方法 nextTick 一樣,不同的是回調(diào)的 this 自動(dòng)綁定到調(diào)用它的實(shí)例上。

  • 示例:

  1. Vue.createApp({
  2. // ...
  3. methods: {
  4. // ...
  5. example() {
  6. // modify data
  7. this.message = 'changed'
  8. // DOM is not updated yet
  9. this.$nextTick(function() {
  10. // DOM is now updated
  11. // `this` is bound to the current instance
  12. this.doSomethingElse()
  13. })
  14. }
  15. }
  16. })

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)