Vue 计算属性和生命周期

848 阅读3分钟

一、Vue计算属性

计算属性本质上就是一个function函数,它可以实时监听data中数据的变化, 并return 一个计算后的新值,供组件渲染DOM时使用。

声明计算属性:计算属性需要以function函数的形式声明到组件的computed选项中

计算属性:

  • 计算属性必须定义在computed节点中
  • 计算属性必须是一个function函数
  • 计算属性必须有返回值
  • 计算属性必须当做普通属性使用
export default {
  data() {
    return {
      author: {
        name: 'John Doe',
        books: [
          'Vue 2 - Advanced Guide',
          'Vue 3 - Basic Guide',
          'Vue 4 - The Mystery'
        ]
      }
    }
  },
  computed: {
    // a computed getter
    publishedBooksMessage() {
      // `this` points to the component instance
      return this.author.books.length > 0 ? 'Yes' : 'No'
    }
  }
}

计算属性vs方法

相对于方法来说,计算属性会缓存计算的结果,只有计算属性的依赖项发生变化时, 才会重新进行运算。因此计算属性的性能更好

二、Vue组件高级-watch侦听器

watch 侦听器允许开发者监视数据的变化,从而针对数据的变化做特定的操作。 watch节点中,定义自己的侦听器

<script>
import axois from "axios"; //npm i axios -S
export default {
  name: "MyWatch",
  data() {
    return {
      userName: "",
      info: {
        userName: "zs",
      },
    };
  },
  watch: {
    async userName(newVal, oldVal) {
      console.log(newVal, oldVal);
      const { data: res } = await axois.get(
        "https://www.escook.cn/api/finduser/" + newVal
      );
      console.log(res);
    },
    async handler(newVal, oldVal) {
      const { data: res } = await axois.get(
        "https://www.escook.cn/api/finduser/" + newVal
      );
      console.log(res);
    },
    //立即触发watch侦听器
    immediate: true,

    info: {
      async handler(newVal) {
        const { data: res } = await axois.get(
          "https://www.escook.cn/api/finduser/" + newVal.userName
        );
        console.log(res);
      },
      //侦听对象属性值的变化
      deep: true,
    },

    "info.userName": {
      async handler(newVal) {
        const { data: res } = await axois.get(
          "https://www.escook.cn/api/finduser/" + newVal
        );
        console.log(res);
      },
    },
  },
};
</script>

默认情况下,组件在初次加载完毕后不会调用watch侦听器。如果想让watch侦听器立即被调用,则需要使用immediate选项

当watch侦听的是一个对象,如果对象中的属性值发生了变化,则无法被监听到。 此时需要使用deep选项

如果只想监听对象中单个属性的变化,则可以按照如下的方式定义 watch侦听器:

计算属性和侦听器侧重的应用场景不同: 计算属性侧重于监听多个值的变化,最终计算并返回一个新值 侦听器侧重于监听单个数据的变化,最终执行特定的业务处理,不需要有任何返回值

三、组件生命周期

组件的生命周期指的是∶组件从创建->运行(渲染)-→销毁的整个过程,强调的是一个时间段。

  • 当组件在内存中被创建完毕之后,会自动调用created函数(发送ajax请求初始数据)
  • 当组件被成功的渲染到页面上之后,会自动调用mounted函数(c操作DOM元素)
  • 当组件被销毁完毕之后,会自动调用unmounted函数
  • 当组件的data 数据更新之后,vue 会自动重新渲染组件的DOM结构,
  • 从而保证View视图展示的数据和Model数据源保持一致。
  • 当组件的data 数据更新之后,vue 会自动重新渲染组件的DOM结构,
  • 从而保证View视图展示的数据和Model数据源保持一致。
  • 当组件被重新渲染完毕之后,会自动调用updated生命周期函数。(data数据多次变化,多次调用该函数)

2.png

四、组件之间的数据共享 (兄弟组件)

3.png

后代关系组件之间共享数据,指的是父节点的组件向其子孙组件共享数据。此时组件之间的嵌套关系比较复杂 可以使用 provideinject 实现后代关系组件之间的数据共享。

全局数据共享 vuex