如描述,在一个刷新场景,当前Tabs索引已经非0,触发刷新后,更新Tabs绑定的List数据源,更新后Tabs内部更新索引为0。
【问题】如何在更新数据源的同时,不引起索引的变化,还保持当前索引选中?
Tips:
为了保证tab刷新,重新了Tabs中ForEach的keyGenerator,每次都是uuid
核心代码如下:
定义NCTabs
@Link @Watch("onIndexChanged") currentIndex: number
@Prop @Watch("adjustBarPosition") private tabs: Array<NCAny> = []
Tabs({ index: $$this.currentIndex, barPosition: BarPosition.Start, controller: this.tabController }) {
ForEach(this.tabs, (item: NCAny, index: number) => {
TabContent() {
this.tabContentBuilder(index, item)
}
}, (item: NCAny, index) => this.tabContentId(index, item))
}
.onChange((index: number) => {
Logger.logD("homerecommendonchange:" + index)
this.currentIndex = index // 监听索引index的变化,实现页签内容的切换。
})
onIndexChanged(changedPropertyName: string) {
Logger.logD("onIndexChanged")
}
申明并使用View
@Builder
tabBuilder() {
NCTabs({
tabs: this.tabList,
currentIndex: this.currentTabIndex,
initIndex: this.currentTabIndex,
tabContentBuilder: (index: number, item: NCAny) => {
this.tabContentBuild(index, item as HomeTabs)
},
tabBarItemBuilder: (index: number, item: NCAny) => {
this.tabBarBuilder(this.tabList[index].tagName, index)
},
tabContentId: (index, item) => {return util.generateRandomUUID()}
})
}
获取数据并刷新
checkTabs(force: boolean): Promise<Array<HomeTabs> | null> {
return new Promise<Array<HomeTabs> | null>((resolve) => {
if (force || !this.remoteTabs) {
this.mModel.getHomeTabsV2({
onSuccess: (tabData) => {
if (tabData && tabData.tabs) {
this.tabList = HomeUtils.defaultHomeTabs().concat(tabData.tabs)
}
},
onFinish: () => {
// todo
// this.refreshController.finishRefresh()
resolve(this.tabList)
}
})
} else {
resolve(this.tabList)
}
})
}
以下demo,可以直接运行,切换到其他tab后,点击refresh,索引重置到0