ts-universal-attributes-popup.md 12.0 KB
Newer Older
Z
zengyawen 已提交
1
# Popup控制
Z
zengyawen 已提交
2

S
sienna1128 已提交
3
给组件绑定popup弹窗,并设置弹窗内容,交互逻辑和显示状态。
T
explain  
tianyu 已提交
4

H
geshi  
HelloCrease 已提交
5
>  **说明:**
T
fourth  
tianyu 已提交
6 7
>
>  从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
Z
zengyawen 已提交
8

Z
zengyawen 已提交
9

T
fourth  
tianyu 已提交
10
## 接口
Z
zengyawen 已提交
11 12


H
HelloCrease 已提交
13 14
| 名称        | 参数类型                                     | 描述                                       |
| --------- | ---------------------------------------- | ---------------------------------------- |
B
bizhenhang 已提交
15
| bindPopup | show:&nbsp;boolean,<br/>popup:&nbsp;[PopupOptions](#popupoptions类型说明)&nbsp;\|&nbsp;[CustomPopupOptions](#custompopupoptions8类型说明)<sup>8+</sup> | 给组件绑定Popup弹窗,设置参数show为true弹出弹框。<br/>show:&nbsp;弹窗显示状态,默认值为false,隐藏弹窗。popup弹窗必须等待页面全部构建完成才能展示,因此show不能在页面构建中设置为true,否则会导致popup弹窗显示位置及形状错误。<br/>popup:&nbsp;配置当前弹窗提示的参数。 |
Z
zengyawen 已提交
16

T
fourth  
tianyu 已提交
17
## PopupOptions类型说明
Z
zengyawen 已提交
18

19 20 21 22 23 24 25 26 27 28 29 30 31
| 名称                                  | 类型                                                         | 必填 | 描述                                                         |
| ------------------------------------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
| message                               | string                                                       | 是   | 弹窗信息内容。                                               |
| placementOnTop<sup>(deprecated)</sup> | boolean                                                      | 否   | 是否在组件上方显示,默认值为false。<br />**说明:**<br />从 API version 10 开始废弃,建议使用`placement`替代。 |
| primaryButton                         | {<br/>value:&nbsp;string,<br/>action:&nbsp;()&nbsp;=&gt;&nbsp;void<br/>} | 否   | 第一个按钮。<br/>value:&nbsp;弹窗里主按钮的文本。<br/>action:&nbsp;点击主按钮的回调函数。 |
| secondaryButton                       | {<br/>value:&nbsp;string,<br/>action:&nbsp;()&nbsp;=&gt;&nbsp;void<br/>} | 否   | 第二个按钮。<br/>value:&nbsp;弹窗里辅助按钮的文本。<br/>action:&nbsp;点击辅助按钮的回调函数。 |
| onStateChange                         | (event:&nbsp;{&nbsp;isVisible:&nbsp;boolean&nbsp;})&nbsp;=&gt;&nbsp;void | 否   | 弹窗状态变化事件回调,参数isVisible为弹窗当前的显示状态。    |
| arrowOffset<sup>9+</sup>              | [Length](ts-types.md#length)                                 | 否   | popup箭头在弹窗处的偏移。箭头在气泡上下方时,数值为0表示箭头居最左侧,偏移量为箭头至最左侧的距离,默认居中。箭头在气泡左右侧时,偏移量为箭头至最上侧的距离,默认居中。如果显示在屏幕边缘,气泡会自动左右偏移,数值为0时箭头始终指向绑定组件。 |
| showInSubWindow<sup>9+</sup>          | boolean                                                      | 否   | 是否在子窗口显示气泡,默认值为false。                        |
| mask<sup>10+</sup>                    | boolean&nbsp;\|&nbsp;[ResourceColor](ts-types.md#resourcecolor) | 否   | 设置气泡是否有遮罩层及遮罩颜色。如果设置为false,则没有遮罩层;如果设置为true,则设置有遮罩层并且颜色为透明色;如果设置为Color,则为遮罩层的颜色。 |
| messageOptions<sup>10+</sup>          | [PopupMessageOptions](#popupmessageoptions10)                | 否   | 设置弹窗信息文本参数。                                       |
| targetSpace<sup>10+</sup>             | [Length](ts-types.md#length)                                 | 否   | 设置popup与目标的间隙。                                      |
| placement<sup>10+</sup>               | [Placement](ts-appendix-enums.md#placement8)                 | 否   | 设置popup组件相对于目标的显示位置,默认值为Placement.Bottom。<br />如果同时设置了`placementOnTop``placement`,则以`placement`的设置生效。 |
H
huangdong57 已提交
32 33
| offset<sup>10+</sup>                  | [Position](ts-types.md#position8)                            | 否   | 设置popup组件相对于placement设置的显示位置的偏移。<br />**说明:**<br />不支持设置百分比。 |
| enableArrow<sup>10+</sup>             | boolean                                                      | 否   | 设置是否显示箭头。<br/>默认值:true                          |
T
fourth  
tianyu 已提交
34

35 36
## PopupMessageOptions<sup>10+</sup>类型说明

H
HelloCrease 已提交
37 38 39 40
| 名称        | 类型                                       | 必填   | 描述          |
| --------- | ---------------------------------------- | ---- | ----------- |
| textColor | [ResourceColor](ts-types.md#resourcecolor) | 否    | 设置弹窗信息文本颜色。 |
| font      | [Font](ts-types.md#Font)                 | 否    | 设置弹窗信息字体属性。 |
T
fourth  
tianyu 已提交
41
## CustomPopupOptions<sup>8+</sup>类型说明
Z
zengyawen 已提交
42

H
HelloCrease 已提交
43 44
| 名称                           | 类型                                       | 必填   | 描述                                       |
| ---------------------------- | ---------------------------------------- | ---- | ---------------------------------------- |
N
nickyjd 已提交
45
| builder                      | [CustomBuilder](ts-types.md#custombuilder8) | 是    | 提示气泡内容的构造器。<br />**说明:**<br />popup为通用属性,自定义popup中不支持再次弹出popup。对builder下的第一层容器组件不支持使用position属性,如果使用将导致气泡不显示。                              |
H
HelloCrease 已提交
46
| placement                    | [Placement](ts-appendix-enums.md#placement8) | 否    | 气泡组件优先显示的位置,当前位置显示不下时,会自动调整位置。<br/>默认值:Placement.Bottom |
47
| popupColor                   | [ResourceColor](ts-types.md#resourcecolor) | 否    | 提示气泡的颜色。<br/>默认值:'#4d4d4d' |
H
HelloCrease 已提交
48 49 50 51 52
| enableArrow                  | boolean                                  | 否    | 是否显示箭头。<br/>从API Version 9开始,如果箭头所在方位侧的气泡长度不足以显示下箭头,则会默认不显示箭头。比如:placement设置为Left,此时如果气泡高度小于箭头的宽度(32vp)与气泡圆角两倍(48vp)之和(80vp),则实际不会显示箭头。<br/>默认值:true |
| autoCancel                   | boolean                                  | 否    | 页面有操作时,是否自动关闭气泡。<br/>默认值:true            |
| onStateChange                | (event:&nbsp;{&nbsp;isVisible:&nbsp;boolean&nbsp;})&nbsp;=&gt;&nbsp;void | 否    | 弹窗状态变化事件回调,参数为弹窗当前的显示状态。                 |
| arrowOffset<sup>9+</sup>     | [Length](ts-types.md#length)             | 否    | popup箭头在弹窗处的偏移。箭头在气泡上下方时,数值为0表示箭头居最左侧,偏移量为箭头至最左侧的距离,默认居中。箭头在气泡左右侧时,偏移量为箭头至最上侧的距离,默认居中。如果显示在屏幕边缘,气泡会自动左右偏移,数值为0时箭头始终指向绑定组件。 |
| showInSubWindow<sup>9+</sup> | boolean                                  | 否    | 是否在子窗口显示气泡,默认值为false。                    |
N
nickyjd 已提交
53
| maskColor<sup>(deprecated)</sup> | [ResourceColor](ts-types.md#resourcecolor)   | 否   | 设置气泡遮罩层颜色。<br />**说明:**<br />从 API version 10 开始废弃,建议使用`mask`替代。 |
H
HelloCrease 已提交
54 55
| mask<sup>10+</sup>           | boolean&nbsp;\|&nbsp;[ResourceColor](ts-types.md#resourcecolor) | 否    | 设置气泡是否有遮罩层及遮罩颜色。如果设置为false,则没有遮罩层;如果设置为true,则设置有遮罩层并且颜色为透明色;如果设置为Color,则为遮罩层的颜色。 |
| targetSpace<sup>10+</sup>    | [Length](ts-types.md#length)             | 否    | 设置popup与目标的间隙。                           |
H
huangdong57 已提交
56
| offset<sup>10+</sup>         | [Position](ts-types.md#position8)                            | 否   | 设置popup组件相对于placement设置的显示位置的偏移。<br />**说明:**<br />不支持设置百分比。 |
Z
zengyawen 已提交
57

Z
zengyawen 已提交
58
## 示例
S
sunjiakun 已提交
59 60 61

### 示例1

H
geshi  
HelloCrease 已提交
62 63
```ts
// xxx.ets
Z
zengyawen 已提交
64 65 66
@Entry
@Component
struct PopupExample {
S
sienna1128 已提交
67 68
  @State handlePopup: boolean = false
  @State customPopup: boolean = false
Z
zengyawen 已提交
69

S
sienna1128 已提交
70
  // popup构造器定义弹框内容
Z
zengyawen 已提交
71 72
  @Builder popupBuilder() {
    Row({ space: 2 }) {
S
sienna1128 已提交
73
      Image($r("app.media.image")).width(24).height(24).margin({ left: -5 })
74
      Text('Custom Popup').fontSize(10)
S
sienna1128 已提交
75
    }.width(100).height(50).padding(5)
Z
zengyawen 已提交
76
  }
Z
zengyawen 已提交
77 78

  build() {
Z
zengyawen 已提交
79
    Flex({ direction: FlexDirection.Column }) {
S
sienna1128 已提交
80 81
      // PopupOptions 类型设置弹框内容
      Button('PopupOptions')
Z
zengyawen 已提交
82
        .onClick(() => {
S
sienna1128 已提交
83
          this.handlePopup = !this.handlePopup
Z
zengyawen 已提交
84 85
        })
        .bindPopup(this.handlePopup, {
S
sienna1128 已提交
86
          message: 'This is a popup with PopupOptions',
Z
zengyawen 已提交
87
          placementOnTop: true,
S
shanshurong 已提交
88
          showInSubWindow:false,
Z
zengyawen 已提交
89
          primaryButton: {
S
sienna1128 已提交
90 91
            value: 'confirm',
            action: () => {
S
sienna1128 已提交
92 93
              this.handlePopup = !this.handlePopup
              console.info('confirm Button click')
S
sienna1128 已提交
94 95 96 97
            }
          },
          // 第二个按钮
          secondaryButton: {
S
sienna1128 已提交
98
            value: 'cancel',
Z
zengyawen 已提交
99
            action: () => {
M
matchzhou 已提交
100
              this.handlePopup = !this.handlePopup
S
sienna1128 已提交
101
              console.info('cancel Button click')
Z
zengyawen 已提交
102 103 104
            }
          },
          onStateChange: (e) => {
Z
zhaoxinyu 已提交
105
            console.info(JSON.stringify(e.isVisible))
S
sienna1128 已提交
106
            if (!e.isVisible) {
S
sienna1128 已提交
107
              this.handlePopup = false
S
sienna1128 已提交
108
            }
Z
zengyawen 已提交
109 110
          }
        })
S
sienna1128 已提交
111 112
        .position({ x: 100, y: 50 })

Z
zengyawen 已提交
113

S
sienna1128 已提交
114 115
      // CustomPopupOptions 类型设置弹框内容
      Button('CustomPopupOptions')
Z
zengyawen 已提交
116
        .onClick(() => {
S
sienna1128 已提交
117
          this.customPopup = !this.customPopup
Z
zengyawen 已提交
118 119 120
        })
        .bindPopup(this.customPopup, {
          builder: this.popupBuilder,
S
sienna1128 已提交
121
          placement: Placement.Top,
N
nickyjd 已提交
122
          mask: {color:'0x33000000'},
S
sienna1128 已提交
123
          popupColor: Color.Yellow,
Z
zengyawen 已提交
124
          enableArrow: true,
S
sienna1128 已提交
125
          showInSubWindow: false,
Z
zengyawen 已提交
126 127
          onStateChange: (e) => {
            if (!e.isVisible) {
S
sienna1128 已提交
128
              this.customPopup = false
Z
zengyawen 已提交
129 130 131
            }
          }
        })
S
sienna1128 已提交
132
        .position({ x: 80, y: 200 })
Z
zengyawen 已提交
133 134 135 136 137
    }.width('100%').padding({ top: 5 })
  }
}
```

S
sienna1128 已提交
138
![figures/popup.gif](figures/popup.gif)
S
sunjiakun 已提交
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220

### 示例2

```ts
// xxx.ets
@Entry
@Component
struct PopupExample {
  @State handlePopup: boolean = false

  build() {
    Column() {
      Button('PopupOptions')
        .onClick(() => {
          this.handlePopup = !this.handlePopup
        })
        .bindPopup(this.handlePopup, {
          message: 'This is a popup with PopupOptions',
          messageOptions: {
            textColor: Color.Red,
            font: {
              size: '14vp',
              style: FontStyle.Italic,
              weight: FontWeight.Bolder
            }
          },
          placement: Placement.Bottom,
          enableArrow: false,
          targetSpace: '15vp',
          onStateChange: (e) => {
            console.info(JSON.stringify(e.isVisible))
            if (!e.isVisible) {
              this.handlePopup = false
            }
          }
        })
    }.margin(20)
  }
}
```

![](figures/popup_2.png)

### 示例3

```ts
// xxx.ets
@Entry
@Component
struct PopupExample {
  @State customPopup: boolean = false

  // popup构造器定义弹框内容
  @Builder popupBuilder() {
    Row() {
      Text('Custom Popup Message').fontSize(10)
    }.height(50).padding(5)
  }

  build() {
    Column() {
      // CustomPopupOptions 类型设置弹框内容
      Button('CustomPopupOptions')
        .onClick(() => {
          this.customPopup = !this.customPopup
        })
        .bindPopup(this.customPopup, {
          builder: this.popupBuilder,
          targetSpace: '15vp',
          enableArrow: false,
          onStateChange: (e) => {
            if (!e.isVisible) {
              this.customPopup = false
            }
          }
        })
    }.margin(20)
  }
}
```

![](figures/popup_3.png)