https://zhuanlan.zhihu.com/p/136417498

https://juejin.cn/post/6874927606820274184

什么是Composition API

如果你还不知道,Vue3 Composition API 附带了一个 setup() 方法。此方法封装了我们的大多数组件代码,并处理了响应式,生命周期钩子函数等。

简而言之,Composition API使我们能够更好地将代码组织为更多的模块化功能,而不是根据属性的类型(方法,计算的数据)进行分离。

在旧的 beforeCreate 钩子函数之后和 created 的钩子函数之前立即调用 setup 方法。因此,我们不再需要这两个钩子,我们可以简单地将本应有的代码放在 setup() 方法中。

添加我们的生命周期钩子

与Vue3中的大多数功能一样,生命周期钩子是我们必须导入到项目中的东西,这是为了帮助使项目尽可能轻巧。

import { onMounted, onUpdated, onUnmounted } from 'vue'

除去 beforeCreate 和 created 之外,在我们的 setup 方法中,有9个旧的生命周期钩子,我们可以在setup 方法中访问

  • onBeforeMount
  • onMounted
  • onBeforeUpdate
  • onUpdated
  • onBeforeUnmount
  • onUnmounted
  • onActivated
  • onDeactivated
  • onErrorCaptured

我们导入它们并在我们的代码中访问它们

