• 侦听器watch及其和计算属性、methods方法的总结


    目录

    一、watch侦听器

    二、侦听器的处理函数

    解决深度监听新老值同源问题

    三、侦听器的格式

     1. 方法格式的侦听器

      2.对象格式的侦听器

    四、侦听器watch、计算属性、methods方法的总结


    一、watch侦听器

         watch侦听器允许开发者监视数据的变化,从而针对数据的变化做特定的操作。

         语法格式如下:

    1. const vm = new Vue({
    2. el:'#app',
    3. data:{
    4. username: ''
    5. },
    6. watch:{
    7. // 监听 username 值的变化
    8. //newVal 是变化后的新值, oldVal 是变化之前的旧值
    9. uesrname(newVal, oldVal) {
    10. console.log(newVal, oldVal);
    11. }
    12. }
    13. })

    监听数据变化,一般只监听一个变量或数组 

    使用场景:watch(异步场景),computed(数据联动) watch可以在所监听的数据后面直接加字符串形式的方法名

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. <script src="../vue.js" type="text/javascript" charset="utf-8">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <h3>{{firstName}}h3>
    11. div>
    12. <script>
    13. const vm = new Vue({
    14. el: '#app',
    15. data() {
    16. return {
    17. firstName: "zhang",
    18. lastName: "san",
    19. watchFullName: "zhangsan",
    20. age: 18,
    21. }
    22. },
    23. watch:{
    24. firstName(newVal, oldVal){
    25. console.log(newVal);
    26. console.log(oldVal);
    27. }
    28. },
    29. })
    30. script>
    31. body>
    32. html>

    使用如下方法也可实现上图效果:

    使用侦听器监听 firstName 数据里字符串形式的change 方法名

                    watch:{

                        firstName:'change'

                    },

                     methods:{

                        change(newVal, oldVal){

                            console.log(newVal);

                            console.log(oldVal);

                        }

                     }

    二、侦听器的处理函数

    handler方法就相当于普通侦听器触发的事件,从结果可以看到,组件初始化的时候,侦听器并没有handler方法 ,所以fullName是没有值的

    当修改以上代码,加上immediate: true,immediate:true代表watch里面声明了之后会立马执行handler里面的函数。执行相应的逻辑。组件初始化的时候,侦听器会立马(immediate)触发handler方法

    1. DOCTYPE html>
    2. Vue计算属性/侦听器/方法比较
    3. FullName: {{person.fullname}}

    4. FirstName:

  • immediate 的作用是:控制侦听器是否自动触发一次,默认值是 false

    当在输入框中输入数据时, 可以发现fullName的值并没有随之改变 。这是因为vue无法检测到对象内部属性值的变化,比如person.firstname的变化;所以此时 需要用到vue的深度监听(deep)此时加上代码 deep: true可以发现 每次输入框数据变化 fullname随之改变,上面的可以发现handler监听的新值和老值是一样的 这是有vue2.0的坑 犹豫同源导致的 可以用computed来修改

    解决深度监听新老值同源问题

    1. DOCTYPE html>
    2. FullName: {{person.fullname}}

    3. FirstName:

  • 三、侦听器的格式

     1. 方法格式的侦听器

      2.对象格式的侦听器

    四、侦听器watch、计算属性、methods方法的总结

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript" charset="utf-8">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <h1>计算属性:computedh1>
    11. {{fullName}}
    12. <h1>方法:methodsh1>
    13. {{fullName2()}}
    14. <h1>侦听器:watchh1>
    15. {{watchFullName}}
    16. <h1>年龄:ageh1>
    17. {{age}}
    18. div>
    19. <script>
    20. var other = 'This is other';
    21. const vm = new Vue({
    22. el: "#app",
    23. data() {
    24. return {
    25. firstName: "zhang",
    26. lastName: "san",
    27. watchFullName: "zhangsan",
    28. age: 18,
    29. }
    30. },
    31. methods: {
    32. fullName2() {
    33. console.log("调用了fullName2,使用了一次方法")
    34. return this.firstName + this.lastName + ','+other
    35. }
    36. },
    37. computed: {
    38. fullName() {
    39. console.log("调用了fullName,计算了一次属性")
    40. return this.firstName + this.lastName + ','+other
    41. }
    42. },
    43. watch: {
    44. firstName(newfirstname,oldfirstname){
    45. console.log('firstName触发了watch');
    46. this.watchFullName = this.firstName+this.lastName+ ','+other
    47. },
    48. lastName(newlastname,oldlastname){
    49. console.log('lastName触发了watch');
    50. this.watchFullName = this.firstName+this.lastName+ ','+other
    51. },
    52. }
    53. })
    54. script>
    55. body>
    56. html>

     初始化:

     修改firstName/lastName/两者都修改 

     修改computed中没计算的age

    修改Vue实例外的对象

    修改Vue实例外对象后在修改Vue实例内的对象

     

    测试结论:

    1. 使用computed计算了fullName属性,值为firstName+lastName。计算属性具有缓存功能,当firstName和lastName都不改变的时候,fullName不会重新计算,比如我们改变age的值,fullName的值是不需要重新计算的。
    2. methods并没有缓存特性,比如我们改变age的值,fullName2()方法会被执行一遍。
    3. 当一个功能可以用上面三个方法来实现的时候,明显使用computed更合适,代码简单也有缓存特性。
    4. 计算属性范围在vue实例内,修改vue实例外部对象,不会重新计算渲染,但是如果先修改了vue实例外对象,在修改vue计算属性的对象,那么外部对象的值也会重新渲染。

     

  • 相关阅读:
    Linux-文件和目录权限
    基于北方苍鹰算法的无人机航迹规划-附代码
    【Python 实战基础】Pandas如何精确设置表格数据的单元格的值
    文件操作及IO(java)
    阿里云的应用型负载均衡,网络型负载均衡,传统型负载均衡
    (更新中)数据结构开发实战教程
    『德不孤』Pytest框架 — 8、Pytest断言
    【云原生 | Kubernetes 系列】---Prometheus Blackbox_exporter监控
    为什么选择微服务架构? 微服务架构的10个核心优势 总结
    【网络安全】beef-xss实操以及xss修复方案
  • 原文地址:https://blog.csdn.net/qq_53841687/article/details/126067452