HarmonyOS鸿蒙Next中@ComponentV2页面之间的开关状态管理
HarmonyOS鸿蒙Next中@ComponentV2页面之间的开关状态管理 想实现的是HomePage里面的HomePageCheckbox1对应的checkbox和Page1里面的开关Toggle状态能对应,2也一样,两个页面都需要持久化存储(Page1的话通过点击确定持久化,HomePage直接勾选),试过了AppStorageV2,有点不会用。有没有大佬教一下?
import { HMRouter, HMRouterMgr } from "@hadss/hmrouter";
import { deviceInfo } from "@kit.BasicServicesKit";
@HMRouter({ pageUrl: "HomePage" })
[@ComponentV2](/user/ComponentV2)
export struct HomePage {
@Local HomePageCheckbox1:boolean=true
@Local HomePageCheckbox2:boolean=true
aboutToAppear(): void {
}
build() {
Column() {
Tabs() {
TabContent() {
Column() {
Text('Tab1')
CheckboxListItem({
selectCheckbox: this.HomePageCheckbox1,
selectCallBack:()=>{
this.HomePageCheckbox1=!this.HomePageCheckbox1
}
})
CheckboxListItem({
selectCheckbox: this.HomePageCheckbox2,
selectCallBack:()=>{
this.HomePageCheckbox2=!this.HomePageCheckbox2
}
})
Button('跳转Page1')
.onClick(() => {
HMRouterMgr.push({ pageUrl: 'Page1' })
})
}
.height('100%')
.width('100%')
}.tabBar('Tab1')
TabContent() {
Column() {
Text('Tab2')
}
}.tabBar('Tab2')
}.barPosition(BarPosition.End)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}
[@ComponentV2](/user/ComponentV2)
struct CheckboxListItem {
@Param selectCheckbox: boolean = true
@Event selectCallBack: () => void = () => {
}
build() {
Row({ space: 5 }) {
Checkbox()
.height(20)
.width(20)
.select(this.selectCheckbox)
.selectedColor(Color.Orange)
.shape(CheckBoxShape.ROUNDED_SQUARE)
.onChange(()=>{
this.selectCallBack()
})
}
.width("100%")
.padding({
left: 15,
right: 15
})
.height(22.5)
}
}
import { HMRouter, HMRouterMgr } from "@hadss/hmrouter";
@HMRouter({pageUrl:'Page1'})
[@ComponentV2](/user/ComponentV2)
export struct Page1 {
@Local Page1Checkbox1:boolean = true
@Local Page1Checkbox2:boolean = true
build() {
Column(){
Text('Page1')
.fontSize(70)
.fontWeight(FontWeight.Bold)
settingToggle({
title: 'Checkbox1',
SelectToggle: () => {
this.Page1Checkbox1 = !this.Page1Checkbox1;
},
isOnToggle: this.Page1Checkbox1
})
settingToggle({
title: 'Checkbox1',
SelectToggle: () => {
this.Page1Checkbox2 = !this.Page1Checkbox2;
},
isOnToggle: this.Page1Checkbox2
})
Button('确认')
.onClick(() => {
HMRouterMgr.pop()
})
}
.width('100%')
.height('100%')
}
}
[@ComponentV2](/user/ComponentV2)
export struct settingToggle {
@Param @Require title: string;
@Param @Require isOnToggle: boolean;
@Event SelectToggle: () => void = () => {
}
build() {
Row() {
Text(this.title)
.fontSize(15)
.fontColor(Color.Black)
.textAlign(TextAlign.Start)
.padding(5)
.fontWeight(FontWeight.Bold)
Toggle({ type: ToggleType.Switch, isOn: this.isOnToggle })
.width(60)
.height(30)
.selectedColor('#FFC000')
.switchPointColor(Color.White)
.onChange(() => {
this.SelectToggle()
})
}
.width("100%")
.justifyContent(FlexAlign.SpaceBetween)
.height(60)
.padding(5)
}
}
更多关于HarmonyOS鸿蒙Next中@ComponentV2页面之间的开关状态管理的实战教程也可以访问 https://www.itying.com/category-93-b0.html
3 回复
- @Provider装饰器和@Consumer装饰器:跨组件层级双向同步 直接用这个 Home 里面Provider Page1 中使用Consumer
更多关于HarmonyOS鸿蒙Next中@ComponentV2页面之间的开关状态管理的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,要实现跨页面状态同步和持久化存储,使用AppStorageV2是正确的方案。以下是具体实现方法:
1. 定义AppStorageV2状态变量
在全局或共享文件中定义状态变量:
// 在共享文件(如GlobalState.ets)中定义
export const appStorageV2 = new AppStorageV2();
// 定义两个持久化状态
export const checkbox1State = appStorageV2.createStorage<boolean>('checkbox1', true);
export const checkbox2State = appStorageV2.createStorage<boolean>('checkbox2', true);
2. 修改HomePage使用AppStorageV2
import { checkbox1State, checkbox2State } from './GlobalState';
@HMRouter({ pageUrl: "HomePage" })
@ComponentV2
export struct HomePage {
@Local HomePageCheckbox1: boolean = checkbox1State.get();
@Local HomePageCheckbox2: boolean = checkbox2State.get();
build() {
Column() {
// ... 其他代码保持不变
CheckboxListItem({
selectCheckbox: this.HomePageCheckbox1,
selectCallBack: () => {
this.HomePageCheckbox1 = !this.HomePageCheckbox1;
checkbox1State.set(this.HomePageCheckbox1); // 持久化存储
}
})
CheckboxListItem({
selectCheckbox: this.HomePageCheckbox2,
selectCallBack: () => {
this.HomePageCheckbox2 = !this.HomePageCheckbox2;
checkbox2State.set(this.HomePageCheckbox2); // 持久化存储
}
})
// ... 其他代码
}
}
}
3. 修改Page1使用AppStorageV2
import { checkbox1State, checkbox2State } from './GlobalState';
@HMRouter({pageUrl:'Page1'})
@ComponentV2
export struct Page1 {
@Local Page1Checkbox1: boolean = checkbox1State.get();
@Local Page1Checkbox2: boolean = checkbox2State.get();
build() {
Column(){
// ... 其他代码
settingToggle({
title: 'Checkbox1',
SelectToggle: () => {
this.Page1Checkbox1 = !this.Page1Checkbox1;
},
isOnToggle: this.Page1Checkbox1
})
settingToggle({
title: 'Checkbox2', // 注意这里应该是Checkbox2
SelectToggle: () => {
this.Page1Checkbox2 = !this.Page1Checkbox2;
},
isOnToggle: this.Page1Checkbox2
})
Button('确认')
.onClick(() => {
// 点击确认时持久化存储
checkbox1State.set(this.Page1Checkbox1);
checkbox2State.set(this.Page1Checkbox2);
HMRouterMgr.pop();
})
}
}
}
4. 状态同步优化
为了实时同步状态变化,可以使用状态监听:
// 在HomePage的aboutToAppear中添加监听
aboutToAppear(): void {
checkbox1State.onChange((value: boolean) => {
this.HomePageCheckbox1 = value;
});
checkbox2State.onChange((value: boolean) => {
this.HomePageCheckbox2 = value;
});
}
关键点说明:
AppStorageV2.createStorage创建的状态会自动持久化到设备存储get()方法获取当前值,set()方法更新值并持久化onChange()监听状态变化,实现实时同步- Page1中点击"确认"时才持久化,符合你的需求
- HomePage中勾选时立即持久化
这样实现后,两个页面的开关状态会自动同步,并且数据会持久化存储,即使应用重启也会保持上次设置的状态。

