• 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. 即可

  • 相关阅读:
    『现学现忘』Git分支 — 38、Git分支介绍
    Python 文件读写操作区别案例(r、r+、rb、w、w+、wb、a、a+、ab)
    Redis Sentinel集群管理手册
    SPI、RS232、485、IIC通信协议详细总结
    C++ Tutorials: C++ Language: Classes: Special members
    suricata 流管理
    Makefile相关操作
    C++:VS2019 Windows SDK 10损坏重装
    C#,根据路径获取某个数字开头的所有文件夹,并获取最新文件夹进行替换文件
    CAS源码工程搭建记录
  • 原文地址:https://blog.csdn.net/qq_59076775/article/details/126162625