Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
863cba91
D
Docs
项目概览
OpenHarmony
/
Docs
接近 2 年 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
863cba91
编写于
7月 25, 2023
作者:
Z
zhuzijia
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加propchangelog
Signed-off-by:
N
zhuzijia
<
zhuzijia@huawei.com
>
上级
d37d67ba
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
122 addition
and
0 deletion
+122
-0
zh-cn/release-notes/changelogs/OpenHarmony_4.0.9.3/changelog-@Prop.md
...e-notes/changelogs/OpenHarmony_4.0.9.3/changelog-@Prop.md
+122
-0
zh-cn/release-notes/changelogs/OpenHarmony_4.0.9.3/figures/zh-cn_image_0000001588291546.png
...nHarmony_4.0.9.3/figures/zh-cn_image_0000001588291546.png
+0
-0
未找到文件。
zh-cn/release-notes/changelogs/OpenHarmony_4.0.9.3/changelog-@Prop.md
0 → 100644
浏览文件 @
863cba91
# arkui子系统状态管理ChangeLog
# ArkUI子系统@Prop装饰器支持Object行为变化
## cl.@Prop支持Object api9浅拷贝,api10变更为深拷贝
**变更影响**
@Prop支持Object在api9为浅拷贝,具体行为表现为:
-
Object类型:浅拷贝Object.keys(propObj) 返回的所有属性。即只拷贝最外层的Object,Object中property还是指向原来的父组件的数据源。
-
数组类型:浅拷贝所有的数组项,即只拷贝最外层的array,其他行为和Object一致。
-
拷贝Object和数组的prototype。
@Prop支持Object在api10变更为深拷贝,具体行为表现为:
-
Object类型:完全拷贝Object.keys(propObj) 返回的所有属性。
-
数组类型:完全拷贝所有的数组项;
-
拷贝Object和数组的prototype。
**适配指导**
@Prop深浅拷贝的变更在UI渲染上的影响主要在@ObjectLink相关的场景,因为@ObjectLink会代理其修饰对象属性。
例子如下:
api9:PropClassAArray组件中@Prop objArray改变ClassA的属性,或者设置新的数组项,都会引起父组件StateClassAArray创建的ObjectLinkClassA中的@ObjectLink obj的改变。
这个更新是因为父组件StateClassAArray中@State stateClassAArray到子组件PropClassAArray中@Prop objArray是浅拷贝引起的,因为浅拷贝只拷贝了数组项的引用,所以数据源也被改变,而@ObjectLink代理了数据源的属性,所以引发了ObjectLinkClassA组件中的@ObjectLink obj的更新(从StateClassAArray组件中构造的)。
api10:在上述场景中,因为父组件StateClassAArray中@State stateClassAArray到子组件PropClassAArray中@Prop objArray是深拷贝,完整拷贝了ClassA的对象,所以不会改变数据源,从而不会引发ObjectLinkClassA组件中的@ObjectLink obj的更新(从StateClassAArray组件中构造的)。

```
ts
let
nextId
=
0
;
@
Observed
class
ClassA
{
id
:
number
;
a
:
number
;
constructor
(
a
:
number
=
0
)
{
this
.
id
=
nextId
++
;
this
.
a
=
a
;
}
}
@
Component
struct
ObjectLinkClassA
{
@
ObjectLink
obj
:
ClassA
;
build
()
{
Row
()
{
Text
(
`ObjectLink: obj:
${
this
.
obj
.
a
}
`
)
.
height
(
100
)
.
onClick
(()
=>
{
this
.
obj
.
a
+=
1
;
console
.
info
(
`ObjectLink onClick ClassA property changed to
${
this
.
obj
.
a
}
`
)
})
}.
border
({
width
:
3
,
color
:
Color
.
Red
})
}
}
@
Component
struct
PropClassAArray
{
@
Prop
objArray
:
Array
<
ClassA
>
=
[];
build
()
{
Column
()
{
Text
(
`green box: @Prop : Array<ObjectClassA> item [0] + [1]`
)
Row
()
{
ObjectLinkClassA
({
obj
:
this
.
objArray
[
0
]
})
Text
(
"
[0] Assign new ClassA
"
)
.
height
(
100
)
.
onClick
(()
=>
{
this
.
objArray
[
0
]
=
new
ClassA
();
console
.
info
(
`PropClassAArray[0] onClick ClassA object assign
${
this
.
objArray
[
0
].
a
}
`
)
})
Text
(
"
Change ClassA property
"
)
.
height
(
100
)
.
onClick
(()
=>
{
this
.
objArray
[
0
].
a
+=
1
;
console
.
info
(
`PropClassAArray[1] onClick ClassA property change
${
this
.
objArray
[
1
].
a
}
`
)
})
}
}.
border
({
width
:
3
,
color
:
Color
.
Green
})
}
}
@
Entry
@
Component
struct
StateClassAArray
{
@
State
stateClassAArray
:
Array
<
ClassA
>
=
[
new
ClassA
(),
new
ClassA
()
];
build
()
{
Column
()
{
Column
()
{
Text
(
"
Red box: @ObjectLink from @State array item[0]
"
)
Row
()
{
ObjectLinkClassA
({
obj
:
this
.
stateClassAArray
[
0
]
})
Text
(
"
Assign new ClassA
"
)
.
height
(
100
)
.
onClick
(()
=>
{
this
.
stateClassAArray
[
0
]
=
new
ClassA
();
console
.
info
(
`StateClassAArray[0] onClick ClassA object assign
${
this
.
stateClassAArray
[
0
].
a
}
`
)
})
Text
(
"
Change ClassA property
"
)
.
height
(
100
)
.
onClick
(()
=>
{
this
.
stateClassAArray
[
0
].
a
+=
1
;
console
.
info
(
`StateClassAArray onClick stateClassAArray[0] changed to
${
this
.
stateClassAArray
[
0
].
a
}
`
)
})
}
}.
border
({
width
:
3
,
color
:
Color
.
Blue
})
Divider
().
height
(
5
)
// api9浅拷贝:只拷贝指向源数组项的引用,不拷贝数组项ClassA实例自身
// api10深拷贝:完整拷贝this.stateClassAArray,包括其数组项。
PropClassAArray
({
objArray
:
this
.
stateClassAArray
})
}
}
}
```
\ No newline at end of file
zh-cn/release-notes/changelogs/OpenHarmony_4.0.9.3/figures/zh-cn_image_0000001588291546.png
0 → 100644
浏览文件 @
863cba91
56.3 KB
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录