vue3使用4--生命周期函数HOOK的使用(组合式API)

本文展示了Vue 3.x中父子组件的交互方式,通过一个简单的例子演示了如何使用`ref`在父组件中控制子组件的显示。同时,详细比较了Vue 2.x和3.x的生命周期钩子,探讨了从2.x到3.x的变化,包括`setup`函数的使用以及新的生命周期钩子如`onBeforeMount`, `onMounted`, `onBeforeUpdate`等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、父组件

<template>
    <h2>APP父级组件</h2>
    <button @click="isShow=!isShow">切换显示</button>
    <hr/>
    <Child v-if="isShow"/>
</template>
<script lang="ts">
import Child from './components/Child.vue'
import { defineComponent, ref} from 'vue'
export default defineComponent({
  name: 'App',
  components:{
    Child
  },
  setup(){
    const isShow = ref(true)
    return{
      isShow
    }
  }
})
</script>
<style>
</style>

2、子组件

<template>
    <h2>Child子级组件</h2>
    <h4>msg:{{msg}}</h4>
    <button @click="update">更新数据</button>
</template>
<script lang="ts">
import { defineComponent, onBeforeMount, onBeforeUpdate, onMounted, onUnmounted, onUpdated, ref} from 'vue'
export default defineComponent({
    name: 'Child',
    //vue2.x中的生命周期钩子
    beforeCreate(){
        console.log('2.x中的beforecreate')
    },
    created(){
        console.log('2.x中的created')
    },
    beforeMount(){
        console.log('2.x中的beforeMount')
    },
    mounted(){
        console.log('2.x中的mounted')        
    },
    beforeUpdate(){
        console.log('2.x中的beforeUpdate')        
    },
    updated(){
        console.log('2.x中的updated')        
    },
    beforeUnmount(){
        console.log('2.x中的beforeUnmount')  
    },
    unmounted(){
        console.log('2.x中的unmounted')  
    },
    // beforeDestroy(){
    //     console.log('2.x中的beforeDestroy')        
    // },
    // destroyed(){
    //     console.log('2.x中的destroyed')        
    // },

    setup(){
        console.log("3.x中的setup")
        const msg = ref('abc')
        // const update = ()=> {
        //     msg.value += '==='
        // }
        onBeforeMount(()=>{
            console.log('3.x中的onBeforeMount')
        })
        onMounted(()=>{
            console.log('3.x中的onMounted')
        })
        onBeforeUpdate(()=>{
            console.log('3.x中的onBeforeUpdate')
        })
        onUpdated(()=>{
            console.log('3.x中的onUpdated')
        })
        onUnmounted(()=>{
            console.log('3.x中的onUnmounted')
        })

        function update(){
            msg.value += '==='
        }
        return{
            msg,
            update
        }

    }

})
</script>
<style>
</style>

3、显示结果

 