<template><div id="app"><p>{{title}}</p><p>{{msg}}</p><router-view/></div>
</template>
import { ref,toRefs,reactive,onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted, onActivated, onDeactivated, onErrorCaptured } from 'vue'
export default {setup() {onBeforeMount(() => {// ... 例如返回首页 隐藏按钮})onMounted(() => {// ... 直接调用方法getHomeAllData().then(res=>{recommends.value = res.goods.data;banners.value = res.slides;})  })onBeforeUpdate(() => {// ... })onUpdated(() => {// ... })onBeforeUnmount(() => {// ...  例如进入列表页 显示按钮})onUnmounted(() => {// ... })onActivated(() => {// ... })onDeactivated(() => {// ... })onErrorCaptured(() => {// ... })}
}

从Vue2转换到Vue3

这个方便的Vue2到Vue3的生命周期映射直接来自于Vue3 Composition API 文档,我认为这是一种最有用的方式来查看事情将如何变化,以及我们如何使用它们。

  • beforeCreate -> use setup()
  • created -> use setup()
  • beforeMount -> onBeforeMount
  • mounted -> onMounted
  • beforeUpdate -> onBeforeUpdate
  • updated -> onUpdated
  • beforeDestroy -> onBeforeUnmount
  • destroyed -> onUnmounted
  • errorCaptured -> onErrorCaptured

Vue2模板

<template><div><Header></Header><div class="article_list"><ul><li></li></ul></div><Footer></Footer></div>
</template>
<script>
import Header from '../components/header.vue'
import Footer from '../components/footer.vue'
export default {components: { Header, Footer },data () {return {list: []}},created () {this.getData()},methods: {getData () {this.$api.get('topics', null, r => {console.log(r)})}}
}
</script>
<style>.article_list {margin: auto;}
</style>

Vue3

<template><div><p>{{id}}--{{name}}--{{num}}</p><button @click="change1">点击</button></div>
</template>
<script>
import { reactive ,toRefs,computed,onMounted,onUnmounted} from 'vue'
export default {name: "component_name",setup() {// reactive 数据双向绑定const data = reactive({id:1,name:'',num:computed(()=>state.id+=5) //计算属性})// 方法const methods = {change1(){},change2(){}}const test = ()=>{console.log('方法测试')}//页面加载完成onMounted(() => {})//销毁onUnmounted(() => {})return {// toRefs转换为响应式数据...toRefs(data),...methods,test}}
}
</script>
<style lang="scss" scoped>
</style>

常用Composition API  https://blog.csdn.net/THcoding_Cat/article/details/114155707
1.setup
组合API的入口,只在初始化时执行一次;函数中若返回对象,对象中的属性或方法,可在模板中直接使用

export default {setup(){// 非响应式数据(响应式数据:数据变化,页面跟着渲染变化)let count = 0;// 方法let updateCount = () => {console.log('updateCount');count++;}// 返回一个对象return{//属性count,updateCount}}
}

2.setup细节问题
2.1.setup执行时机 
在beforeCreate执行一次,此时组件并未创建 
因组件并未创建,则this为undefined;不能用this来访问data/methods/props;所以setup函数中不能使用this
其余所有compositionAPI相关回调函数中也不可以使用this
示例:

export default {beforeCreate(){console.log('beforeCreate',this);},created(){console.log('created',this); },setup(){console.log('setup',this);return{}}
}

执行结果:

可以看到setup中没有this;且vue3.x中的this做了处理,是一个proxy对象

tips:网上还有setup执行时机是在beforeCreate和created之间这种说法?

从上图打印效果最直观的讲,setup的执行在beforeCreate和created之前

其次,beforeCreate和created内部是有this存在的,而setup中this为undefined,这也验证了setup的执行在beforeCreate和created之前

在Vue3.x中生命周期函数发生了语义化的变化,比如beforeDestroy变更为了beforeUnmount;其他生命周期均小有变化,且其他生命周期均在setup中执行;

而beforeCreate和created还维持原本,这说明Vue3.x中本身并没考虑为beforeCreate和created留有位子,而是使用setup来代替这两者,之所以Vue3.x中还有这两个钩子函数,主要是为了向下兼容

2.2.setup的返回值 
一般都返回一个对象
返回对象中的属性会与data函数返回对象合并成为组件对象的属性
返回对象中的方法会与methods中的方法合成为组件对象的方法
如有重名,setup优先
不推荐混用,methods中可以访问setup提供的属性余方法;而setup中却不能访问data/methods
setup不推荐是一个async函数:因为返回只不再是return的对象,而是promise,模板看不到return对象中的属性数据 
tips:setup可不可以是一个async函数?

可以是一个async函数,但是由于是异步,使得数据不会立即给到模板,可以使Suspense标签解决该问题,代码示例如下:

在异步组件中的setup中使用async,在未得到数据前会有一个加载中的过渡效果

<template><h1>Suspense的使用</h1><Suspense><template #default><!--异步组件--><HelloWorld /></template><template v-slot:fallback><h2>加载中...</h2>  </template></Suspense>
</template>

参考:https://zhuanlan.zhihu.com/p/137364605

2.3.setup中的参数
setup(props,context) / setup(props,{attrs,slots,emit}) 
props:包含props配置中声明的属性的对象,可用于父传子传值
attrs:包含没有在props配置中声明的属性的对象,相当于this.$attrs
slots:包含所有传入的插槽内容的对象,相当于this.$slots
emit:用来分发自定义事件的函数,相当于this.$emit,可用于子传父传值
tips:setup中接收的props是响应式,当传入新的props时,会及时更新,由于是响应式的,所以不可以使用ES6解构,解构会消除响应式

同理,setup中声明的响应式对象也不可解构,而是返回的时候使用toRefs来进行转换 
示例:

export default {name: 'HelloWorld',props: {msg: String},setup(props,context){console.log('props:',props);console.log('props.msg:',props.msg);console.log('context:',context);return {}}
}

执行结果:

新的调试钩子函数

们还可以在Vue3中使用两个全新的钩子函数来进行调试。他们是:

  • onRenderTracked
  • onRenderTriggered

这两个事件都带有一个DebuggerEvent,它使我们能够知道是什么导致了Vue实例中的重新渲染。

export default {onRenderTriggered(e) {debugger// 检查哪个依赖项导致组件重新呈现}
}

就是这样!

Vue3中使用生命周期函数相关推荐

  1. Vue.js中的生命周期函数

    1. 组件创建阶段: beforeCreate(),这是我们遇到的第一个生命周期函数.表示实例被完全创建出来之前,会执行这个生命周期函数. created(),这是遇到的第二个生命周期函数. befo ...

  2. vue中的生命周期函数都在什么时候执行?

    1.beforeCreat 第一个生命周期函数,表示实例在完全创建出来之前会执行它,在执行它时,data和methods中的数据都还未初始化. 2.created 第二个生命周期函数,此时data和m ...

  3. flutter中的生命周期函数

    前言:生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情, flutter中的State生命周期和android以及React Native的生命周期类似. 先看一 ...

  4. Vue3生命周期函数的那些事

    前言 这篇文章给大家介绍关于Vue3中生命周期函数的问题 使用过Vue3的朋友都知道,随着 composition API 的引入,我们在使用钩子函数上也发生了一些改变 Vue3的生命周期函数 下面告 ...

  5. vue3.0生命周期函数

    什么是生命周期: vue中每个组件都是独立的,每个组件都有一个属于它的生命周期,从一个组件创建.数据初始化.挂载.更新.销毁,这就是一个组件所谓的生命周期. 在vue2.x中的生命周期为 before ...

  6. react生命周期函数

    在react中,生命周期函数指的是组件在加载前,加载后,以及组件更新数据和组件销毁时触发的一系列方法.通常分为以下几类: 组件加载的时候触发的函数:constructor .componentWill ...

  7. uni-app的三种生命周期函数整理

    uni-app中有三种生命周期函数:应用生命周期.页面生命周期.组件生命周期. 一.应用生命周期 onLaunch:当uni-app初始化完成时触发(全局只触发一次) onShow:当uni-app启 ...

  8. React 生命周期函数使用场景 及ajax请求 前端模拟数据

    React 中的生命周期函数是很重要的. 我们在写组件的时候,组件都是继承自React.Component 的,Component内置了其他所有生命周期函数,唯独没有render 函数.因此我们在写组 ...

  9. 前端学习之vue的生命周期函数

    一.什么是生命周期函数 我想,对于生命周期,咱都不会陌生,所谓生命周期,就是一个过程,从开始到结束,顾名思义,就像生命一样,从诞生到消逝.而生命周期函数,就是在这个生命周期的不同阶段中会被调用的函数, ...

  10. 小程序的生命周期函数

    小程序中的生命周期函数钩子函数 声明周期: 声明周期是指一个小程序从创建到销毁的一系列过程 小程序的两种生命周期 在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面 1.小 ...

最新文章

  1. Ubuntu 12.04 64bit上安装Apache Traffic Server 4.1.2
  2. IOS UITabBarViewController 修改背景颜色
  3. Mysql —— linux下使用c语言访问mySql数据库
  4. java condition_(原创)Java的ReentrantLock(可重入锁)下的Condition
  5. ***K近邻Survey-Distance总结
  6. 水滴石穿C语言之编译器引出的问题
  7. 详解CNN实现中文文本分类过程
  8. 投稿期刊:机械人机交互图形图象交叉学科
  9. OpenCV-图像处理(26、直方图反向投影(Back Projection))
  10. 《你不可不知的50个艺术知识》之抽象画
  11. QPainter绘图
  12. 很全的HTML5功能概述,温故而知新,可以为师矣!
  13. 数据库小型教务系统,成绩管理系统
  14. 99行拓扑优化matlab程序解读,99行拓扑优化 代码解析
  15. apfs扩容_MacBook Air 2015 换硬盘心得
  16. 关于支付系统(支付通道,支付接口)
  17. 微信小程序图片的比例问题
  18. scrum立会报告+燃尽图(第二周第六次)
  19. SLAM——之Sophus函数库
  20. 《毕业论文新手入坑手册》分享

热门文章

  1. HAU寒假训练第一周
  2. 第四章—密钥管理与分配
  3. w10恢复出厂设置_win10系统恢复出厂设置失败如何解决
  4. html顺势正旋转360度,庞明:混元太极揉球
  5. Ubuntu 升级显卡驱动
  6. python三国演义人物 统计分析_使用python统计《三国演义》小说里人物出现次数前十名,并实现可视化。...
  7. [NOI2021] 密码箱——连分数、动态DP
  8. 初遇初识初知接下来是什么_娱乐圈隐藏学霸,演技零差评,张新成凭什么不火?...
  9. 在线生成圣诞帽子的头像HTML源码
  10. Android项目开发总结