Vue3 Compensition Api |小册免费学

273 阅读3分钟

相比vue2.0版本(Option API),Composition API(组合API)应该算是3.0的重大变更之一了。 Composition API 主要灵感来源于React Hooks,目的是通过一组低侵入式的、函数式的 API (入口是 setup 函数),使得我们能够更灵活地「 组合 」组件的逻辑。

什么是组合式 API?

Vue3 不在再像 Vue2 一样 ,<script></script> 里 代码片段分为 data , props, methods, computed ,而是采用函数式风格,通过 setup 函数,用组件的选项 (data、computed、methods、watch)传入setup 函数,通过引入的ref、onMounted等方法实现数据的双向绑定、生命周期函数的执行。

// Vue2 options API
export default {
  name: 'App',
  watch: {

  },
  computed: {

  }
}
// vue3 Composition API
import { watch, computed } from 'vue'
export default {
  name: 'App',
  setup() {
    watch(() => {
      // do something
    }, () => {
      // do something
    })
    const a = computed(() => {
      // do something
    })
  }
}

setup 存在的意义,就是为了让你能够使用新增的组合 API。并且这些组合 API 只能在 setup 函数内使用。

setup 调用的时机是创建组件实例,然后初始化 props,紧接着就是调用 setup 函数。从生命周期钩子的角度来看,它会在 beforeCreate 钩子之前被调用,所以 setup 内是拿不到 this 上下文的。

为什么需要 组合式 API? (Compensition Api)

  1. 在组件比较复杂的情况下,可以将逻辑代码合到一起去,而不会被option强行分隔。这提高了代码质量的上限,同时也拉低了代码质量的下限。来自官方的一张对比图:

image-20210423175647631.png

  1. 更好的进行复用。

    在vue2中,想要复用部分逻辑的代码,都是通过mixin进去。但mixin进去的内容实际上很不直观,而且相同命名会被覆盖。而通过composition API,因为所有的方法都是引入的,可以将单独某个逻辑进行封装。

  2. 更好的typescript支持。不会再往vue原型上添加很多内容,而是通过引入的方式,类型定义会更清晰。

在 setup 函数内 使用 组合式 API (Compensition Api)

Vue 3.0 新增的 setup 方法,也是以选项的形式出现在抛出的对象中,但是诸如上述代码中的 watchcomputed 等属性,都变成 hook 函数的形式,通过 vue 解构出来,在 setup 方法中使用,如下所示:

// Composition API
import { watch, computed } from 'vue'
export default {
  name: 'App',
  setup() {
    watch(() => {
      // do something
    }, () => {
      // do something
    })
    const a = computed(() => {
      // do something
    })
  }
}

setup 存在的意义,就是为了让你能够使用新增的组合 API。并且这些组合 API 只能在 setup 函数内使用。

生命周期时机 : 1 创建组件实例,2 初始化 props,3 紧接着调用 setup 函数。

从生命周期钩子的角度来看,它会在 beforeCreate 钩子之前被调用,所以 setup 内是拿不到 this 上下文的。

setup 如何接受参数

setup 函数接收两个参数,第一个是 props 对象,第二个是 context 上下文。

props 对象:

函数接收 props 作为第一个参数,我们现在需要一个父子组件的传值例子,修改上述 src/App.vue 文件如下:

context 上下文:

ctx(context)参数提供了一个上下文对象,从原来的 Vue 2.0 中的 this 选择性的暴露一些属性。

ctx 为我们提供了三个属性,分别是:

  • attrs
  • slots
  • emit

今天分享就到这里啦 , 如果内容对你有帮助的话请点个赞,谢谢

作者:chenuvi

邮箱: chenui@outlook.com

参考内容:

vue3 官网教程

Vue3 Composition API

Vue 3.0 企业级项目实战