HarmonyOS 鸿蒙Next 在swiper里LazyForEach切换子组件不销毁重建方法 HarmonyOS 鸿蒙Next Tabs组件内LazyForEach切换tab子组件不销毁重建实现 HarmonyOS 鸿蒙Next swiper实现的Tabs内部子页面LazyForEach切换不重建子组件方法

HarmonyOS 鸿蒙Next 在swiper里LazyForEach切换子组件不销毁重建方法
HarmonyOS 鸿蒙Next Tabs组件内LazyForEach切换tab子组件不销毁重建实现
HarmonyOS 鸿蒙Next swiper实现的Tabs内部子页面LazyForEach切换不重建子组件方法

import display from ‘@ohos.display’;
import { CommonDataSource } from ‘./CommonDataSource’;

@Component
struct TabContentW {
index: number = 0

aboutToAppear(): void {
console.log(’[TabContentW] aboutToAppear’ + this.index)
}

aboutToDisappear(): void {
console.log(’[TabContentW] aboutToDisappear’ + this.index)
}

build() {
Text(this.index + ‘’)
.fontSize(16)
}
}

@Component
struct TestBar {
@State curIndex: number = 0
@Prop tabDatas: string[] = []
datas: CommonDataSource<string> = new CommonDataSource([])
shouldChangeTab?: (form: number, to: number) => boolean
swiperController: SwiperController = new SwiperController()

changeTabTo(index: number) {
this.curIndex = index
}

aboutToAppear(): void {
this.datas.pushDataArray(this.tabDatas)
}

@State title: string = ‘’
@State deTitlt: string = ‘’

build() {
Column() {
Swiper(this.swiperController) {
LazyForEach(this.datas, (item: string, index) => {
TabContentW({ index: index })
}, (item: string, index) => {
return index + ‘’
})
}
.layoutWeight(1)
.index(this.curIndex)
.disableSwipe(true)
.cachedCount(0)
.vertical(false)
.loop(false)
.indicator(false)
.height(‘100%’)

Row() {
ForEach(this.tabDatas, (item: string, index: number) => {
Text(item)
.fontSize(18)
.layoutWeight(1)
.height(‘100%’)
.textAlign(TextAlign.Center)
.fontColor(this.curIndex === index ? Color.Red : Color.Black)
.onClick(() => {

/// todo 切换前判断是否切换tab
let change = this.shouldChangeTab?.(this.curIndex, index)
if (change) {
this.changeTabTo(index)
}
})
}, (item: string, index: number) => {
return item
})
}.width(‘100%’)
.justifyContent(FlexAlign.SpaceAround)
.height(56)

}.height(getScreenInfo().screenH - 20)
.position({ y: -px2vp(126) })
}
}

@Entry
@Component
export struct TabTest {
@State tabDatas: string[] = []
@State curIndex: number = 0
tabController: TabsController = new TabsController()

aboutToAppear(): void {
this.tabDatas = [‘首页’, ‘第二页’, ‘第三页’, ‘我的’]
}

@Builder
tabBar(title: string, index: number) {
Text(title)
.fontSize(18)
.fontColor(index === this.curIndex ? Color.Red : Color.Black)
}

@Builder
testCustonTab() {
TestBar({
tabDatas: this.tabDatas, shouldChangeTab: (from: number, to: number) => {
return true
}
}).width(‘100%’)
.height(‘100%’)
}

build() {
Stack({ alignContent: Alignment.Center }) {
this.testCustonTab()
}.width(‘100%’)
.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
}
}

function getScreenInfo(isVp: boolean = true): ScreenSize {
let displayInfo = display.getDefaultDisplaySync();
let screenW = displayInfo.width / (isVp ? displayInfo.scaledDensity : 1)
let screenH = displayInfo.height / (isVp ? displayInfo.scaledDensity : 1)
return {
screenW: screenW,
screenH: screenH
}
}

export interface ScreenSize {
screenW: number
screenH: number
}


更多关于HarmonyOS 鸿蒙Next 在swiper里LazyForEach切换子组件不销毁重建方法 HarmonyOS 鸿蒙Next Tabs组件内LazyForEach切换tab子组件不销毁重建实现 HarmonyOS 鸿蒙Next swiper实现的Tabs内部子页面LazyForEach切换不重建子组件方法的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

用系统tab方案,可以在onContentWillChange方法里进行逻辑处理


import { router } from '@kit.ArkUI'
import { JSON } from '@kit.ArkTS'

@Entry @Component export struct TabTest {

@State tabDatas: string[] = [] @State curIndex: number = 0 tabController: TabsController = new TabsController()

aboutToAppear(): void { this.tabDatas = [‘首页’,‘第二页’,‘第三页’,‘我的’] }

@Builder tabBar(title: string, index: number){ Text(title) .fontSize(18) .fontColor(index === this.curIndex ? Color.Red : Color.Black) }

build() { Column(){ Tabs({controller: this.tabController, barPosition: BarPosition.End, index: this.curIndex}) { ForEach(this.tabDatas, (item: string, index: number) => { TabContent(){ Stack({alignContent: Alignment.Center}) { Text(item).fontSize(50) .onClick(()=>{ router.pushUrl({url: “pages/TestPage”}).catch((e: Object)=>{ console.log(’[error] ’ + JSON.stringify(e)) }) }) } }.tabBar(this.tabBar(item, index)) }) }.onChange((index: number) => { this.curIndex = index console.log(’[test] index 5 q ’ + index + ’ cur ’ + this.curIndex) }) .onContentWillChange((currentIndex, comingIndex) => { if (comingIndex == 2) { router.pushUrl({url: “pages/onePage”}) return false } return true }) .scrollable(false) .animationDuration(0) } } }

更多关于HarmonyOS 鸿蒙Next 在swiper里LazyForEach切换子组件不销毁重建方法 HarmonyOS 鸿蒙Next Tabs组件内LazyForEach切换tab子组件不销毁重建实现 HarmonyOS 鸿蒙Next swiper实现的Tabs内部子页面LazyForEach切换不重建子组件方法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,要在swiper和Tabs组件中使用LazyForEach切换子组件而不销毁重建,可以通过以下方式实现:

对于swiper组件,你可以利用SwipeRefreshLayoutPagerSlider等容器,结合数据绑定和状态管理来保持子组件的状态。关键在于确保swiper在切换页面时不重新加载数据或重建视图。可以通过使用ViewModelRepository等设计模式来管理数据状态,确保在swiper切换时,数据模型和视图能够保持同步而不重建。

对于Tabs组件,类似地,你可以利用TabLayoutFragmentComponent的结合来实现。使用LazyForEach来渲染Tab的子组件时,需要确保Tab切换时不会触发子组件的重新创建。这通常可以通过维护一个持久的组件状态或使用类似的视图缓存机制来实现。

在Tabs内部swiper实现的场景中,你需要确保swiper和Tabs的交互逻辑正确,同时维护子组件的状态。这可能需要自定义一些逻辑来处理swiper和Tabs的切换事件,以及它们对子组件的影响。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部