提交 45709108 编写于 作者: DCloud-WZF's avatar DCloud-WZF 💬

feat: 组件生命周期补充 activated deactivated 示例及测试

上级 1e7ff753
...@@ -57,7 +57,7 @@ onUnload(() => { ...@@ -57,7 +57,7 @@ onUnload(() => {
onBeforeMount(() => { onBeforeMount(() => {
// 自动化测试 // 自动化测试
setLifeCycleNum(state.lifeCycleNum + 1) setLifeCycleNum(state.lifeCycleNum + 1)
console.log('component for lifecycle test mounted') console.log('component for lifecycle test onBeforeMount')
}) })
onMounted(() => { onMounted(() => {
...@@ -90,10 +90,16 @@ onUnmounted(() => { ...@@ -90,10 +90,16 @@ onUnmounted(() => {
console.log('component for lifecycle test unmounted') console.log('component for lifecycle test unmounted')
}) })
// TODO: app-android 不触发 onActivated(() => {
onActivated(() => { }) // 自动化测试
// TODO: app-android 不触发 setLifeCycleNum(state.lifeCycleNum + 1)
onDeactivated(() => { }) console.log('component for lifecycle test onActivated')
})
onDeactivated(() => {
// 自动化测试
setLifeCycleNum(state.lifeCycleNum - 1)
console.log('component for lifecycle test onDeactivated')
})
const updateTitle = () => { const updateTitle = () => {
title.value = 'component for lifecycle test updated' title.value = 'component for lifecycle test updated'
......
...@@ -54,6 +54,16 @@ ...@@ -54,6 +54,16 @@
setLifeCycleNum(state.lifeCycleNum - 1); setLifeCycleNum(state.lifeCycleNum - 1);
console.log('component for lifecycle test unmounted'); console.log('component for lifecycle test unmounted');
}, },
activated() {
// 自动化测试
setLifeCycleNum(state.lifeCycleNum + 1);
console.log('component for lifecycle test activated');
},
deactivated() {
// 自动化测试
setLifeCycleNum(state.lifeCycleNum - 1);
console.log('component for lifecycle test deactivated');
},
methods: { methods: {
updateTitle() { updateTitle() {
this.title = 'component for lifecycle test updated'; this.title = 'component for lifecycle test updated';
......
...@@ -4,6 +4,9 @@ const HOME_PATH = '/pages/index/index' ...@@ -4,6 +4,9 @@ const HOME_PATH = '/pages/index/index'
describe('component-lifecycle', () => { describe('component-lifecycle', () => {
let page let page
let lifeCycleNum let lifeCycleNum
const platformInfo = process.env.uniTestPlatformInfo.toLocaleLowerCase()
const isAndroid = platformInfo.includes('android')
const isIos = platformInfo.includes('ios')
beforeAll(async () => { beforeAll(async () => {
page = await program.reLaunch(HOME_PATH) page = await program.reLaunch(HOME_PATH)
await page.waitFor(700) await page.waitFor(700)
...@@ -22,9 +25,23 @@ describe('component-lifecycle', () => { ...@@ -22,9 +25,23 @@ describe('component-lifecycle', () => {
expect(lifeCycleNum).toBe(resetLifecycleNum) expect(lifeCycleNum).toBe(resetLifecycleNum)
}) })
it('onLoad onPageShow onReady onBeforeMount onMounted', async () => { it('onLoad onPageShow onReady onBeforeMount onMounted onActivated', async () => {
lifeCycleNum = await page.callMethod('pageGetLifeCycleNum')
// TODO: android 组合式 API 不触发 onActivated
expect(lifeCycleNum).toBe(isAndroid ? 112 : 113)
})
it('onDeactivated', async () => {
// TODO: android 组合式 API 不触发 onActivated onDeactivated
const toggleAliveComponentBtn = await page.$('#toggle-alive-component-btn')
await toggleAliveComponentBtn.tap()
lifeCycleNum = await page.callMethod('pageGetLifeCycleNum') lifeCycleNum = await page.callMethod('pageGetLifeCycleNum')
expect(lifeCycleNum).toBe(112) expect(lifeCycleNum).toBe(112)
await toggleAliveComponentBtn.tap()
lifeCycleNum = await page.callMethod('pageGetLifeCycleNum')
// TODO: android 端 keep-alive 组件切换时,不触发 activated, 会触发 beforeUpdate updated
expect(lifeCycleNum).toBe(isAndroid ? 114 : 113)
await page.callMethod('pageSetLifeCycleNum', 0) await page.callMethod('pageSetLifeCycleNum', 0)
}) })
it('onBeforeUpdate onUpdated', async () => { it('onBeforeUpdate onUpdated', async () => {
...@@ -56,17 +73,19 @@ describe('component-lifecycle', () => { ...@@ -56,17 +73,19 @@ describe('component-lifecycle', () => {
page = await program.navigateTo(HOME_PATH) page = await program.navigateTo(HOME_PATH)
await page.waitFor('view') await page.waitFor('view')
lifeCycleNum = await page.callMethod('getLifeCycleNum') lifeCycleNum = await page.callMethod('getLifeCycleNum')
expect(lifeCycleNum).toBe(-10) // TODO: ios 跳转页面, 未触发 keep-alive 组件 onDeactivated,返回未触发 onActivated
// TODO: android 跳转页面, 未触发 keep-alive 组件 onDeactivated,返回未触发 onActivated
expect(lifeCycleNum).toBe(isIos || isAndroid ? -10 : -11)
page = await program.navigateBack() page = await program.navigateBack()
await page.waitFor('view') await page.waitFor('view')
lifeCycleNum = await page.callMethod('pageGetLifeCycleNum') lifeCycleNum = await page.callMethod('pageGetLifeCycleNum')
expect(lifeCycleNum).toBe(0) expect(lifeCycleNum).toBe(0)
await page.callMethod('pageSetLifeCycleNum', 0)
}) })
it('beforeUnmount unmounted onUnload onBackPress', async () => { it('onDeactivated beforeUnmount unmounted onUnload onBackPress', async () => {
page = await program.navigateBack() page = await program.navigateBack()
lifeCycleNum = await page.callMethod('getLifeCycleNum') lifeCycleNum = await page.callMethod('getLifeCycleNum')
expect(lifeCycleNum).toBe(-112) // TODO: android 组合式 API 不触发 onDeactivated
expect(lifeCycleNum).toBe(isAndroid ? -112 : -113)
await page.callMethod('setLifeCycleNum', 0) await page.callMethod('setLifeCycleNum', 0)
}) })
}) })
\ No newline at end of file
...@@ -4,8 +4,11 @@ ...@@ -4,8 +4,11 @@
<!-- #endif --> <!-- #endif -->
<view class="page container"> <view class="page container">
<text class="mb-10">component lifecycle 组合式 API</text> <text class="mb-10">component lifecycle 组合式 API</text>
<child-component @updateIsScroll="updateIsScroll" /> <keep-alive>
<component :is="aliveComponent" @updateIsScroll="updateIsScroll" />
</keep-alive>
<button class="mt-10" @click="scrollToBottom">scrollToBottom</button> <button class="mt-10" @click="scrollToBottom">scrollToBottom</button>
<button id="toggle-alive-component-btn" class="mt-10" @click="toggleAliveComponent">toggle alive component</button>
</view> </view>
<!-- #ifdef APP --> <!-- #ifdef APP -->
</scroll-view> </scroll-view>
...@@ -16,6 +19,8 @@ ...@@ -16,6 +19,8 @@
import ChildComponent from './ChildComponentComposition.uvue' import ChildComponent from './ChildComponentComposition.uvue'
import { state, setLifeCycleNum } from '@/store/index.uts' import { state, setLifeCycleNum } from '@/store/index.uts'
const aliveComponent = shallowRef<any | null>(ChildComponent)
const isScrolled = ref(false) const isScrolled = ref(false)
// 自动化测试 // 自动化测试
...@@ -24,7 +29,7 @@ ...@@ -24,7 +29,7 @@
} }
// 自动化测试 // 自动化测试
const pageSetLifeCycleNum = (num : number) => { const pageSetLifeCycleNum = (num : number) => {
setLifeCycleNum(num) setLifeCycleNum(num)
} }
...@@ -44,6 +49,10 @@ ...@@ -44,6 +49,10 @@
scrollTop: 3000, scrollTop: 3000,
}) })
} }
const toggleAliveComponent = () => {
aliveComponent.value = aliveComponent.value == null ? ChildComponent : null
}
const updateIsScroll = (val : boolean) => { const updateIsScroll = (val : boolean) => {
isScrolled.value = val isScrolled.value = val
......
...@@ -2,39 +2,51 @@ const PAGE_PATH = '/pages/lifecycle/component/component-options' ...@@ -2,39 +2,51 @@ const PAGE_PATH = '/pages/lifecycle/component/component-options'
const HOME_PATH = '/pages/index/index' const HOME_PATH = '/pages/index/index'
describe('component-lifecycle', () => { describe('component-lifecycle', () => {
let page let page
let lifeCycleNum let lifeCycleNum
beforeAll(async () => { const platformInfo = process.env.uniTestPlatformInfo.toLocaleLowerCase()
page = await program.reLaunch(HOME_PATH) const isAndroid = platformInfo.includes('android')
await page.waitFor(700) beforeAll(async () => {
const initLifecycleNum = 0 page = await program.reLaunch(HOME_PATH)
await page.callMethod('setLifeCycleNum', initLifecycleNum) await page.waitFor(700)
lifeCycleNum = await page.callMethod('getLifeCycleNum') const initLifecycleNum = 0
expect(lifeCycleNum).toBe(initLifecycleNum) await page.callMethod('setLifeCycleNum', initLifecycleNum)
lifeCycleNum = await page.callMethod('getLifeCycleNum')
expect(lifeCycleNum).toBe(initLifecycleNum)
page = await program.navigateTo(PAGE_PATH) page = await program.navigateTo(PAGE_PATH)
await page.waitFor(700) await page.waitFor(700)
}) })
afterAll(async () => { afterAll(async () => {
const resetLifecycleNum = 1100 const resetLifecycleNum = 1100
await page.callMethod('setLifeCycleNum', resetLifecycleNum) await page.callMethod('setLifeCycleNum', resetLifecycleNum)
lifeCycleNum = await page.callMethod('getLifeCycleNum') lifeCycleNum = await page.callMethod('getLifeCycleNum')
expect(lifeCycleNum).toBe(resetLifecycleNum) expect(lifeCycleNum).toBe(resetLifecycleNum)
}) })
it('beforeCreate created beforeMount mounted', async () => { it('beforeCreate created beforeMount mounted activated', async () => {
lifeCycleNum = await page.callMethod('getLifeCycleNum') lifeCycleNum = await page.callMethod('getLifeCycleNum')
expect(lifeCycleNum).toBe(4) expect(lifeCycleNum).toBe(5)
}) })
it('beforeUpdate updated', async () => { it('deactivated', async () => {
const updateTitleBtn = await page.$('.component-lifecycle-btn') const toggleAliveComponentBtn = await page.$('#toggle-alive-component-btn')
await updateTitleBtn.tap() await toggleAliveComponentBtn.tap()
lifeCycleNum = await page.callMethod('getLifeCycleNum') lifeCycleNum = await page.callMethod('getLifeCycleNum')
expect(lifeCycleNum).toBe(6) expect(lifeCycleNum).toBe(4)
}) // TODO: android 端 keep-alive 组件切换时,不仅触发 activated, 之前还会触发 beforeUpdate updated
it('beforeUnmount unmounted', async () => { await toggleAliveComponentBtn.tap()
page = await program.navigateBack() lifeCycleNum = await page.callMethod('getLifeCycleNum')
lifeCycleNum = await page.callMethod('getLifeCycleNum') expect(lifeCycleNum).toBe(isAndroid ? 7 : 5)
expect(lifeCycleNum).toBe(4) })
}) it('beforeUpdate updated', async () => {
const updateTitleBtn = await page.$('.component-lifecycle-btn')
await updateTitleBtn.tap()
lifeCycleNum = await page.callMethod('getLifeCycleNum')
expect(lifeCycleNum).toBe(isAndroid ? 9 : 7)
})
it('deactivated beforeUnmount unmounted', async () => {
page = await program.navigateBack()
lifeCycleNum = await page.callMethod('getLifeCycleNum')
expect(lifeCycleNum).toBe(isAndroid ? 6 : 4)
})
}) })
\ No newline at end of file
<template> <template>
<view class="page"> <view class="page">
<text class="mb-10">component lifecycle 选项式 API</text> <text class="mb-10">component lifecycle 选项式 API</text>
<child-component /> <keep-alive>
<component :is="aliveComponent" />
</keep-alive>
<button id="toggle-alive-component-btn" class="mt-10" @click="toggleAliveComponent">toggle alive component</button>
</view> </view>
</template> </template>
...@@ -11,11 +14,19 @@ import { state } from '@/store/index.uts' ...@@ -11,11 +14,19 @@ import { state } from '@/store/index.uts'
export default { export default {
components: { ChildComponent }, components: { ChildComponent },
data(){
return {
aliveComponent: ChildComponent as any | null,
}
},
methods: { methods: {
// 自动化测试 // 自动化测试
getLifeCycleNum(): number { getLifeCycleNum(): number {
return state.lifeCycleNum return state.lifeCycleNum
}, },
toggleAliveComponent(){
this.aliveComponent = this.aliveComponent == null ? ChildComponent : null
}
}, },
} }
</script> </script>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册