vue3.0学习笔记(二)——生命周期与响应式数据(ref,reactive,toRef,toRefs函数)

1. 组合API-setup函数

使用细节:

  • setup 是一个新的组件选项,作为组件中使用组合API的起点。
  • 从组件生命周期来看,它的执行在组件实例创建之前vue2.x的beforeCreate执行
  • 这就意味着在setup函数中 this 还不是组件实例,this 此时是 undefined
  • 在模版中需要使用的数据和函数,需要在 setup 返回(return)。

2. 生命周期

2.1 回顾vue2.x生命周期钩子函数

  • beforeCreate
  • created------实例创建,能获取data, 不能获取真实DOM,一般用于发起Ajax请求
  • beforeMount
  • mounted------可以获取真实DOM
  • beforeUpdate
  • updated------当数据发生变化并更新页面后执行,获取更新后的DOM
  • beforeDestroy
  • destroyed------手动消除计时器/定时器/全局事件

2.2 认识vue3.0生命周期钩子函数

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

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

3. ref() 函数

  • 作用:接收简单类型或者对象类型的数据传入并返回一个响应式的对象(RefImpl)

定义响应式数据:

  • ref函数,常用于简单数据类型定义为响应式数据
    • 再修改值,获取值的时候,需要**.value**
    • 在模板中使用ref申明的响应式数据,可以省略.value

语法:

  • 从 vue 包中导入 ref 函数 import { ref } from 'vue'

  • 在 setup 中执行 ref 函数并传入初始值,使用变量接收 ref 函数的返回值

使用场景:

  • 当你明确知道需要的是一个响应式数据对象,那么就使用 reactive 即可
  • 其他情况使用ref

4. reactive() 函数

  • **作用:**接受对象类型数据的参数传入并返回一个响应式的对象。 响应式对象是 JavaScript 代理,其行为就和普通对象一样。(Proxyreactive() 返回的是一个原始对象的 Proxy,它和原始对象是不相等的。

  • 定义响应式数据:

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

语法:

  • 从 vue 包中导入 ref 函数 import { reactive } from 'vue'

  • 在 setup 中执行 reactive 函数并传入初始值,使用变量接收 reactive 函数的返回值

5. ref()与reactive()函数的理解

  • reactive和ref函数的共同作用是什么 ?
    • 用函数调用的方式生成响应式数据
  • reactive vs ref
    • reactive不能处理简单类型的数据
    • ref参数类型支持更好但是必须通过.value访问修改
    • ref函数的内部实现依赖于reactive函数
  • 在实际工作中推荐使用哪个?
    • 推荐使用ref函数,更加灵活统一

理解:

ref 和 reactvie 都是生成响应式数据的方法。ref 可以用于简单类型的数据和复杂类型的数据,生成的是响应式对象(RefImpl);而 reactive 只能用于对象,且生成的代理响应式对象(Proxy)。通过 ref 生成的响应式对象(RefImpl).value之后的值,其实就是通过 reactive 生成的代理响应式对象(Proxy)。

推荐:以后申明数据,统一使用 ref => 统一了编码规范

6. toRef() 函数

  • 作用:toRef 是函数,转换响应式对象某个 属性为单独响应式数据,并且值是关联的

  • 语法:

    • 从 vue 包中导入 toRef 函数 import { toRef } from 'vue'

    • toRef (响应式对象, 响应式对象中的某个属性)

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

7. toRefs() 函数

  • 作用:toRefs() 是函数,转换响应式对象 中所有属性为单独响应式数据,并且值是关联的。
  • 语法:
    • 从 vue 包中导入 toRefs 函数 import { toRefs } from 'vue'
    • toRefs (响应式对象)

8. 案例

基本步骤:

  • 记录鼠标坐标
    • 定义一个响应式数据对象,包含x和y属性。
    • 在组件渲染完毕后,监听document的鼠标移动事件
    • 指定move函数为事件对应方法,在函数中修改坐标
    • 在setup返回数据,模版中使用
  • 累加1功能
    • 定义一个简单数据类型的响应式数据
    • 定义一个修改数字的方法
    • 在setup返回数据和函数,模板中使用
javascript 复制代码
<template>
  <div>
    <div>鼠标的坐标为:</div>
    <p>x:{{ x }}</p>
    <p>y:{{ y }}</p>
    <hr>
    <div>{{ count }}</div>
    <button @click="add">+ 1</button>
  </div>
</template>

<script>
import { onMounted, reactive, onUnmounted, toRefs, ref } from 'vue'
// 功能1:记录鼠标坐标
// 定义一个响应式数据对象,包含x和y属性。
// 在组件渲染完毕后,监听document的鼠标移动事件
// 指定move函数为事件对应方法,在函数中修改坐标
// 在setup返回数据,模版中使用

export default {
  setup () {
    // 1. 定义一个响应式数据对象,包含x和y属性。
    const mouse = reactive({
      x: 0,
      y: 0
    })
    // 3. 指定move函数为事件对应方法,在函数中修改坐标
    const move = (e) => { 
        mouse.x = e.pageX
        mouse.y = e.pageY
      }
    // 2. 在组件渲染完毕后,监听document的鼠标移动事件
    onMounted(() => {
      document.addEventListener('mousemove',move)
    })
    //  4. 组件销毁时,移除事件
    onUnmounted(() => {
      document.removeEventListener('mousemove',move)
    })

    // 功能2:数字加 1 
    const count = ref(0)
    const add = () => {
      count.value += 1
    }
    return {
      ...toRefs(mouse),
      count,
      add
    }
  }
}
</script>

<style>

</style>
相关推荐
脸ル粉嘟嘟2 分钟前
GitLab使用操作v1.0
学习·gitlab
路有瑶台4 分钟前
MySQL数据库学习(持续更新ing)
数据库·学习·mysql
码蜂窝编程官方20 分钟前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
zmd-zk1 小时前
flink学习(2)——wordcount案例
大数据·开发语言·学习·flink
乐闻x1 小时前
Vue.js 性能优化指南:掌握 keep-alive 的使用技巧
前端·vue.js·性能优化
Chef_Chen1 小时前
从0开始学习机器学习--Day33--机器学习阶段总结
人工智能·学习·机器学习
hopetomorrow2 小时前
学习路之压力测试--jmeter安装教程
学习·jmeter·压力测试
hopetomorrow2 小时前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
533_2 小时前
[vue] 深拷贝 lodash cloneDeep
前端·javascript·vue.js
/**书香门第*/2 小时前
Cocos creator 3.8 支持的动画 7
学习·游戏·游戏引擎·游戏程序·cocos2d