计算属性和侦听器

如果一个属性是依赖于其他属性变化的 使用 computed 计算属性

  • watch 监视属性 当属性发生变化时触发 必须在 data 中已经声明(可以异步操作)
    • 写成函数 相当于直接调用 handler 函数
    • 写成对象 只有当监视的属性值发生改变时,handler 函数才会执行,可以设置属性; 添加 immediate:true 属性, 可以立即执行handler 函数; deep:true 属性,深层次监控
  • computed 计算属性 不能在 data 中声明过 每一个计算属性都有 get,set 方法(不能异步操作) 依赖属性发生改变 则计算属性发生改变,若没有改变 则直接从缓存中读取之前的值,不会重新渲染。
    • 写成函数 相当于调用 get 方法获取值
    • 写成对象
  1. <script>
  2. let vm = new Vue({
  3. el: '#app',
  4. data: {
  5. // 当 firstName lastName 发生改变时,fullName 的值也跟着更改
  6. firstName:'FOO',
  7. lastName: 'Bar',
  8. // fullName: 'FOO Bar',
  9. },
  10. watch: {//监视属性 可以异步操作
  11. // 函数写法 相当于调用 handler 函数(自带)
  12. firstName(newVal, oldVal) {
  13. this.fullName = newVal + this.lastName;
  14. },
  15. lastName(newVal, oldVal) {
  16. this.fullName = this.firstName + newVal
  17. },
  18. // 对象写法
  19. firstName: {
  20. handler(newVal,oldVal) { //只有当监视的函数值发生改变时,handler 函数才会执行
  21. this.fullName = newVal.name + this.lastName;
  22. console.log('log')
  23. },
  24. immediate:true, // 立即执行 handler 函数
  25. deep: true, // 深层监控 firstName: {name: {m:foo}},
  26. },
  27. lastName(newVal, oldVal) {
  28. this.fullName = this.firstName.name + newVal
  29. }
  30. },
  31. computed: { // 计算属性 不能在 data 里边声明过,每一个计算属性都有 get set 方法
  32. // 函数写法
  33. fullName() { // 相当于调用 get 方法获取值
  34. // firstNmae lastName 表示 fullName 的依赖属性 依赖属性发生改变 fullName 发生改变,若没有改变 则直接从缓存中读取之前的值,不会重新渲染。
  35. return this.firstName + this.lastName;
  36. },
  37. // 对象写法
  38. fullName: {
  39. get() { // 先回自动调用 后期依赖值发生改变时,调用
  40. return this.firstName + this.lastName;
  41. },
  42. set(val) { // 对计算属性设置值时调用,并且把设置的值自动保存到 val 中,这个值可以进行其他操作
  43. // vm.firstName = 'aaa' // val 保存 aaa
  44. console.log(val);
  45. }
  46. },
  47. },
  48. })
  49. </script>