当前位置:   article > 正文

Vue中的浅监听,深度监听,同时监听多个属性_vue basic-container

vue basic-container

(1)Vue中Watch深度监听某个对象:

           有个原则监听谁,写谁的名字,然后是对应的执行函数, 第一个参数为最新的改变值,第二个值为上一次改变的值,

           注意: 除了监听 data,也可以监听计算属性 或者一个 函数的计算结果

  1. <template>
  2. <div class="user">
  3. <basic-container>
  4. <!-- 观察数据为字符串或数组-->
  5.    <input v-model="userName"/>
  6.    <input v-model="age"/>
  7.    <!--当数据subjects为对象时,如果键值发生变化,为了监听到数据变化,需要添加deep:true参数 -->
  8.    <input v-model="subjects.score"/>
  9. </basic-container>
  10. </div>
  11. </template>
  12. <script>
  13. import {mapGetters} from "vuex";
  14. export default {
  15. name: "table_payorder",
  16. data() {
  17. return {
  18. // 学生
  19. userName:'zhangsan',
  20. age:'30',
  21. subjects: { // 科目
  22. courseName: '语文',
  23. score : 50 // 分数
  24. }
  25. };
  26. },
  27. computed: {
  28. },
  29. watch: {
  30. // 监听姓名属性
  31. userName(newValue,oldValue){ // 监听那个属性,方法名为改属性
  32. console.info(oldValue+" 同学改名为:"+newValue);
  33. },
  34. // 监听年龄变化
  35. age: 'changeAge', // 值可以为函数名称
  36. //注意:当监听的数据为对象或数组时,newValue和oldValue是相等的,因为这两个形参指向的是同一个最新的数据对象
  37. subjects:{
  38. handler(newValue,oldValue){
  39. console.info(JSON.stringify(oldValue)+" 成绩发生变化:"+JSON.stringify(newValue));
  40. },
  41. deep:true // deep 为true 意味着开启了深度监听 a对象里面任何数据变化都会触发handler函数,
  42. }
  43. },
  44. created() {
  45. },
  46. methods: {
  47. // 这里书写说的方法
  48. changeAge(newValue,oldValue){
  49. console.info(oldValue+" 年龄为:"+newValue);
  50. }
  51. }
  52. };
  53. </script>

(2)深度监听对象的两种实现方式

  2.1字符串嵌套

   

  1. <template>
  2.     <div class="user">
  3.         <basic-container>
  4.           <!-- 观察数据为字符串或数组-->
  5.         <input v-model="userName"/>
  6.         <input v-model="age"/>
  7.         <!--当数据subjects为对象时,如果键值发生变化,为了监听到数据变化,需要添加deep:true参数 -->
  8.         <input v-model="subjects.score"/>
  9.           <input v-model="currentAddress.b.c.address"/>
  10.         </basic-container>
  11.     </div>
  12. </template>
  13. <script>
  14.     import {mapGetters} from "vuex";
  15.     export default {
  16.         name"table_payorder",
  17.         data() {
  18.             return { 
  19.                 // 学生
  20.                 userName:'zhangsan',
  21.                 age:'30',
  22.                 subjects: { // 科目
  23.                     courseName'语文',
  24.                     score : 50 // 分数
  25.                 },
  26.                 currentAddress:{
  27.                     b:{
  28.                         c:{
  29.                             address'北京市'
  30.                         }
  31.                     }
  32.                 }
  33.             };
  34.         },
  35.         computed: {
  36.         },
  37.         watch: {
  38.             // 监听姓名属性
  39.            userName(newValue,oldValue){ // 监听那个属性,方法名为改属性
  40.               console.info(oldValue+" 同学改名为:"+newValue);
  41.            },
  42.            // 监听年龄变化
  43.            age'changeAge'// 值可以为函数名称
  44.            //注意:当监听的数据为对象或数组时,newValue和oldValue是相等的,因为这两个形参指向的是同一个最新的数据对象
  45.            subjects:{
  46.                handler(newValue,oldValue){
  47.                   console.info(JSON.stringify(oldValue)+" 成绩发生变化:"+JSON.stringify(newValue));
  48.                },
  49.                deep:true // deep 为true  意味着开启了深度监听subjects对象里面任何数据变化都会触发handler函数,
  50.            },
  51.            // /想监听 address 此时 数据 是 currentAddress.b.c.address  比较深   深度监听
  52.            // 用这种写法,就不要使用简写了(一定要用单引号或者双引号括起来)
  53.            'currentAddress.b.c.address' : function(newValue,oldValue){
  54.                  console.info(JSON.stringify(oldValue)+" 当前居住地变化:"+JSON.stringify(newValue));
  55.            }
  56.         },
  57.         created() {
  58.         },
  59.         methods: {
  60.         }
  61.     };
  62. </script>

2.2 启用深度监听方式

  1.  <template>
  2. <div class="user">
  3. <basic-container>
  4. <!-- 观察数据为字符串或数组-->
  5.    <input v-model="userName"/>
  6.    <input v-model="age"/>
  7.    <!--当数据subjects为对象时,如果键值发生变化,为了监听到数据变化,需要添加deep:true参数 -->
  8.    <input v-model="subjects.score"/>
  9. <input v-model="currentAddress.b.c.address"/>
  10. </basic-container>
  11. </div>
  12. </template>
  13. <script>
  14. import {mapGetters} from "vuex";
  15. export default {
  16. name: "table_payorder",
  17. data() {
  18. return {
  19. // 学生
  20. userName:'zhangsan',
  21. age:'30',
  22. subjects: { // 科目
  23. courseName: '语文',
  24. score : 50 // 分数
  25. },
  26. currentAddress:{
  27. b:{
  28. c:{
  29. address: '北京市'
  30. }
  31. }
  32. }
  33. };
  34. },
  35. computed: {
  36. },
  37. watch: {
  38. // 监听姓名属性
  39. userName(newValue,oldValue){ // 监听那个属性,方法名为改属性
  40. console.info(oldValue+" 同学改名为:"+newValue);
  41. },
  42. // 监听年龄变化
  43. age: 'changeAge', // 值可以为函数名称
  44. //注意:当监听的数据为对象或数组时,newValue和oldValue是相等的,因为这两个形参指向的是同一个最新的数据对象
  45. subjects:{
  46. handler(newValue,oldValue){
  47. console.info(JSON.stringify(oldValue)+" 成绩发生变化:"+JSON.stringify(newValue));
  48. },
  49. deep:true // deep 为true 意味着开启了深度监听 a对象里面任何数据变化都会触发handler函数,
  50. },
  51. // /想监听 address 此时 数据 是 currentAddress.b.c.address 比较深 深度监听
  52. // 用这种写法,就不要使用简写了(一定要用单引号或者双引号括起来)
  53. /**'currentAddress.b.c.address' : function(newValue,oldValue){
  54. console.info(JSON.stringify(oldValue)+" 当前居住地变化:"+JSON.stringify(newValue));
  55. }**/
  56. currentAddress:{
  57. deep: true,
  58. handler(newValue,oldValue){
  59. console.info(JSON.stringify(oldValue)+" 成绩发生变化:"+JSON.stringify(newValue));
  60. },
  61. }
  62. },
  63. created() {
  64. },
  65. methods: {
  66. // 这里书写说的方法
  67. changeAge(newValue,oldValue){
  68. console.info(oldValue+" 年龄为:"+newValue);
  69. }
  70. }
  71. };
  72. </script>

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/807500
推荐阅读
相关标签