Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
75f10fbd
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看板
未验证
提交
75f10fbd
编写于
7月 29, 2023
作者:
O
openharmony_ci
提交者:
Gitee
7月 29, 2023
浏览文件
操作
浏览文件
下载
差异文件
!21525 挑单
Merge pull request !21525 from LiAn/OpenHarmony-4.0-Beta2
上级
d8e5171b
f43561b1
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
73 addition
and
73 deletion
+73
-73
zh-cn/application-dev/quick-start/arkts-application-state-management-overview.md
...uick-start/arkts-application-state-management-overview.md
+1
-1
zh-cn/application-dev/quick-start/arkts-localstorage.md
zh-cn/application-dev/quick-start/arkts-localstorage.md
+16
-16
zh-cn/application-dev/quick-start/arkts-style.md
zh-cn/application-dev/quick-start/arkts-style.md
+6
-6
zh-cn/application-dev/quick-start/arkts-watch.md
zh-cn/application-dev/quick-start/arkts-watch.md
+46
-46
zh-cn/application-dev/ui/arkts-common-components-xcomponent.md
.../application-dev/ui/arkts-common-components-xcomponent.md
+1
-1
zh-cn/application-dev/ui/arkts-layout-development-create-grid.md
...pplication-dev/ui/arkts-layout-development-create-grid.md
+1
-1
zh-cn/application-dev/ui/arkts-layout-development-media-query.md
...pplication-dev/ui/arkts-layout-development-media-query.md
+1
-1
zh-cn/application-dev/ui/arkts-layout-development-stack-layout.md
...plication-dev/ui/arkts-layout-development-stack-layout.md
+1
-1
zh-cn/application-dev/ui/figures/图片1.png
zh-cn/application-dev/ui/figures/图片1.png
+0
-0
未找到文件。
zh-cn/application-dev/quick-start/arkts-application-state-management-overview.md
浏览文件 @
75f10fbd
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
上一个章节中介绍的装饰器仅能在页面内,即一个组件树上共享状态变量。如果开发者要实现应用级的,或者多个页面的状态数据共享,就需要用到应用级别的状态管理的概念。ArkTS根据不同特性,提供了多种应用状态管理的能力:
上一个章节中介绍的装饰器仅能在页面内,即一个组件树上共享状态变量。如果开发者要实现应用级的,或者多个页面的状态数据共享,就需要用到应用级别的状态管理的概念。ArkTS根据不同特性,提供了多种应用状态管理的能力:
-
[
LocalStorage
](
arkts-localstorage.md
)
:页面级UI状态存储,通常用于
[
UIAbility
](
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev
/reference/apis/js-apis-app-ability-uiAbility.md
)
内、页面间的状态共享。
-
[
LocalStorage
](
arkts-localstorage.md
)
:页面级UI状态存储,通常用于
[
UIAbility
](
..
/reference/apis/js-apis-app-ability-uiAbility.md
)
内、页面间的状态共享。
-
[
AppStorage
](
arkts-appstorage.md
)
:特殊的单例LocalStorage对象,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储;
-
[
AppStorage
](
arkts-appstorage.md
)
:特殊的单例LocalStorage对象,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储;
...
...
zh-cn/application-dev/quick-start/arkts-localstorage.md
浏览文件 @
75f10fbd
# LocalStorage:页面级UI状态存储
# LocalStorage:页面级UI状态存储
LocalStorage是页面级的UI状态存储,通过
\@
Entry装饰器接
受
的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility内,页面间共享状态。
LocalStorage是页面级的UI状态存储,通过
\@
Entry装饰器接
收
的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility内,页面间共享状态。
本文仅介绍LocalStorage使用场景和相关的装饰器:
\@
LocalStorageProp和
\@
LocalStorageLink。
本文仅介绍LocalStorage使用场景和相关的装饰器:
\@
LocalStorageProp和
\@
LocalStorageLink。
...
@@ -28,7 +28,7 @@ LocalStorage是ArkTS为构建页面级别状态变量提供存储的内存内“
...
@@ -28,7 +28,7 @@ LocalStorage是ArkTS为构建页面级别状态变量提供存储的内存内“
LocalStorage根据与
\@
Component装饰的组件的同步类型不同,提供了两个装饰器:
LocalStorage根据与
\@
Component装饰的组件的同步类型不同,提供了两个装饰器:
-
[
@LocalStorageProp
](
#localstorageprop
)
:
\@
LocalStorageProp装饰的变量和与LocalStorage中给定属性建立单
行
同步关系。
-
[
@LocalStorageProp
](
#localstorageprop
)
:
\@
LocalStorageProp装饰的变量和与LocalStorage中给定属性建立单
向
同步关系。
-
[
@LocalStorageLink
](
#localstoragelink
)
:
\@
LocalStorageLink装饰的变量和在
\@
Component中创建与LocalStorage中给定属性建立双向同步关系。
-
[
@LocalStorageLink
](
#localstoragelink
)
:
\@
LocalStorageLink装饰的变量和在
\@
Component中创建与LocalStorage中给定属性建立双向同步关系。
...
@@ -193,12 +193,12 @@ link1.set(49); // two-way sync: link1.get() == link2.get() == prop.get() == 49
...
@@ -193,12 +193,12 @@ link1.set(49); // two-way sync: link1.get() == link2.get() == prop.get() == 49
```
ts
```
ts
// 创建新实例并使用给定对象初始化
// 创建新实例并使用给定对象初始化
let
storage
=
new
LocalStorage
({
'
PropA
'
:
47
});
let
storage
=
new
LocalStorage
({
'
PropA
'
:
47
});
@
Component
@
Component
struct
Child
{
struct
Child
{
// @LocalStorageLink变量装饰器与LocalStorage中的'ProA'属性建立双向绑定
// @LocalStorageLink变量装饰器与LocalStorage中的'ProA'属性建立双向绑定
@
LocalStorageLink
(
'
PropA
'
)
storLink2
:
number
=
1
;
@
LocalStorageLink
(
'
PropA
'
)
storLink2
:
number
=
1
;
build
()
{
build
()
{
Button
(
`Child from LocalStorage
${
this
.
storLink2
}
`
)
Button
(
`Child from LocalStorage
${
this
.
storLink2
}
`
)
// 更改将同步至LocalStorage中的'ProA'以及Parent.storLink1
// 更改将同步至LocalStorage中的'ProA'以及Parent.storLink1
...
@@ -211,7 +211,7 @@ link1.set(49); // two-way sync: link1.get() == link2.get() == prop.get() == 49
...
@@ -211,7 +211,7 @@ link1.set(49); // two-way sync: link1.get() == link2.get() == prop.get() == 49
struct
CompA
{
struct
CompA
{
// @LocalStorageLink变量装饰器与LocalStorage中的'ProA'属性建立双向绑定
// @LocalStorageLink变量装饰器与LocalStorage中的'ProA'属性建立双向绑定
@
LocalStorageLink
(
'
PropA
'
)
storLink1
:
number
=
1
;
@
LocalStorageLink
(
'
PropA
'
)
storLink1
:
number
=
1
;
build
()
{
build
()
{
Column
({
space
:
15
})
{
Column
({
space
:
15
})
{
Button
(
`Parent from LocalStorage
${
this
.
storLink1
}
`
)
// initial value from LocalStorage will be 47, because 'PropA' initialized already
Button
(
`Parent from LocalStorage
${
this
.
storLink1
}
`
)
// initial value from LocalStorage will be 47, because 'PropA' initialized already
...
@@ -241,7 +241,7 @@ link1.set(49); // two-way sync: link1.get() == link2.get() == prop.get() == 49
...
@@ -241,7 +241,7 @@ link1.set(49); // two-way sync: link1.get() == link2.get() == prop.get() == 49
struct
CompA
{
struct
CompA
{
// @LocalStorageProp变量装饰器与LocalStorage中的'ProA'属性建立单向绑定
// @LocalStorageProp变量装饰器与LocalStorage中的'ProA'属性建立单向绑定
@
LocalStorageProp
(
'
PropA
'
)
storProp1
:
number
=
1
;
@
LocalStorageProp
(
'
PropA
'
)
storProp1
:
number
=
1
;
build
()
{
build
()
{
Column
({
space
:
15
})
{
Column
({
space
:
15
})
{
// 点击后从47开始加1,只改变当前组件显示的storProp1,不会同步到LocalStorage中
// 点击后从47开始加1,只改变当前组件显示的storProp1,不会同步到LocalStorage中
...
@@ -251,12 +251,12 @@ link1.set(49); // two-way sync: link1.get() == link2.get() == prop.get() == 49
...
@@ -251,12 +251,12 @@ link1.set(49); // two-way sync: link1.get() == link2.get() == prop.get() == 49
}
}
}
}
}
}
@
Component
@
Component
struct
Child
{
struct
Child
{
// @LocalStorageProp变量装饰器与LocalStorage中的'ProA'属性建立单向绑定
// @LocalStorageProp变量装饰器与LocalStorage中的'ProA'属性建立单向绑定
@
LocalStorageProp
(
'
PropA
'
)
storProp2
:
number
=
2
;
@
LocalStorageProp
(
'
PropA
'
)
storProp2
:
number
=
2
;
build
()
{
build
()
{
Column
({
space
:
15
})
{
Column
({
space
:
15
})
{
// 当CompA改变时,当前storProp2不会改变,显示47
// 当CompA改变时,当前storProp2不会改变,显示47
...
@@ -318,14 +318,14 @@ Child自定义组件中的变化:
...
@@ -318,14 +318,14 @@ Child自定义组件中的变化:
```
ts
```
ts
let
storage
=
new
LocalStorage
({
countStorage
:
1
});
let
storage
=
new
LocalStorage
({
countStorage
:
1
});
@
Component
@
Component
struct
Child
{
struct
Child
{
// 子组件实例的名字
// 子组件实例的名字
label
:
string
=
'
no name
'
;
label
:
string
=
'
no name
'
;
// 和LocalStorage中“countStorage”的双向绑定数据
// 和LocalStorage中“countStorage”的双向绑定数据
@
LocalStorageLink
(
'
countStorage
'
)
playCountLink
:
number
=
0
;
@
LocalStorageLink
(
'
countStorage
'
)
playCountLink
:
number
=
0
;
build
()
{
build
()
{
Row
()
{
Row
()
{
Text
(
this
.
label
)
Text
(
this
.
label
)
...
@@ -338,12 +338,12 @@ Child自定义组件中的变化:
...
@@ -338,12 +338,12 @@ Child自定义组件中的变化:
}.
width
(
300
).
height
(
60
)
}.
width
(
300
).
height
(
60
)
}
}
}
}
@
Entry
(
storage
)
@
Entry
(
storage
)
@
Component
@
Component
struct
Parent
{
struct
Parent
{
@
LocalStorageLink
(
'
countStorage
'
)
playCount
:
number
=
0
;
@
LocalStorageLink
(
'
countStorage
'
)
playCount
:
number
=
0
;
build
()
{
build
()
{
Column
()
{
Column
()
{
Row
()
{
Row
()
{
...
@@ -355,7 +355,7 @@ Child自定义组件中的变化:
...
@@ -355,7 +355,7 @@ Child自定义组件中的变化:
})
})
.
width
(
250
).
height
(
60
).
fontSize
(
12
)
.
width
(
250
).
height
(
60
).
fontSize
(
12
)
}.
width
(
300
).
height
(
60
)
}.
width
(
300
).
height
(
60
)
Row
()
{
Row
()
{
Text
(
'
LocalStorage
'
)
Text
(
'
LocalStorage
'
)
.
width
(
50
).
height
(
60
).
fontSize
(
12
)
.
width
(
50
).
height
(
60
).
fontSize
(
12
)
...
@@ -365,10 +365,10 @@ Child自定义组件中的变化:
...
@@ -365,10 +365,10 @@ Child自定义组件中的变化:
})
})
.
width
(
250
).
height
(
60
).
fontSize
(
12
)
.
width
(
250
).
height
(
60
).
fontSize
(
12
)
}.
width
(
300
).
height
(
60
)
}.
width
(
300
).
height
(
60
)
Child
({
label
:
'
ChildA
'
})
Child
({
label
:
'
ChildA
'
})
Child
({
label
:
'
ChildB
'
})
Child
({
label
:
'
ChildB
'
})
Text
(
`playCount in LocalStorage for debug
${
storage
.
get
<
number
>
(
'
countStorage
'
)}
`
)
Text
(
`playCount in LocalStorage for debug
${
storage
.
get
<
number
>
(
'
countStorage
'
)}
`
)
.
width
(
300
).
height
(
60
).
fontSize
(
12
)
.
width
(
300
).
height
(
60
).
fontSize
(
12
)
}
}
...
@@ -379,7 +379,7 @@ Child自定义组件中的变化:
...
@@ -379,7 +379,7 @@ Child自定义组件中的变化:
### 将LocalStorage实例从UIAbility共享到一个或多个视图
### 将LocalStorage实例从UIAbility共享到一个或多个视图
上面的实例中,LocalStorage的实例仅仅在一个
\@
Entry装饰的组件和其所属的子组件(一个页面)中共享,如果希望其在多个视图中共享,可以在所属UIAbility中创建LocalStorage实例,并调用windowStage.
[
loadContent
](
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev
/reference/apis/js-apis-window.md#loadcontent9
)
。
上面的实例中,LocalStorage的实例仅仅在一个
\@
Entry装饰的组件和其所属的子组件(一个页面)中共享,如果希望其在多个视图中共享,可以在所属UIAbility中创建LocalStorage实例,并调用windowStage.
[
loadContent
](
..
/reference/apis/js-apis-window.md#loadcontent9
)
。
```
ts
```
ts
...
...
zh-cn/application-dev/quick-start/arkts-style.md
浏览文件 @
75f10fbd
...
@@ -45,12 +45,12 @@
...
@@ -45,12 +45,12 @@
```
ts
```
ts
@
Component
@
Component
struct
FancyUse
{
struct
FancyUse
{
@
State
heightV
la
ue
:
number
=
100
@
State
heightV
al
ue
:
number
=
100
@
Styles
fancy
()
{
@
Styles
fancy
()
{
.
height
(
this
.
heightV
la
ue
)
.
height
(
this
.
heightV
al
ue
)
.
backgroundColor
(
Color
.
Yellow
)
.
backgroundColor
(
Color
.
Yellow
)
.
onClick
(()
=>
{
.
onClick
(()
=>
{
this
.
heightV
la
ue
=
200
this
.
heightV
al
ue
=
200
})
})
}
}
}
}
...
@@ -77,14 +77,14 @@
...
@@ -77,14 +77,14 @@
@
Entry
@
Entry
@
Component
@
Component
struct
FancyUse
{
struct
FancyUse
{
@
State
heightV
la
ue
:
number
=
100
@
State
heightV
al
ue
:
number
=
100
// 定义在组件内的@Styles封装的样式
// 定义在组件内的@Styles封装的样式
@
Styles
fancy
()
{
@
Styles
fancy
()
{
.
width
(
200
)
.
width
(
200
)
.
height
(
this
.
heightV
la
ue
)
.
height
(
this
.
heightV
al
ue
)
.
backgroundColor
(
Color
.
Yellow
)
.
backgroundColor
(
Color
.
Yellow
)
.
onClick
(()
=>
{
.
onClick
(()
=>
{
this
.
heightV
la
ue
=
200
this
.
heightV
al
ue
=
200
})
})
}
}
...
...
zh-cn/application-dev/quick-start/arkts-watch.md
浏览文件 @
75f10fbd
...
@@ -52,6 +52,51 @@
...
@@ -52,6 +52,51 @@
## 使用场景
## 使用场景
### \@Watch和自定义组件更新
以下示例展示组件更新和
\@
Watch的处理步骤。count在CountModifier中由
\@
State装饰,在TotalView中由
\@
Prop装饰。
```
ts
@
Component
struct
TotalView
{
@
Prop
@
Watch
(
'
onCountUpdated
'
)
count
:
number
;
@
State
total
:
number
=
0
;
// @Watch cb
onCountUpdated
(
propName
:
string
):
void
{
this
.
total
+=
this
.
count
;
}
build
()
{
Text
(
`Total:
${
this
.
total
}
`
)
}
}
@
Entry
@
Component
struct
CountModifier
{
@
State
count
:
number
=
0
;
build
()
{
Column
()
{
Button
(
'
add to basket
'
)
.
onClick
(()
=>
{
this
.
count
++
})
TotalView
({
count
:
this
.
count
})
}
}
}
```
处理步骤:
1.
CountModifier自定义组件的Button.onClick点击事件自增count。
2.
由于
\@
State count变量更改,子组件TotalView中的
\@
Prop被更新,其
\@
Watch('onCountUpdated')方法被调用,更新了子组件TotalView 中的total变量。
3.
子组件TotalView中的Text重新渲染。
### \@Watch与\@Link组合使用
### \@Watch与\@Link组合使用
...
@@ -124,52 +169,7 @@ struct BasketModifier {
...
@@ -124,52 +169,7 @@ struct BasketModifier {
2.
\@
Link装饰的BasketViewer shopBasket值发生变化;
2.
\@
Link装饰的BasketViewer shopBasket值发生变化;
3.
状态管理框架调用
\@
Watch函数BasketViewer onBasketUpdated 更新BaketViewer TotalPurchase的值;
3.
状态管理框架调用
\@
Watch函数BasketViewer onBasketUpdated 更新Ba
s
ketViewer TotalPurchase的值;
4.
\@
Link shopBasket的改变,新增了数组项,ForEach组件会执行item Builder,渲染构建新的Item项;
\@
State totalPurchase改变,对应的Text组件也重新渲染;重新渲染是异步发生的。
4.
\@
Link shopBasket的改变,新增了数组项,ForEach组件会执行item Builder,渲染构建新的Item项;
\@
State totalPurchase改变,对应的Text组件也重新渲染;重新渲染是异步发生的。
### \@Watch和自定义组件更新
以下示例展示组件更新和
\@
Watch的处理步骤。count在CountModifier中由
\@
State装饰,在TotalView中由
\@
Prop装饰。
```
ts
@
Component
struct
TotalView
{
@
Prop
@
Watch
(
'
onCountUpdated
'
)
count
:
number
;
@
State
total
:
number
=
0
;
// @Watch cb
onCountUpdated
(
propName
:
string
):
void
{
this
.
total
+=
this
.
count
;
}
build
()
{
Text
(
`Total:
${
this
.
total
}
`
)
}
}
@
Entry
@
Component
struct
CountModifier
{
@
State
count
:
number
=
0
;
build
()
{
Column
()
{
Button
(
'
add to basket
'
)
.
onClick
(()
=>
{
this
.
count
++
})
TotalView
({
count
:
this
.
count
})
}
}
}
```
处理步骤:
1.
CountModifier自定义组件的Button.onClick点击事件自增count。
2.
由于
\@
State count变量更改,子组件TotalView中的
\@
Prop被更新,其
\@
Watch('onCountUpdated')方法被调用,更新了子组件TotalView 中的total变量。
3.
子组件TotalView中的Text重新渲染。
zh-cn/application-dev/ui/arkts-common-components-xcomponent.md
浏览文件 @
75f10fbd
...
@@ -221,7 +221,7 @@ XComponent({ id: 'xcomponentId1', type: 'surface', libraryname: 'nativerender' }
...
@@ -221,7 +221,7 @@ XComponent({ id: 'xcomponentId1', type: 'surface', libraryname: 'nativerender' }
XComponent所持有的Surface符合“生产者-消费者”模型
XComponent所持有的Surface符合“生产者-消费者”模型
OpenHarmony上Camera、
Video
Player等符合生产者设计的部件都可以将数据写入XComponent持有的surface并通过XComponent显示。
OpenHarmony上Camera、
AV
Player等符合生产者设计的部件都可以将数据写入XComponent持有的surface并通过XComponent显示。


...
...
zh-cn/application-dev/ui/arkts-layout-development-create-grid.md
浏览文件 @
75f10fbd
...
@@ -269,7 +269,7 @@ struct Shopping {
...
@@ -269,7 +269,7 @@ struct Shopping {


Grid组件初始化时,可以绑定一个
[
Scroller
](
https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/reference/arkui-ts/ts-container-scroll.md/#scroller
)
对象,用于进行滚动控制,例如通过Scroller对象的
[
scrollPage
](
https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/reference/arkui-ts/ts-container-scroll.md/
#scrollpage
)
方法进行翻页。
Grid组件初始化时,可以绑定一个
[
Scroller
](
../reference/arkui-ts/ts-container-scroll.md#scroller
)
对象,用于进行滚动控制,例如通过Scroller对象的
[
scrollPage
](
../application-dev/reference/arkui-ts/ts-container-scroll.md
#scrollpage
)
方法进行翻页。
```
ts
```
ts
...
...
zh-cn/application-dev/ui/arkts-layout-development-media-query.md
浏览文件 @
75f10fbd
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
## 概述
## 概述
[
媒体查询
](
https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/reference/apis/js-apis-mediaquery.md/
)
作为响应式设计的核心,在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。媒体查询常用于下面两种场景:
[
媒体查询
](
../reference/apis/js-apis-mediaquery.md
)
作为响应式设计的核心,在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。媒体查询常用于下面两种场景:
1.
针对设备和应用的属性信息(比如显示区域、深浅色、分辨率),设计出相匹配的布局。
1.
针对设备和应用的属性信息(比如显示区域、深浅色、分辨率),设计出相匹配的布局。
...
...
zh-cn/application-dev/ui/arkts-layout-development-stack-layout.md
浏览文件 @
75f10fbd
...
@@ -3,7 +3,7 @@
...
@@ -3,7 +3,7 @@
## 概述
## 概述
层叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过
[
Stack
](
https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/reference/arkui-ts/ts-container-stack.md/
)
容器组件实现位置的固定定位与层叠,容器中的子元素(子组件)依次入栈,后一个子元素覆盖前一个子元素,子元素可以叠加,也可以设置位置。
层叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过
[
Stack
](
../reference/arkui-ts/ts-container-stack.md
)
容器组件实现位置的固定定位与层叠,容器中的子元素(子组件)依次入栈,后一个子元素覆盖前一个子元素,子元素可以叠加,也可以设置位置。
层叠布局具有较强的页面层叠、位置定位能力,其使用场景有广告、卡片层叠效果等。
层叠布局具有较强的页面层叠、位置定位能力,其使用场景有广告、卡片层叠效果等。
...
...
zh-cn/application-dev/ui/figures/图片1.png
查看替换文件 @
d8e5171b
浏览文件 @
75f10fbd
27.6 KB
|
W:
|
H:
42.4 KB
|
W:
|
H:
2-up
Swipe
Onion skin
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录