HarmonyOS 鸿蒙Next:使用NavPathStack传递对象时,下一个页面修改会影响到上一个页面的对象数据
HarmonyOS 鸿蒙Next:使用NavPathStack传递对象时,下一个页面修改会影响到上一个页面的对象数据
使用NavPathStack的pushPathByName方法推出页面和传递对象时,修改下一个页面的数据,上一个页面的对象也跟着变化了,如何做到每个页面的数据不互相影响
页面传入model
pageStack.pushPathByName(url, model)
新页面接收model,在新页面修改model会修改上个页面的值
if (params && params.param) { let obj = params.param as Model this.model = obj }
更多关于HarmonyOS 鸿蒙Next:使用NavPathStack传递对象时,下一个页面修改会影响到上一个页面的对象数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
提供model和model1代码如下:
```typescript
//Model.ets
export class Model{
constructor(name: string, age: number) {
this.name = name
this.age = age
}
name:string
age:number
}
//Model1.ets
import { Model } from './Model'
export class Model1{
param:Model
constructor(param: Model) {
this.param = param
}
}
//demo另外贴出
//Page01组件代码
[@Component](/user/Component)
struct Page01 {
[@Consume](/user/Consume)('pageInfos') pageInfos: NavPathStack;
[@State](/user/State) usedModel: Model | null = null;
aboutToAppear(): void {
console.log(`this.pageInfos.getParamByName('Page01'):${JSON.stringify(this.pageInfos.getParamByName('Page01'))}`)
let params = this.pageInfos.getParamByIndex(this.pageInfos.size() - 1) as Model1
if (params && params.param) {
//方法一,可行
// let name = params.param.name
// let age = params.param.age
// this.usedModel = new Model(name,age)
//方法二,可行
// this.usedModel = new Model(params.param.name, params.param.age)
//方法三,可行
let obj = JSON.stringify(params.param)
console.log(`obj: ${JSON.stringify(obj)}`)
this.usedModel = JSON.parse(obj) as Model
//直接赋值,不可行
// let obj = params.param
// this.usedModel = obj
}
if (this.usedModel) {
this.usedModel.name = '关羽'
}
}
build() {
NavDestination() {
Text(`Page 01的usedModel值为:${JSON.stringify(this.usedModel)}`)
Button('push Page03')
.width('80%')
.onClick(() => {
//将page01页面信息入栈,不传参
this.pageInfos.pushPathByName('Page03', new Model1(this.usedModel));
})
.margin({ top: 10, bottom: 10 })
}
.title('Page01')
}
}
//Page03组件代码
[@Component](/user/Component)
struct Page03 {
[@Consume](/user/Consume)('pageInfos') pageInfos: NavPathStack;
model1: Model1 | null = null;
[@State](/user/State) model: Model | null = null;
aboutToAppear(): void {
let params = this.pageInfos.getParamByIndex(this.pageInfos.size() - 1) as Model1
console.log(`this.pageInfos.getParamByName('Page03'):${JSON.stringify(this.pageInfos.getParamByName('Page03'))}`)
if (params && params.param) {
//可行
// let name = params.param.name
// let age = params.param.age
// this.model = new Model(name,age)
//可行
// this.model = new Model(params.param.name, params.param.age)
//可行
let obj = JSON.stringify(params.param)
console.log(`obj: ${JSON.stringify(obj)}`)
this.model = JSON.parse(obj) as Model
//不可行
// let obj = params.param
// this.model = obj
}
if (this.model) {
this.model.name = '张飞'
}
}
build() {
NavDestination() {
Text(`Page 03的omodel值为:${JSON.stringify(this.model)}`)
Button('push Page01')
.width('80%')
.onClick(() => {
//将page01页面信息入栈,不传参
this.pageInfos.pushPathByName('Page01', '');
})
.margin({ top: 10, bottom: 10 })
}
.title('Page03')
}
}
//IndexPage.ets(Page)
[@Entry](/user/Entry)
[@Component](/user/Component)
struct IndexPage {
[@State](/user/State) model: Model = new Model('name', 1)
[@Provide](/user/Provide)('pageInfos') pageInfos: NavPathStack = new NavPathStack()
isLogin: boolean = false;
aboutToAppear(): void {
console.log(`this.pageInfos.getParamByName('IndexPage'): ${JSON.stringify(this.pageInfos.getParamByName('IndexPage'))}`);
}
[@Builder](/user/Builder)
PagesMap(name: string) {
if (name == 'Page01') {
Page01()
} else if (name == 'Page03') {
Page03()
}
}
build() {
Navigation(this.pageInfos) {
Text(`主页的model值为:${JSON.stringify(this.model)}`)
Button('push Page01')
.width('80%')
.onClick(() => {
this.pageInfos.pushPathByName('Page01', new Model1(this.model));
})
}
.mode(NavigationMode.Stack)
.titleMode(NavigationTitleMode.Mini)
.title('主页')
.navDestination(this.PagesMap)
}
}
更多关于HarmonyOS 鸿蒙Next:使用NavPathStack传递对象时,下一个页面修改会影响到上一个页面的对象数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙系统中,使用NavPathStack
进行页面跳转并传递对象时,若遇到下一个页面修改影响到上一个页面的对象数据问题,这通常是由于对象传递方式导致的。在鸿蒙系统中,对象默认是通过引用传递的。这意味着,如果传递的是一个可变对象的引用,那么任何一个页面对这个对象的修改都会影响到所有持有该对象引用的页面。
为了解决这个问题,可以采取以下几种策略:
-
深拷贝:在传递对象前,对对象进行深拷贝,确保每个页面持有的是对象的独立副本。这样,一个页面对对象的修改不会影响到其他页面。
-
不可变对象:尽量使用不可变对象进行传递,这样即使传递的是引用,接收方也无法修改对象的内容。
-
数据隔离:在架构设计上,确保不同页面间的数据是隔离的,避免直接修改共享对象。
-
事件机制:使用事件机制进行页面间通信,而不是直接共享对象。这样可以通过事件携带必要的数据,而不是传递整个对象。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html