Vue3中使用生命周期函数
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中使用生命周期函数相关推荐
- Vue.js中的生命周期函数
1. 组件创建阶段: beforeCreate(),这是我们遇到的第一个生命周期函数.表示实例被完全创建出来之前,会执行这个生命周期函数. created(),这是遇到的第二个生命周期函数. befo ...
- vue中的生命周期函数都在什么时候执行?
1.beforeCreat 第一个生命周期函数,表示实例在完全创建出来之前会执行它,在执行它时,data和methods中的数据都还未初始化. 2.created 第二个生命周期函数,此时data和m ...
- flutter中的生命周期函数
前言:生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情, flutter中的State生命周期和android以及React Native的生命周期类似. 先看一 ...
- Vue3生命周期函数的那些事
前言 这篇文章给大家介绍关于Vue3中生命周期函数的问题 使用过Vue3的朋友都知道,随着 composition API 的引入,我们在使用钩子函数上也发生了一些改变 Vue3的生命周期函数 下面告 ...
- vue3.0生命周期函数
什么是生命周期: vue中每个组件都是独立的,每个组件都有一个属于它的生命周期,从一个组件创建.数据初始化.挂载.更新.销毁,这就是一个组件所谓的生命周期. 在vue2.x中的生命周期为 before ...
- react生命周期函数
在react中,生命周期函数指的是组件在加载前,加载后,以及组件更新数据和组件销毁时触发的一系列方法.通常分为以下几类: 组件加载的时候触发的函数:constructor .componentWill ...
- uni-app的三种生命周期函数整理
uni-app中有三种生命周期函数:应用生命周期.页面生命周期.组件生命周期. 一.应用生命周期 onLaunch:当uni-app初始化完成时触发(全局只触发一次) onShow:当uni-app启 ...
- React 生命周期函数使用场景 及ajax请求 前端模拟数据
React 中的生命周期函数是很重要的. 我们在写组件的时候,组件都是继承自React.Component 的,Component内置了其他所有生命周期函数,唯独没有render 函数.因此我们在写组 ...
- 前端学习之vue的生命周期函数
一.什么是生命周期函数 我想,对于生命周期,咱都不会陌生,所谓生命周期,就是一个过程,从开始到结束,顾名思义,就像生命一样,从诞生到消逝.而生命周期函数,就是在这个生命周期的不同阶段中会被调用的函数, ...
- 小程序的生命周期函数
小程序中的生命周期函数钩子函数 声明周期: 声明周期是指一个小程序从创建到销毁的一系列过程 小程序的两种生命周期 在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面 1.小 ...
最新文章
- Ubuntu 12.04 64bit上安装Apache Traffic Server 4.1.2
- IOS UITabBarViewController 修改背景颜色
- Mysql —— linux下使用c语言访问mySql数据库
- java condition_(原创)Java的ReentrantLock(可重入锁)下的Condition
- ***K近邻Survey-Distance总结
- 水滴石穿C语言之编译器引出的问题
- 详解CNN实现中文文本分类过程
- 投稿期刊:机械人机交互图形图象交叉学科
- OpenCV-图像处理(26、直方图反向投影(Back Projection))
- 《你不可不知的50个艺术知识》之抽象画
- QPainter绘图
- 很全的HTML5功能概述,温故而知新,可以为师矣!
- 数据库小型教务系统,成绩管理系统
- 99行拓扑优化matlab程序解读,99行拓扑优化 代码解析
- apfs扩容_MacBook Air 2015 换硬盘心得
- 关于支付系统(支付通道,支付接口)
- 微信小程序图片的比例问题
- scrum立会报告+燃尽图(第二周第六次)
- SLAM——之Sophus函数库
- 《毕业论文新手入坑手册》分享
热门文章
- HAU寒假训练第一周
- 第四章—密钥管理与分配
- w10恢复出厂设置_win10系统恢复出厂设置失败如何解决
- html顺势正旋转360度,庞明:混元太极揉球
- Ubuntu 升级显卡驱动
- python三国演义人物 统计分析_使用python统计《三国演义》小说里人物出现次数前十名,并实现可视化。...
- [NOI2021] 密码箱——连分数、动态DP
- 初遇初识初知接下来是什么_娱乐圈隐藏学霸,演技零差评,张新成凭什么不火?...
- 在线生成圣诞帽子的头像HTML源码
- Android项目开发总结