VUE 3.0 新特性之 Composition API(组合式API)

  • Post author:
  • Post category:vue


在vue2.0项目中使用的是

选项API

写法

  • 代码风格:data选项写数据,methods选项写函数…,一个功能逻辑的代码分散。
  • 优点:易于学习和使用,写代码的位置已经约定好
  • 缺点:代码组织性差,相似的逻辑代码不便于复用,逻辑复杂代码多了不好阅读。

什么是组合API写法

Compositon API?

  • 代码风格:一个功能逻辑的代码组织在一起(包含数据,函数…)
  • 优点:功能逻辑复杂繁多情况下,各个功能逻辑代码组织再一起,便于阅读和维护
  • 缺点:需要有良好的代码组织能力和拆分逻辑能力。

组合API-setup函数

使用细节:


  • setup

    是一个新的组件选项,作为组件中使用组合API的起点。
  • 从组件生命周期来看,它的执行在组件实例创建之前

    vue2.x的beforeCreate

    执行。
  • 这就意味着在

    setup

    函数中

    this

    还不是组件实例,

    this

    此时是

    undefined
  • 在模版中需要使用的数据和函数,需要在

    setup

    返回。
<template>
  <div class="container">
    <h1 @click="say()">{{msg}}</h1>
  </div>
</template>
<script>
export default {
  setup () {
    console.log('setup执行了')
    console.log(this)
    // 定义数据和函数
    const msg = 'hi vue3'
    const say = () => {
      console.log(msg)
    }

    return { msg , say}
  },
  beforeCreate() {
    console.log('beforeCreate执行了')
    console.log(this)
  }
}
</script>

组合API-生命周期


  • setup

    创建实例前

  • onBeforeMount

    挂载DOM前

  • onMounted

    挂载DOM后

  • onBeforeUpdate

    更新组件前

  • onUpdated

    更新组件后

  • onBeforeUnmount

    卸载销毁前

  • onUnmounted

    卸载销毁后


总结:

组合API的生命周期钩子有7个,可以多次使用同一个钩子,执行顺序和书写顺序相同。

组合API-reactive函数

  • reactive是一个函数,它可以定义一个复杂数据类型,成为响应式数据。

组合API-toRef函数

  • toRef是函数,转换

    响应式对象



    某个

    属性为单独响应式数据,并且

    值是关联的

使用场景:有一个响应式对象数据,但是模版中只需要使用其中一项数据。

组合API-toRefs函数

  • toRefs是函数,转换

    响应式对象

    中所有属性为单独响应式数据,对象成为普通对象,并且

    值是关联的

使用场景:剥离响应式对象(解构|展开),想使用响应式对象中的多个或者所有属性做为响应式数据。

组合API-ref函数

  • ref函数,常用于简单数据类型定义为响应式数据

    • 再修改值,获取值的时候,需要.value
    • 在模板中使用ref申明的响应式数据,可以省略.value


使用场景:当你明确知道需要的是一个响应式数据

对象

那么就使用 reactive 即可,


其他情况使用ref。

<template>
  <div class="container">
    <div>{{name}}</div>
    <div>{{age}}</div>
    <button @click="updateName">修改数据</button>
  </div>
</template>
<script>
import { reactive, toRef, toRefs } from 'vue'
export default {
  name: 'App',
  setup () {
    // 1. 响应式数据对象
    const obj = reactive({
      name: 'ls',
      age: 10
    })
    console.log(obj)
    // 2. 解构或者展开响应式数据对象
    // const {name,age} = obj
    // console.log(name,age)
    // const obj2 = {...obj}
    // console.log(obj2)
    // 以上方式导致数据就不是响应式数据了
    const obj3 = toRefs(obj)
    console.log(obj3)

    const updateName = () => {
      // obj3.name.value = 'zs'
      obj.name = 'zs'
    }

    return {...obj3, updateName}
  }
}
</script>
<style scoped lang="less"></style>



版权声明:本文为weixin_61243175原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。