Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
e41b090a
D
Docs
项目概览
OpenHarmony
/
Docs
大约 1 年 前同步成功
通知
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看板
提交
e41b090a
编写于
8月 18, 2022
作者:
W
wangqinxiao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update docs
Signed-off-by:
N
wangqinxiao
<
wangqinxiao@huawei.com
>
上级
dec56aef
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
262 addition
and
0 deletion
+262
-0
zh-cn/application-dev/ui/Readme-CN.md
zh-cn/application-dev/ui/Readme-CN.md
+1
-0
zh-cn/application-dev/ui/ts-performance-improvement-recommendation.md
...ation-dev/ui/ts-performance-improvement-recommendation.md
+260
-0
zh-cn/application-dev/website.md
zh-cn/application-dev/website.md
+1
-0
未找到文件。
zh-cn/application-dev/ui/Readme-CN.md
浏览文件 @
e41b090a
...
...
@@ -72,6 +72,7 @@
-
[
构建食物列表List布局
](
ui-ts-building-category-list-layout.md
)
-
[
构建食物分类Grid布局
](
ui-ts-building-category-grid-layout.md
)
-
[
页面跳转与数据传递
](
ui-ts-page-redirection-data-transmission.md
)
-
[
性能提升的推荐方法
](
ts-performance-improvement-recommendation.md
)
-
基于JS扩展的类Web开发范式
-
[
概述
](
ui-js-overview.md
)
...
...
zh-cn/application-dev/ui/ts-performance-improvement-recommendation.md
0 → 100644
浏览文件 @
e41b090a
# 性能提升的推荐方法
开发者若使用低性能的代码实现功能场景可能不会影响应用的正常运行,但却会对应用的性能造成负面影响。本章节列举出了一些可提升性能的场景供开发者参考,以避免应用实现上带来的性能劣化。
## 推荐使用数据懒加载
开发者在使用长列表时,如果直接采用循环渲染方式,如下所示,会一次性加载所有的列表元素,一方面会导致页面启动时间过长,影响用户体验,另一方面也会增加服务器的压力和流量,加重手机系统负担。
```
ts
@
Entry
@
Component
struct
MyComponent
{
@
State
arr
:
number
[]
=
Array
.
from
(
Array
(
100
),
(
v
,
k
)
=>
k
);
//构造0-99的数组
build
()
{
List
()
{
ForEach
(
this
.
arr
,
(
item
:
number
)
=>
{
ListItem
()
{
Text
(
`item value:
${
item
}
`
)
}
},
(
item
:
number
)
=>
item
.
toString
())
}
}
}
```
上述代码会在页面加载时将100个列表元素全部加载,这并非我们需要的,我们希望从数据源中按需迭代加载数据并创建相应组件,因此需要使用数据懒加载,如下所示:
```
ts
class
BasicDataSource
implements
IDataSource
{
private
listeners
:
DataChangeListener
[]
=
[]
public
totalCount
():
number
{
return
0
}
public
getData
(
index
:
number
):
any
{
return
undefined
}
registerDataChangeListener
(
listener
:
DataChangeListener
):
void
{
if
(
this
.
listeners
.
indexOf
(
listener
)
<
0
)
{
console
.
info
(
'
add listener
'
)
this
.
listeners
.
push
(
listener
)
}
}
unregisterDataChangeListener
(
listener
:
DataChangeListener
):
void
{
const
pos
=
this
.
listeners
.
indexOf
(
listener
);
if
(
pos
>=
0
)
{
console
.
info
(
'
remove listener
'
)
this
.
listeners
.
splice
(
pos
,
1
)
}
}
notifyDataReload
():
void
{
this
.
listeners
.
forEach
(
listener
=>
{
listener
.
onDataReloaded
()
})
}
notifyDataAdd
(
index
:
number
):
void
{
this
.
listeners
.
forEach
(
listener
=>
{
listener
.
onDataAdd
(
index
)
})
}
notifyDataChange
(
index
:
number
):
void
{
this
.
listeners
.
forEach
(
listener
=>
{
listener
.
onDataChange
(
index
)
})
}
notifyDataDelete
(
index
:
number
):
void
{
this
.
listeners
.
forEach
(
listener
=>
{
listener
.
onDataDelete
(
index
)
})
}
notifyDataMove
(
from
:
number
,
to
:
number
):
void
{
this
.
listeners
.
forEach
(
listener
=>
{
listener
.
onDataMove
(
from
,
to
)
})
}
}
class
MyDataSource
extends
BasicDataSource
{
private
dataArray
:
string
[]
=
[
'
item value: 0
'
,
'
item value: 1
'
,
'
item value: 2
'
]
public
totalCount
():
number
{
return
this
.
dataArray
.
length
}
public
getData
(
index
:
number
):
any
{
return
this
.
dataArray
[
index
]
}
public
addData
(
index
:
number
,
data
:
string
):
void
{
this
.
dataArray
.
splice
(
index
,
0
,
data
)
this
.
notifyDataAdd
(
index
)
}
public
pushData
(
data
:
string
):
void
{
this
.
dataArray
.
push
(
data
)
this
.
notifyDataAdd
(
this
.
dataArray
.
length
-
1
)
}
}
@
Entry
@
Component
struct
MyComponent
{
private
data
:
MyDataSource
=
new
MyDataSource
()
build
()
{
List
()
{
LazyForEach
(
this
.
data
,
(
item
:
string
)
=>
{
ListItem
()
{
Row
()
{
Text
(
item
).
fontSize
(
20
).
margin
({
left
:
10
})
}
}
.
onClick
(()
=>
{
this
.
data
.
pushData
(
'
item value:
'
+
this
.
data
.
totalCount
())
})
},
item
=>
item
)
}
}
}
```
上述代码在页面加载时仅初始化加载三个列表元素,之后每点击一次列表元素,将增加一个列表元素。
## 使用条件渲染替代显隐控制
如下所示,开发者在使用visibility通用属性控制组件的显隐状态时,仍存在组件的重新创建过程,造成性能上的损耗。
```
ts
@
Entry
@
Component
struct
MyComponent
{
@
State
isVisible
:
Visibility
=
Visibility
.
Visible
;
build
()
{
Column
()
{
Button
(
"
显隐切换
"
)
.
onClick
(()
=>
{
if
(
this
.
isVisible
==
Visibility
.
Visible
)
{
this
.
isVisible
=
Visibility
.
None
}
else
{
this
.
isVisible
=
Visibility
.
Visible
}
})
Row
().
visibility
(
this
.
isVisible
)
.
width
(
300
).
height
(
300
).
backgroundColor
(
Color
.
Pink
)
}.
width
(
'
100%
'
)
}
}
```
要避免这一问题,可使用if条件渲染代替visibility属性变换,如下所示:
```
ts
@
Entry
@
Component
struct
MyComponent
{
@
State
isVisible
:
boolean
=
true
;
build
()
{
Column
()
{
Button
(
"
显隐切换
"
)
.
onClick
(()
=>
{
this
.
isVisible
=
!
this
.
isVisible
})
if
(
this
.
isVisible
)
{
Row
()
.
width
(
300
).
height
(
300
).
backgroundColor
(
Color
.
Pink
)
}
}.
width
(
'
100%
'
)
}
}
```
## 使用Column/Row替代Flex
由于Flex容器组件默认情况下存在shrink导致二次布局,这会在一定程度上造成页面渲染上的性能劣化。
```
ts
@
Entry
@
Component
struct
MyComponent
{
build
()
{
Flex
({
direction
:
FlexDirection
.
Column
})
{
Flex
().
width
(
300
).
height
(
200
).
backgroundColor
(
Color
.
Pink
)
Flex
().
width
(
300
).
height
(
200
).
backgroundColor
(
Color
.
Yellow
)
Flex
().
width
(
300
).
height
(
200
).
backgroundColor
(
Color
.
Grey
)
}
}
}
```
上述代码可将Flex替换为Column、Row,在保证实现的页面布局效果相同的前提下避免Flex二次布局带来的负面影响。
```
ts
@
Entry
@
Component
struct
MyComponent
{
build
()
{
Column
()
{
Row
().
width
(
300
).
height
(
200
).
backgroundColor
(
Color
.
Pink
)
Row
().
width
(
300
).
height
(
200
).
backgroundColor
(
Color
.
Yellow
)
Row
().
width
(
300
).
height
(
200
).
backgroundColor
(
Color
.
Grey
)
}
}
}
```
## 设置List组件的宽高
开发者在使用Scroll容器组件嵌套List子组件时,若不指定List的宽高尺寸,则默认全部加载,如下所示:
```
ts
@
Entry
@
Component
struct
MyComponent
{
private
arr
:
number
[]
=
[
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
];
build
()
{
Scroll
()
{
List
()
{
ForEach
(
this
.
arr
,
(
item
)
=>
{
ListItem
()
{
Text
(
`item value:
${
item
}
`
).
fontSize
(
30
).
margin
({
left
:
10
})
}.
height
(
100
)
},
(
item
)
=>
item
.
toString
())
}
}.
backgroundColor
(
Color
.
Pink
)
}
}
```
因此,在这种场景下建议开发者设置List子组件的宽高,如下所示:
```
ts
@
Entry
@
Component
struct
MyComponent
{
private
arr
:
number
[]
=
[
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
];
build
()
{
Scroll
()
{
List
()
{
ForEach
(
this
.
arr
,
(
item
)
=>
{
ListItem
()
{
Text
(
`item value:
${
item
}
`
).
fontSize
(
30
).
margin
({
left
:
10
})
}.
height
(
100
)
},
(
item
)
=>
item
.
toString
())
}.
width
(
'
100%
'
).
height
(
500
)
}.
backgroundColor
(
Color
.
Pink
)
}
}
```
\ No newline at end of file
zh-cn/application-dev/website.md
浏览文件 @
e41b090a
...
...
@@ -108,6 +108,7 @@
-
[
构建食物列表List布局
](
ui/ui-ts-building-category-list-layout.md
)
-
[
构建食物分类Grid布局
](
ui/ui-ts-building-category-grid-layout.md
)
-
[
页面跳转与数据传递
](
ui/ui-ts-page-redirection-data-transmission.md
)
-
[
性能提升的推荐方法
](
ui/ts-performance-improvement-recommendation.md
)
-
基于JS扩展的类Web开发范式
-
[
概述
](
ui/ui-js-overview.md
)
-
框架说明
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录