• Watch监听器的使用


    一.简单数据类型

    代码:

    1. <script>
    2. export default {
    3. name: '',
    4. data() {
    5. return {
    6. name: '张三'
    7. }
    8. },
    9. watch: {
    10. name(newVal, oldVal) {
    11. console.log(newVal, '新值')
    12. console.log(oldVal, '旧值')
    13. }
    14. },
    15. methods: {
    16. fn() {
    17. this.name = 123
    18. }
    19. }
    20. }
    21. // watch窃听器
    22. script>
    23. <style scoped>
    24. style>

    二.监听复杂数据类型

    1. <script>
    2. export default {
    3. name: '',
    4. data() {
    5. return {
    6. obj: {
    7. name: '张三'
    8. }
    9. }
    10. },
    11. watch: {
    12. obj: {
    13. // deep: true,
    14. handler(newval, oldval) {
    15. console.log(newval, '新值')
    16. console.log(oldval, '旧值')
    17. }
    18. }
    19. },
    20. methods: {
    21. fn() {
    22. this.obj.name = 123
    23. }
    24. }
    25. }
    26. // watch窃听器
    27. script>
    28. <style scoped>
    29. style>

    有人会说需要开启深度监听

    1. <script>
    2. export default {
    3. name: '',
    4. data() {
    5. return {
    6. obj: {
    7. name: '张三'
    8. }
    9. }
    10. },
    11. watch: {
    12. obj: {
    13. deep: true,
    14. handler(newval, oldval) {
    15. console.log(newval, '新值')
    16. console.log(oldval, '旧值')
    17. }
    18. }
    19. },
    20. methods: {
    21. fn() {
    22. this.obj.name = 123
    23. }
    24. }
    25. }
    26. // watch窃听器
    27. script>
    28. <style scoped>
    29. style>

     确实开启深度监听可以监听到。

    但是不开启就监听不到了吗?

    答案,非也

    看下面的代码:

    1. <script>
    2. export default {
    3. name: '',
    4. data() {
    5. return {
    6. obj: {
    7. name: '张三'
    8. }
    9. }
    10. },
    11. watch: {
    12. obj: {
    13. handler(newval, oldval) {
    14. console.log(newval, '新值')
    15. console.log(oldval, '旧值')
    16. }
    17. }
    18. },
    19. methods: {
    20. fn() {
    21. this.obj = {
    22. age: 20
    23. }
    24. }
    25. }
    26. }
    27. // watch窃听器
    28. script>
    29. <style scoped>
    30. style>

    视图:

     可以看出不开启深度监听也是可以监听到的。

    为什么一直能监听一种不能监听呢?

    通过改变的情况进行对比可以发现,第二种改变直接重新赋值了一个对象也就是改变了地址。

    用0001 表示他的栈  当赋值一个新的对象的时候,生成一个新的堆 栈也会生成一个新的。

    因此:我们得出一个结论,watch默认监听的是栈的变化。开启deep:true 深度监听,栈的变化和堆的变化都可以监听到。

    这就是我们在检查一个普通的数据类型的时候为什么能够轻易监听的原因。

    1. <script>
    2. export default {
    3. name: '',
    4. data() {
    5. return {
    6. name: '张三'
    7. }
    8. },
    9. watch: {
    10. name(newVal, oldVal) {
    11. console.log(newVal, '新值')
    12. console.log(oldVal, '旧值')
    13. }
    14. },
    15. methods: {
    16. fn() {
    17. this.name = 123
    18. }
    19. }
    20. }
    21. // watch窃听器
    22. script>
    23. <style scoped>
    24. style>

    用示意图来表示:

    三.只有当值改变的时候才去监听吗?

       immediate: true  

       立即实现监听

    1. <script>
    2. export default {
    3. name: '',
    4. data() {
    5. return {
    6. obj: {
    7. name: '张三'
    8. }
    9. }
    10. },
    11. watch: {
    12. obj: {
    13. immediate: true,
    14. handler(newval, oldval) {
    15. console.log(newval, '新值')
    16. console.log(oldval, '旧值')
    17. }
    18. }
    19. },
    20. methods: {
    21. fn() {
    22. this.obj = {
    23. age: 20
    24. }
    25. }
    26. }
    27. }
    28. // watch窃听器
    29. script>
    30. <style scoped>
    31. style>

    四.总结

    在监听复杂数据的时候开启

    1. depp:true
    2. 即可

  • 相关阅读:
    vscode 打代码光标特效
    Flutter高仿微信-第58篇-扫一扫
    【pytorch源码分析--torch执行流程与编译原理】
    【配电变电站的最佳位置和容量】基于遗传算法的最优配电变电站放置(Matlab代码实现)
    十二烷基硫酸钠(SDS)将Fe3O4磁性纳米粒子定量地修饰到多壁碳纳米管|化学试剂
    串的基本概念和常见算法(BF算法,KMP算法--附python实现代码)
    【无标题】vscode 配置c++ c编译环境
    C++概述
    低市值Pow赛道解析,探寻百倍潜力项目
    探索Terraform实践:优化基础设施管理
  • 原文地址:https://blog.csdn.net/qq_59076775/article/details/126162625