文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Vue3中的计算属性及侦听器如何使用

2023-07-06 12:01

关注

这篇文章主要介绍“Vue3中的计算属性及侦听器如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue3中的计算属性及侦听器如何使用”文章能帮助大家解决问题。

计算属性

我们知道,在模板中可以直接通过插值语法显示一些data中的数据,但是在某些情况,我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示

在模板中使用表达式,可以非常方便的实现,但是设计它们的初衷是用于简单的运算,在模板中放入太多的逻辑会让模板过重和难以维护,并且如果多个地方都使用到,那么会有大量重复的代码

所以我们希望将业务逻辑和UI界面进行分离,其中一种方式就是将逻辑抽取到一个method中,但这种做法有以下弊端

事实上,对于任何包含响应式数据的复杂逻辑,你都应该使用计算属性

<div id="app">  <!-- 计算属性的使用和普通状态的使用方式是一致的 -->  <h4>{{ fullname }}</h4></div><script>  Vue.createApp({    data() {      return {        firstname: 'Klaus',        lastname: 'Wang'      }    },    computed: {      fullname() {        return this.firstname + ' ' + this.lastname      }    }  }).mount('#app')
缓存

计算属性会基于它们的依赖关系进行缓存,在数据不发生变化时,计算属性是不需要重新计算的

但是如果依赖的数据发生变化,在使用时,计算属性依然会重新进行计算

并且界面会使用最新的计算属性的值进行重新渲染

getter 和 setter

计算属性在大多数情况下,只需要一个getter方法即可,所以我们会将计算属性直接写成一个函数

<div id="app">  <!-- 计算属性的使用和普通状态的使用方式是一致的 -->  <h4>{{ fullname }}</h4>  <button @click="change">change</button></div><script>  Vue.createApp({    data() {      return {        firstname: 'Klaus',        lastname: 'Wang'      }    },    methods: {      change() {        this.fullname = 'Alex Li'      }    },    computed: {      // 计算属性的完整写法      fullname: {        get() {          return this.firstname + ' ' + this.lastname        },        set(v) {          this.firstname = v.split(' ')[0]          this.lastname = v.split(' ')[1]        }      }    }  }).mount('#app')</script>

侦听器

在data返回的对象中定义了数据,这个数据通过插值语法等方式绑定到template中,当数据变化时,template会自动进行更新来显示最新的数据

但是在某些情况下,我们希望在代码逻辑中监听某个数据的变化,这个时候就需要用侦听器watch来完成了

Vue.createApp({  data() {    return {      info: {        name: 'Klaus'      }    }  },  watch: {    // 可以使用watch监听响应式数据的改变    // 对应有两个参数    // 参数一 --- 新值    // 参数二 --- 旧值    info(newV, oldV) {      // 如果监听的值是对象,获取到的新值和旧值是对应对象的代理对象      console.log(newV, oldV)      // 代理对象 转 原生对象      // 1. 使用浅拷贝获取一个新的对象,获取的新的对象为原生对象      console.log({...newV})      // 2. 使用Vue.toRaw方法获取原生对象      console.log(Vue.toRaw(newV))    }  },  methods: {    change() {      this.info = {        name: 'Steven'      }    }  }}).mount('#app')
配置选项
属性说明
deep是否开启深度监听
值为boolean
未开启的时候,如果监听的是对象,那么只有对象的引用发生改变的时候,才会触发watch回调
开始后,如果监听的是对象,那么只要对象中的任意一个属性发生了改变,就会触发watch回调
immediate是否立即开始监听
默认情况下,初次渲染是不会触发watch监听,只有当值发生改变后,才会触发watch监听
将immediate设置为true后,初次渲染也会触发watch监听,此时oldValue的值为undefined
Vue.createApp({  data() {    return {      info: {        name: 'Klaus'      }    }  },  watch: {    info: {      // 开启了深度监听后,当info的属性发生改变的时候,就会触发对应的watch回调      // 注意: 和直接修改info引用不同的是,如果直接修改的是对象的属性      // 那么此时newV和oldV是同一个对象的引用, 此时也就获取不到对应的旧值      handler(newV, oldV) {        console.log(newV, oldV)        console.log(newV === oldV)  // => true      },      deep: true,      immediate: true    }  },  methods: {    change() {      this.info.name = 'Steven'    }  }}).mount('#app')
其它写法

直接监听对象属性

watch: {  'info.name'(newV, oldV){    console.log(newV, oldV)  }}

字符串写法

Vue.createApp({  data() {    return {      info: {        name: 'Klaus'      }    }  },  watch: {    // watch的值如果是一个字符串的时候    // 会自动以该字符串作为函数名去methods中查找对应的方法    'info.name': 'watchHandler'  },  methods: {    change() {      this.info.name = 'Steven'    },    watchHandler(newV, oldV){      console.log(newV, oldV)    }  }}).mount('#app')

数组写法

Vue.createApp({  data() {    return {      info: {        name: 'Klaus'      }    }  },  watch: {    'info.name': [      'watchHandler',      function handle() {        console.log('handler2')      },      {        handler() {          console.log('handler3')        }      }    ]  },  methods: {    change() {      this.info.name = 'Steven'    },    watchHandler(){      console.log('handler1')    }  }}).mount('#app')

$watch

Vue.createApp({  data() {    return {      info: {        name: 'Klaus'      }    }  },  created() {        this.$watch('info.name', (newV, oldV) => console.log(newV, oldV), {      immediate: true    })  },  methods: {    change() {      this.info.name = 'Steven'    }  }}).mount('#app')

关于“Vue3中的计算属性及侦听器如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