立即执行

‘watch’是在监听属性改变时才会触发,有些时候,我们希望在组件创建后’watch’能够立即执行,可能想到的方法就是在’create’生命周期中调用一次,但这样的写法不优雅,或许我们可以使用这样的方法:

  1. export default {
  2. data() {
  3. return {
  4. name: 'jow',
  5. }
  6. },
  7. watch: {
  8. name: {
  9. handler: 'sayName',
  10. immediate: true,
  11. },
  12. },
  13. methods: {
  14. sayName() {
  15. console.log(this.name)
  16. },
  17. },
  18. }

深度监听

在监听对象时,对象北部属性被该变时无法触发’watch’,我们可以为其设置深度监听。

  1. export default {
  2. data() {
  3. return {
  4. student: {
  5. name: 'Joe',
  6. skill: {
  7. run: {
  8. speed: 'fast',
  9. },
  10. },
  11. },
  12. }
  13. },
  14. watch: {
  15. student: {
  16. handler: 'sayName',
  17. deep: true,
  18. },
  19. },
  20. methods: {
  21. sayName() {
  22. console.log(this.student)
  23. },
  24. },
  25. }

触发监听执行多个方法

使用数组可以设置多项,形式包括字符串、函数、对象

  1. export default {
  2. data: {
  3. name: 'Joe',
  4. },
  5. watch: {
  6. name: [
  7. 'sayName1',
  8. function (newVal, oldVal) {
  9. this.sayName2()
  10. },
  11. {
  12. handler: 'sayName3',
  13. immaediate: true,
  14. },
  15. ],
  16. },
  17. methods: {
  18. sayName1() {
  19. console.log('sayName1==>', this.name)
  20. },
  21. sayName2() {
  22. console.log('sayName2==>', this.name)
  23. },
  24. sayName3() {
  25. console.log('sayName3==>', this.name)
  26. },
  27. },
  28. }

文档:https://cn.vuejs.org/v2/api/#watch

watch 监听多个变量

watch 本身无法监听多个变量。但我们可以将需要监听的多个变量通过计算属性返回对象,再监听这个对象来实现“监听多个变量”

  1. export default {
  2. data() {
  3. return { msg1: 'apple', msg2: 'banana' }
  4. },
  5. compouted: {
  6. msgObj() {
  7. const { msg1, msg2 } = this
  8. return {
  9. msg1,
  10. msg2,
  11. }
  12. },
  13. },
  14. watch: {
  15. msgObj: {
  16. handler(newVal, oldVal) {
  17. if (newVal.msg1 != oldVal.msg1) {
  18. console.log('msg1 is change')
  19. }
  20. if (newVal.msg2 != oldVal.msg2) {
  21. console.log('msg2 is change')
  22. }
  23. },
  24. deep: true,
  25. },
  26. },
  27. }