<think>我们之前讨论了Vue2和Vue3生命周期的差异,现在用户的问题是在uni-app开发中如何组合使用Vue2和Vue3生命周期。 注意:uni-app是一个使用Vue.js开发跨平台应用的框架,支持Vue2和Vue3。用户可能同时使用Vue2和Vue3的写法,或者需要迁移。 关键点: 1. uni-app中,页面和组件都可以使用生命周期钩子。 2. uni-app自身也提供了一些页面生命周期(如onLoad, onShow等),这些与Vue生命周期并存。 3. 在Vue3的Composition API中,可以使用组合式函数来组织代码,包括生命周期钩子。 步骤: 1. 区分Vue2和Vue3在uni-app中的使用方式。 2. 注意uni-app页面生命周期与Vue生命周期的关系。 3. 如何在一个项目中同时使用(比如迁移阶段)或选择使用。 详细说明: 一、Vue2选项式API(Options API)在uni-app中的使用 -Vue2项目中,使用选项式API定义生命周期钩子,如created, mounted等。 - 同时,uni-app页面还可以使用onLoad, onShow等页面生命周期钩子(这些是uni-app特有的,与Vue生命周期独立)。 二、Vue3组合式API(Composition API)在uni-app中的使用 -Vue3项目中,可以使用Composition API(通过`setup`函数)和新的生命周期钩子(如onMounted, onUnmounted等)。 - 同时,uni-app页面生命周期钩子(如onLoad, onShow)在Composition API中可以通过`onXXXX`函数的形式使用(注意:这些是uni-app提供的,不是Vue提供的)。 三、组合使用Vue2和Vue3生命周期的场景 - 场景1:项目从Vue2升级到Vue3,部分组件使用Options API,部分使用Composition API- 在同一个组件中,不建议混用(即一个组件内不要同时使用Options API和Composition API定义生命周期)。 - 但在整个项目中,可以同时存在两种写法的组件。 - 注意:在Vue3中,Options API生命周期钩子仍然可用(除了`beforeDestroy`和`destroyed`被重命名为`beforeUnmount`和`unmounted`,但为了兼容,Vue3也支持旧的名称)。 - 场景2:在Vue3的Composition API中,如何同时使用Vue生命周期钩子和uni-app页面生命周期钩子? - 在`setup`中,使用Vue3的钩子(如`onMounted`)和uni-app的钩子(如`onLoad`)是并行的,互不影响。 - 示例: ```javascript import { onMounted } from &#39;vue&#39;; export default { setup() { // uni-app页面生命周期 onLoad(() => { console.log(&#39;页面加载&#39;); }); onShow(() => { console.log(&#39;页面显示&#39;); }); // Vue3生命周期 onMounted(() => { console.log(&#39;组件挂载&#39;); }); } } ``` 四、注意事项 - 在uni-app中,页面生命周期钩子(如onLoad, onShow)的执行时机与Vue生命周期钩子不同。例如: - onLoad: 页面加载时触发,早于Vue的beforeCreate和created。 - onShow: 页面显示时触发,可能在Vue的mounted之后(具体取决于页面初始化情况)。 - 避免在同一个组件中混合使用Options API和Composition API定义同一个生命周期(例如,不要在setup中使用onMounted的同时又在methods同级的选项中定义mounted),因为这样会导致两个钩子都被调用,且执行顺序可能不确定(Composition API的钩子先注册,但Options API的钩子后执行?实际上,Vue3中Composition API的钩子在Options API钩子之前执行,但uni-app的页面生命周期钩子又有所不同)。 五、迁移建议 - 如果使用Vue3,推荐使用Composition API,因为它提供了更好的逻辑组织和复用。 - 在迁移过程中,可以逐步将Options API的组件改写为Composition API。 六、示例对比(Vue2 vs Vue3在uni-app中的生命周期使用Vue2(Options API)示例: ```javascript export default { data() { return { message: &#39;Hello&#39; }; }, onLoad() { console.log(&#39;页面加载 - uni-app生命周期&#39;); }, created() { console.log(&#39;Vue实例创建完成&#39;); }, mounted() { console.log(&#39;Vue实例挂载完成&#39;); } }; ``` Vue3(Composition API)示例: ```javascript import { onMounted } from &#39;vue&#39;; export default { setup() { // uni-app页面生命周期 onLoad(() => { console.log(&#39;页面加载 - uni-app生命周期&#39;); }); // Vue3生命周期 onMounted(() => { console.log(&#39;Vue实例挂载完成&#39;); }); } }; ``` 七、uni-app页面生命周期与Vue生命周期的执行顺序(以Vue3为例) 1. onLoad (uni-app) 2. onShow (uni-app) 3. Vue的beforeCreate(在Composition API中,setup函数相当于beforeCreate和created阶段,所以在setup函数内部代码会在这些阶段执行) 4. Vue的created(同上,setup函数内部) 5. onReady (uni-app) 页面初次渲染完成 6. Vue的onMounted (在Composition API中注册的onMounted) 注意:在Vue3的Composition API中,没有直接的beforeCreate和created钩子,因为setup函数本身就在这两个钩子期间运行。所以,在setup函数中直接写的代码就相当于created钩子中的代码。 八、总结 - 在uni-app中,Vue2和Vue3生命周期可以分别按照各自框架的规则使用- 同时,uni-app的页面生命周期(如onLoad, onShow)是独立于Vue生命周期的,可以在任何写法中使用-Vue3的Composition API中,使用`onXXXX`函数来注册Vue生命周期钩子,而uni-app页面生命周期钩子也是通过类似的方式(直接使用onLoad等)注册,但它们是两个不同的系统。 注意:用户提供的引用[1]提到uni-app中获取DOM的问题,但这里我们主要关注生命周期,所以不展开。 最后,生成相关问题:</think>### Uni-app 中组合使用 Vue2 和 Vue3 生命周期的实践指南 在 Uni-app 开发中,Vue2 和 Vue3生命周期可以共存,但需注意执行顺序和兼容性。以下是关键实践方法: #### 1. **基础组合方式** - **Vue2 选项式 API + Vue3 组合式 API 共存** 在 `.vue` 文件中同时使用两种 API: ```vue <script> import { onMounted } from &#39;vue&#39; export default { // Vue2 选项式 API created() { console.log(&#39;Vue2 created&#39;) }, mounted() { console.log(&#39;Vue2 mounted&#39;) }, // Vue3 组合式 API setup() { onMounted(() => { console.log(&#39;Vue3 onMounted&#39;) }) } } </script> ``` **执行顺序**: `created` (Vue2) → `setup()` (Vue3) → `mounted` (Vue2) → `onMounted` (Vue3)[^1] #### 2. **Uni-app 页面生命周期与 Vue 生命周期的整合** Uni-app 的页面生命周期(如 `onLoad`, `onShow`)可同时与 Vue2/Vue3 生命周期配合: ```vue <script> export default { // Uni-app 页面生命周期 onLoad() { console.log(&#39;页面加载&#39;) }, onShow() { console.log(&#39;页面显示&#39;) }, // Vue2 生命周期 mounted() { console.log(&#39;DOM挂载完成&#39;) }, // Vue3 Composition API setup() { import { onMounted } from &#39;vue&#39; onMounted(() => { console.log(&#39;组合式挂载&#39;) }) } } </script> ``` **执行顺序**: `onLoad` → `onShow` → `created` (Vue2) → `setup()` (Vue3) → `mounted` (Vue2) → `onMounted` (Vue3)[^1] #### 3. **跨版本兼容性处理** - **销毁/卸载钩子的统一** Vue3 将 `beforeDestroy/destroyed` 重命名为 `beforeUnmount/unmounted`,建议在代码中统一使用新名称: ```javascript // 兼容写法 export default { beforeUnmount() {}, // Vue3 优先使用 beforeDestroy() {} // Vue2 兼容保留 } ``` - **响应式数据隔离** Vue2 的 `data` 和 Vue3 的 `ref/reactive` 避免直接混用: ```vue <script> import { ref } from &#39;vue&#39; export default { data() { return { count: 0 } // Vue2 数据 }, setup() { const message = ref(&#39;&#39;) // Vue3 数据 return { message } } } </script> ``` #### 4. **组合式 API 的最佳实践** 推荐将逻辑封装到自定义 Hook 中复用: ```javascript // hooks/useUserData.js import { onMounted, ref } from &#39;vue&#39; export function useUserData() { const user = ref(null) onMounted(async () => { user.value = await uni.request({ url: &#39;/api/user&#39; }) }) return { user } } ``` ```vue <script> import { useUserData } from &#39;@/hooks/useUserData&#39; import { onBeforeUnmount } from &#39;vue&#39; export default { setup() { const { user } = useUserData() onBeforeUnmount(() => { console.log(&#39;组件卸载前清理&#39;) }) return { user } }, // Vue2 生命周期 mounted() { console.log(&#39;DOM操作放在这里&#39;, this.$refs.container) } } </script> ``` #### 5. **注意事项** 1. **执行顺序冲突** Vue2 的 `mounted` 和 Vue3 的 `onMounted` 可能竞争操作 DOM,建议将 DOM 操作统一放在 Vue2 的 `mounted` 中。 2. **平台差异处理** 在 `uvue` 等特殊环境中,部分生命周期行为可能不同: ```javascript onLoad() { // 在 app-uvue 中获取当前 activity 需通过页面栈 const pages = getCurrentPages() const activity = pages[pages.length - 1].$scope.activity } ``` 3. **迁移路径** ```mermaid graph LR A[Vue2项目] --> B[逐步引入setup] B --> C[替换data为ref/reactive] C --> D[迁移生命周期到onXxx] D --> E[移除Options API] ``` > **关键建议**:新项目推荐纯 Vue3 开发,旧项目迁移时优先保持 Vue2 生命周期主体,逐步替换为 Composition API[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值