• Vue中的侦听属性watch


    watch属性与我们之前学习的方法(methods)、过滤器(filters)、计算属性(computed)同级。

    watch的作用:负责监听数据源中的数据,当数据发生变化时触发其方法。就是起到一个监听器的作用,监视这个数据。

    要侦听那个数据,就在watch内写方法,方法名必须与数据名相同,在方法内就写对应的处理程序;当数据发生变化时就触发;这一点与计算属性(computed)相似,只有数据发生变化时才触发,但是侦听器属性,比计算属性计算效率消耗大。

    写法:

    1. watch:{
    2. msg(a1,a2){
    3. //处理程序
    4. }
    5. }

     方法名msg就是监听的data内的msg属性,a1接收每次msg改变时的那个值,a2为未改变时msg的值。

    代码展示一下用法:

    1. <div id="box">
    2. <div @click="change"> {{msg}}div>
    3. div>
    4. <script>
    5. new Vue({
    6. el:"#box",
    7. data:{
    8. msg:666
    9. },
    10. methods: {
    11. change(){
    12. this.msg=777
    13. }
    14. },
    15. watch:{
    16. msg(){
    17. console.log("msg发生了变化",this.msg);
    18. }
    19. }
    20. })
    21. script>

    当我们点击666时,msg被改变,watch侦听到其内的msg方法触发,打印:

     再次点击666这个标签时,msg的值还是被赋予777没有发生改变,即不会触发,控制台不再打印。

    特殊:当data内的数据是个对象时,侦听这个对象但是修改的是对象内的值是否会触发侦听呢?

    答案是不会。

    修改了引用数据内部的属性值:如果页面中使用了这个属性,页面会重新渲染,但是侦听器属性不会触发;只有修改了引用数据的引用 才能触发侦听器属性。

    解决方法:引入一个新词深度侦听,虽然可以实现触发,但是计算效率将会消耗更大,不推荐使用

    在写法上也发生了改变,采用对象的写法:

    1. watch:{
    2. obj:{
    3. deep:true,//判断是否深度侦听,true为侦听,false则不
    4. handler:()=>{}//处理函数
    5. }
    6. }

    同样演示一下:

    1. <div id="box">
    2. <div @click="change"> {{obj.a}}div>
    3. div>
    4. <script>
    5. new Vue({
    6. el:"#box",
    7. data:{
    8. obj:{
    9. a:"a"
    10. }
    11. },
    12. methods: {
    13. change(){
    14. this.obj.a="aa"
    15. }
    16. },
    17. watch:{
    18. obj:{
    19. deep:true,
    20. handler:()=>{
    21. console.log("侦听到a的变化");
    22. }
    23. }
    24. }
    25. })
    26. script>

    点击a时,控制台打印:

    到这里我们已经基本掌握了watch的基本用法,那么我们动手写两个实际应用。

    一、汇率转换

    需求:当我们在一个框内输入金额时,另一个框内对应的显示对应货币的转换的金额

    代码展示:

    1. <div id="box">
    2. 人民币: <input type="text" v-model="rmb" ><br>
    3. 韩元: <input type="text" v-model="hy" >
    4. div>
    5. <script>
    6. new Vue({
    7. el:"#box",
    8. data:{
    9. rmb:0,
    10. hy:0
    11. },
    12. methods: {
    13. change(){
    14. this.msg=777
    15. }
    16. },
    17. watch:{
    18. rmb(newvalue,oldvalue){
    19. this.hy=newvalue*15
    20. },
    21. hy(newvalue,oldvalue){
    22. this.rmb=(newvalue/15).toFixed(2)*100/100
    23. }
    24. }
    25. })
    26. script>

     二、余额提示

    要求:当金额低于一定金额时提醒用户充值

    1. <div id="box">
    2. {{money}}
    3. <button @click="change">购买一次花20元button>
    4. div>
    5. <script>
    6. new Vue({
    7. el:"#box",
    8. data:{
    9. money:100
    10. },
    11. methods: {
    12. change(){
    13. if (this.money>=20) {
    14. this.money-=20
    15. }
    16. }
    17. },
    18. watch:{
    19. money(newvalue,oldvalue){
    20. if (oldvalue<=20) {
    21. alert("余额不足了请充值")
    22. }
    23. }
    24. }
    25. })
    26. script>

  • 相关阅读:
    【云栖2023】王峰:开源大数据平台3.0技术解读
    护眼灯和白炽灯哪个更保护眼睛?推荐真正护眼的护眼灯
    bilibili面经
    LiveGBS国标GB/T28181流媒体平台支持主子码流切换主码流stream/streamprofile
    怎么把图片转换成ico图标文件?
    SpringBoot整合Shiro、Mybatis、Thymeleaf
    【刷题系列】顺序表OJ题
    如何使用Jupyter Notebook
    VS Code调试使用标准输入功能的go程序的问题
    uboot移植之DDR初始化参数更改说明
  • 原文地址:https://blog.csdn.net/m0_59345890/article/details/126692799