Vue 3.0 實例方法

2021-11-03 16:29 更新

#$watch

  • 參數(shù):

  • {string | Function} source

  • {Function | Object} callback

  • {Object} [options]

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

  • 返回:{Function} unwatch

  • 用法:

偵聽組件實例上的響應式 property 或函數(shù)計算結果的變化。回調(diào)函數(shù)得到的參數(shù)為新值和舊值。我們只能將頂層的 data、propcomputed property 名作為字符串傳遞。對于更復雜的表達式,用一個函數(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. // 做點什么
  16. })
  17. // 用于監(jiān)視單個嵌套property 的函數(shù)
  18. this.$watch(
  19. () => this.c.d,
  20. (newVal, oldVal) => {
  21. // 做點什么
  22. }
  23. )
  24. // 用于監(jiān)視復雜表達式的函數(shù)
  25. this.$watch(
  26. // 表達式 `this.a + this.b` 每次得出一個不同的結果時
  27. // 處理函數(shù)都會被調(diào)用。
  28. // 這就像監(jiān)聽一個未被定義的計算屬性
  29. () => this.a + this.b,
  30. (newVal, oldVal) => {
  31. // 做點什么
  32. }
  33. )
  34. }
  35. })

當偵聽的值是一個對象或者數(shù)組時,對其屬性或元素的任何更改都不會觸發(fā)偵聽器,因為它們引用相同的對象/數(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. // 這些方法不會觸發(fā)偵聽器,因為我們只更改了Object/Array的一個property,
  20. // 不是對象/數(shù)組本身
  21. changeArticleText() {
  22. this.article.text = 'Vue 3 is awesome'
  23. },
  24. addComment() {
  25. this.comments.push('New comment')
  26. },
  27. // 這些方法將觸發(fā)偵聽器,因為我們完全替換了對象/數(shù)組
  28. changeWholeArticle() {
  29. this.article = { text: 'Vue 3 is awesome' }
  30. },
  31. clearComments() {
  32. this.comments = []
  33. }
  34. }
  35. })

$watch 返回一個取消偵聽函數(shù),用來停止觸發(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()

  • 選項:deep

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

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

  • 選項:immediate

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

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

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

  1. // 這會導致報錯
  2. const unwatch = vm.$watch(
  3. 'value',
  4. function() {
  5. doSomething()
  6. unwatch()
  7. },
  8. { immediate: true }
  9. )

如果你仍然希望在回調(diào)內(nèi)部調(diào)用一個取消偵聽的函數(shù),你應該先檢查其函數(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選項允許更好地控制回調(diào)的時間。它可以設置為pre、postsync

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

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

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

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

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

sync觀察者應該謹慎使用,因為他們沒有這些好處。

  1. 有關`flush`的詳細信息,請參見[效果刷新計時](http://www.o2fo.com/vuejs3/vuejs3-35qs3f4h.html)。

#$emit

  • 參數(shù):

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

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

  • 示例:

只配合一個事件名使用 $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

  • 用法:

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

#$nextTick

  • 參數(shù):

  • {Function} [callback]

  • 用法:

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

  • 示例:

  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)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號