• 130-Vue中的监听事件——Watch


    Watch

    watch的作用可以监控一个值的变换,并调用因为变化需要执行的方法。可以通过watch动态改变关联的状态。

    简单点说,就是实时监听某个数据的变化。

    1、普通监听

    1. <template>
    2. <div>
    3. <p>{{num}}p>
    4. <button @click="num++">按钮button>
    5. div>
    6. template>
    7. <script>
    8. export default {
    9. data () {
    10. return {
    11. num:30
    12. }
    13. },
    14. watch:{
    15. // 第1种格式:
    16. // num(newVal,oldVal){
    17. // // 什么时候执行, num的值发生变化的时候,就执行这里的代码
    18. // console.log("num被修改了",newVal,oldVal);
    19. // },
    20. // 第2种格式:
    21. num:{
    22. handler(newVal,oldVal){
    23. // 什么时候执行, num的值发生变化的时候,就执行这里的代码
    24. console.log("num被修改了",newVal,oldVal);
    25. }
    26. }
    27. }
    28. }
    29. script>
    30. <style lang = "less" scoped>
    31. style>

    2、立即监听

    如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。

    1. <template>
    2. <div>
    3. <p>{{num}}p>
    4. <button @click="num++">按钮button>
    5. div>
    6. template>
    7. <script>
    8. export default {
    9. data () {
    10. return {
    11. num:30
    12. }
    13. },
    14. watch:{
    15. num:{
    16. handler(newVal,oldVal){
    17. // 什么时候执行, num的值发生变化的时候,就执行这里的代码
    18. console.log("num被修改了",newVal,oldVal);
    19. },
    20. immediate:true // 立即监听
    21. }
    22. }
    23. }
    24. script>
    25. <style lang = "less" scoped>
    26. style>

    immediate需要搭配handler一起使用,其在最初绑定时,调用的函数也就是这个handler函数。

    3、深度监听

    当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。

    1. <template>
    2. <div>
    3. <p>{{obj.age}}p>
    4. <button @click="obj.age++">按钮button>
    5. div>
    6. template>
    7. <script>
    8. export default {
    9. data () {
    10. return {
    11. obj:{
    12. name:"Vue",
    13. age:7
    14. }
    15. }
    16. },
    17. watch:{
    18. // obj:{
    19. // handler(newVal,oldVal){
    20. // // 什么时候执行, obj中一旦有属性发生变化,就会执行这里的代码
    21. // console.log("name或者age被修改了",newVal,oldVal);
    22. // },
    23. // deep:true
    24. // }
    25. "obj.age":{
    26. handler(newVal,oldVal){
    27. // 什么时候执行, age被修改的时候来执行
    28. console.log("age被修改了",newVal,oldVal);
    29. },
    30. }
    31. }
    32. }
    33. script>
    34. <style lang = "less" scoped>
    35. style>

    注意:

    1、如果监听的数据是一个对象,那么 immediate: true失效;

    2、一般使用于对引用类型的监听,深度监听,如监听一个Object,只要Object里面的任何一个字段发生变化都会被监听,但是比较消耗性能,根据需求使用,能不用则不用。

    3、因为上面代码obj是引用数据类型,val, oldVal指向一致,导致看到的结果一样。


    4、deep优化

    我们可以通过点语法获取对象中的属性,然后转为字符串,即是对深度监听的优化

    1. <template>
    2. <div class="home">
    3. <h3>{{obj.age}}h3>
    4. <button @click="btnClick">按钮button>
    5. div>
    6. template>
    7. <script>
    8. export default {
    9. name: "Home",
    10. data() {
    11. return {
    12. obj: {
    13. name: "Lucy",
    14. age: 13
    15. }
    16. };
    17. },
    18. methods: {
    19. btnClick() {
    20. this.obj.age = 33;
    21. }
    22. },
    23. watch: {
    24. // 通过点语法获取对象中的属性,然后转为字符串,即是对深度监听的优化
    25. "obj.age": {
    26. handler(val, oldVal) {
    27. console.log(val, oldVal);
    28. },
    29. deep: true,
    30. immediate: true, // 此时监听的数据不是一个对象,可以使用immediate
    31. }
    32. }
    33. };
    34. script>

    5、Watch与Computed的区别

    • watch中的函数是不需要调用的,computed内部的函数调用的时候不需要加()

    • watch(属性监听),监听的是属性的变化,而computed(计算属性),是通过计算而得来的数据

    • watch需要在数据变化时执行异步或开销较大的操作时使用,而对于任何复杂逻辑或一个数据属性,在它所依赖的属性发生变化时,也要发生变化,这种情况下,我们最好使用计算属性computed。

    • computed 属性的结果会被缓存,且computed中的函数必须用return返回最终的结果

    • watch 一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;

    6、Watch与Computed的使用场景

    • computed    

      • 当一个结果受多个属性影响的时候就需要用到computed

      • 最典型的例子: 购物车商品结算的时候

    • watch

      • 当一个数据的变化需要有额外操作的时候就需要用watch

      • 搜索数据

    • 总结:

      • 一个值的结果受其他值的影响,用computed

      • 一个值的变化将时刻影响其他值,用watch

  • 相关阅读:
    zookeeper+kafka消息队列群集部署
    反弹shell原理与实现
    OA系统源码
    C# json序列化实体时,时间戳转Datetime
    机器学习4超参数问题
    递增删除图象
    初识string+简单用法(二)
    Linux网路服务之DNS域名解析
    GitLab的使用
    SDEI初探-透过事务看本质
  • 原文地址:https://blog.csdn.net/jolinoy/article/details/125897338