系统定制开发Vue中watch(监听器)的用法详解(通俗易懂,简单明了)

官方解释:一个对象,系统定制开发键是需要观察的表达式,系统定制开发值是对应回调函数。系统定制开发值也可以是方法名,系统定制开发或者包含选项的对象。Vue 系统定制开发实例将会在实例化时调用 watch,遍历 watch 系统定制开发对象的每一个 属性。

示例:

  1. <template>
  2. <el-card class="box-card"><el-input v-model="name" style="width: 30%;"></el-input></el-card>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. name: '123'
  9. };
  10. }
  11. };
  12. </script>
  13. <style></style>

第一种:常规用法

(1)把要监听的name值看作方法名,来进行监听。【第一种写法】

  1. <template>
  2. <el-card class="box-card"><el-input v-model="name" style="width: 30%;"></el-input></el-card>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. name: '123'
  9. };
  10. },
  11. watch: {
  12. name(newVal, oldVal) {
  13. console.log('newVal', newVal);// 1234
  14. console.log('oldVal', oldVal);// 123
  15. }
  16. }
  17. };
  18. </script>
  19. <style></style>

(2)把要监听的name值看作对象,利用hanler方法来进行监听。【第二种写法】

  1. <template>
  2. <el-card class="box-card"><el-input v-model="name" style="width: 30%;"></el-input></el-card>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. name: '123'
  9. };
  10. },
  11. watch: {
  12. name:{
  13. handler(newVal,oldVal){
  14. console.log('newVal',newVal); // 1234
  15. console.log('oldVal',oldVal); // 123
  16. }
  17. }
  18. }
  19. };
  20. </script>
  21. <style></style>

以上两种写法是器的普通用法,这种用法有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有当值发生改变时才会执行。如果我们需要在最初绑定值的时侯,也执行监听函数,则就需要用到immediate属性。

下面,我们就往高级一点的用法上讲。

第二种:高级用法

比如,当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将属性设置为true,结合handler方法使用。

当设置immediate属性为true时,无论值是否发生改变,时刻都会监听;

当设置immediate属性为false时,常规用法,只有值发生改变才会监听。

  1. <template>
  2. <el-card class="box-card"><el-input v-model="name" style="width: 30%;"></el-input></el-card>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. name: '123'
  9. };
  10. },
  11. watch: {
  12. name: {
  13. handler(newVal, oldVal) {
  14. console.log('newVal', newVal);
  15. console.log('oldVal', oldVal);
  16. },
  17. immediate: true
  18. }
  19. }
  20. };
  21. </script>
  22. <style></style>

立即执行:

 值改变时:

第三种:超高级用法(deep 深度监听)

(1)监听普通变量的变化可以使用以上两种方法,但是要监听变量值是某对象的时候,则不起作用。

例如,我们监听form对象内部属性的变化,是监听不到的。

  1. <template>
  2. <el-card class="box-card"><el-input v-model="form.name" style="width: 30%;"></el-input></el-card>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. form: {
  9. name: '123'
  10. }
  11. };
  12. },
  13. watch: {
  14. form: {
  15. handler(newVal, oldVal) {
  16. console.log('newVal', newVal);
  17. console.log('oldVal', oldVal);
  18. }
  19. }
  20. }
  21. };
  22. </script>
  23. <style></style>

则,从结果来看,我们没有看到任何的输出打印,所以普通的watch方法无法监听到对象内部属性的变化。

那么,我们该怎么办才能监听到对象内部属性的变化呢?

watch方法提供了一个deep属性(深度监听),该属性可以监听到对象内部属性的改变。

  1. <template>
  2. <el-card class="box-card"><el-input v-model="form.name" style="width: 30%;"></el-input></el-card>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. form: {
  9. name: '123'
  10. }
  11. };
  12. },
  13. watch: {
  14. form: {
  15. handler(newVal, oldVal) {
  16. console.log('newVal', newVal);
  17. console.log('oldVal', oldVal);
  18. },
  19. deep: true
  20. }
  21. }
  22. };
  23. </script>
  24. <style></style>

 

设置deep: true 则可以监听到form的变化,如果form有较多属性的话,此时会给form的所有属性都会加上这个监听器,每个属性值的变化都会执行handler。 

当deep属性值为true时,就可以监听到对象属性内部的改变;

当deep属性值为false时,则监听不到。

(2)如果只需要监听对象中的某一个属性值时,我们可以使用:字符串的形式监听对象属性

这个监听过程,不需要使用deep去深度监听,就可以监听对象中某个属性的变化。

  1. <template>
  2. <el-card class="box-card"><el-input v-model="form.name" style="width: 30%;"></el-input></el-card>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. form: {
  9. name: '123'
  10. }
  11. };
  12. },
  13. watch: {
  14. 'form.name': {
  15. handler(newVal, oldVal) {
  16. console.log('newVal', newVal);
  17. console.log('oldVal', oldVal);
  18. }
  19. }
  20. }
  21. };
  22. </script>
  23. <style></style>

 第四种:扩展(监听数组)

(1)(一维、多维)数组的变化不需要深度监听

  1. <template>
  2. <el-card class="box-card"><el-input v-model="name" @input="inputFn" style="width: 30%;"></el-input></el-card>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. name: '123',
  9. arr1: [1, 2, 3],
  10. arr2: [1, 2, 3, [4, 5]]
  11. };
  12. },
  13. watch: {
  14. arr1(newVal, oldVal) {
  15. console.log('newVal1', newVal);
  16. console.log('oldVal1', oldVal);
  17. },
  18. arr2(newVal, oldVal) {
  19. console.log('newVal2', newVal);
  20. console.log('oldVal2', oldVal);
  21. }
  22. },
  23. methods: {
  24. inputFn(e) {
  25. this.arr1.push(e);
  26. this.arr2.push(e);
  27. }
  28. }
  29. };
  30. </script>
  31. <style></style>

 (2)数组对象中对象属性变化监测需要使用deep:true深度监听,多少层内产生变化都可以监测到。

  1. <template>
  2. <el-card class="box-card"><el-input v-model="name" @input="inputFn" style="width: 30%;"></el-input></el-card>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. name: '123',
  9. arr1: [
  10. {
  11. id: 1,
  12. sex: 11
  13. }
  14. ],
  15. arr2: [
  16. {
  17. id: 2,
  18. sex: 22,
  19. list: [
  20. {
  21. id: 3,
  22. sex: 33
  23. }
  24. ]
  25. }
  26. ]
  27. };
  28. },
  29. watch: {
  30. arr1: {
  31. handler(newVal, oldVal) {
  32. console.log('newVal1', newVal);
  33. console.log('oldVal1', oldVal);
  34. },
  35. deep: true
  36. },
  37. arr2: {
  38. handler(newVal, oldVal) {
  39. console.log('newVal2', newVal);
  40. console.log('oldVal2', oldVal);
  41. },
  42. deep: true
  43. }
  44. },
  45. methods: {
  46. inputFn(e) {
  47. this.arr1[0].sex = e;
  48. this.arr2[0].list[0].sex = e;
  49. }
  50. }
  51. };
  52. </script>
  53. <style></style>

 

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发