vue3组合API总结(一)

88 阅读2分钟

「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」。

setup函数

setup是一个新的组件选项,作为组件中使用组合API的起点

从生命周期来看,它的执行是在组件实例创建之前vue2.x的beforeCreate执行。这就意味着在setup函数中this还不是组件实例,此时的this是undefined。

在模板中需要用到的数据和函数,需要在setup中返回。

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)
  }
}

vue3生命周期

  • setup 创建实例前
  • onBeforeMount 挂载DOM前
  • onMounted 挂载DOM后
  • onBeforeUpdate 更新组件前
  • onUpdated 更新组件后
  • onBeforeUnmount 卸载销毁前
  • onUnmounted 卸载销毁后

reactive函数

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

<template>
  <div>我是根组件</div>
  <div>
    <p>姓名:{{ user.name }}</p>
    <p>年龄:{{ user.age }}</p>
    <button @click="change">修改</button>
  </div>
</template>

<script>
import { reactive } from "vue";
export default {
  setup() {
    const user = reactive({
      name: "zs",
      age: 18,
    });

    const car = reactive({
      brand: '宝马',
      price: 100
    })
    
    const change = () => {
      console.log('修改');
      console.log(user);
      user.name = 'ls'
    }
    return {
      user,
      car,
      change
    };
  },
};
</script>

需要注意的是,reactive对象在解构的时候会丢失响应式的效果,赋值给新的变量也会丢失响应式效果。

ref函数

reactive函数将复杂数据类型的数据定义为响应式数据,那么ref函数将简单数据类型定义为响应式数据。

注意:

  1. 获取值,修改值的时候,需要.value

  2. 在模板中使用ref声明的响应式数据,可以省略.value

<template>
  <div>我是根组件</div>
  <div>
    <p>{{money}}-{{user.name}}</p>
    <button @click="change">修改</button>
    <button @click="money++">修改2</button>
  </div>
</template>

<script>
import { reactive, ref } from 'vue'
export default {
name: 'App',
setup() {
  let money = ref(100)
  let user = reactive({
    name: 'zs',
    age: 18
  })
  const change = () => {
    // console.log(money);
    money.value++
  }
  return {
    money,
    user,
    change
  }
}
}
</script>

toRef函数

toRef函数用来转换响应式对象中某个属性为单独的响应式数据,并且值是关联的。它用于有一个响应书数据,但是模板中只需要使用一项数据。

<template>
  <div class="container">
    {{name}} <button @click="updateName">修改数据</button>
  </div>
</template>
<script>
import { reactive, toRef } from 'vue'
export default {
  name: 'App',
  setup () {
    // 1. 响应式数据对象
    const obj = reactive({
      name: 'ls',
      age: 10
    })
    console.log(obj)
    // 2. 模板中只需要使用name数据
    // 注意:从响应式数据对象中解构出的属性数据,不再是响应式数据
    // let { name } = obj 不能直接解构,出来的是一个普通数据
    const name = toRef(obj, 'name')
    // console.log(name)
    const updateName = () => {
      console.log('updateName')
      // toRef转换响应式数据包装成对象,value存放值的位置
      name.value = 'zs'
    }

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

toRefs函数

toRefs函数用来定义转换响应式中数据的所有数据为响应式数据,通常用于解构或者展开reactive定义的对象。

<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>