• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# !!语法:双向绑定
2在状态管理V1中使用[$$](./arkts-two-way-sync.md)用于系统组件双向绑定。
3在状态管理V2中,提供了归一处理,提供`!!`语法糖作为统一处理双向绑定语法。
4
5
6>**说明:**
7>
8>`!!`语法从API version 12开始支持。
9>
10
11## 概述
12
13`!!`双向绑定语法,是一个语法糖方便开发者实现数据双向绑定,用于初始化子组件的\@Param和\@Event。其中\@Event方法名需要声明为“$”+ \@Param属性名,详见[使用场景](#使用场景)。
14
15- 如果父组件使用了`!!`双向绑定语法,则表明父组件的变化会同步给子组件,子组件的变化也会同步给父组件。
16- 如果父组件没有使用`!!`,则父组件发生的变化是单向的。
17
18
19## 使用场景
20
21### 自定义组件间双向绑定
221. Index中构造Star子组件,双向绑定父子组件中的value,初始化子组件的`@Param value`和`@Event $value`。
23- 双向绑定语法糖可视为:
24
25    ```
26    Star({ value: this.value, $value: (val: number) => { this.value = val }})
27    ```
282. 点击改变Index中的Button,改变value,父组件Index和子组件Star中Text更新。
293. 点击改变子组件Star中的Button,调用`this.$value(10)`,父组件Index和子组件Star中Text更新。
30
31```ts
32@Entry
33@ComponentV2
34struct Index {
35  @Local value: number = 0;
36
37  build() {
38    Column() {
39      Text(`${this.value}`)
40      Button(`change value`).onClick(() => {
41        this.value++;
42      })
43      Star({ value: this.value!! })
44    }
45  }
46}
47
48
49@ComponentV2
50struct Star {
51  @Param value: number = 0;
52  @Event $value: (val: number) => void = (val: number) => {};
53
54  build() {
55    Column() {
56      Text(`${this.value}`)
57      Button(`change value `).onClick(() => {
58        this.$value(10);
59      })
60    }
61  }
62}
63```
64
65
66## 使用限制
67- `!!`双向绑定语法不支持多层父子组件传递。
68- 不支持与@Event混用。从API version 18开始,当使用`!!`双向绑定语法给子组件传递参数时,给对应的@Event方法传参会编译报错。
69- 当使用大于等于3个感叹号(!!!、!!!!、!!!!!等)时,不支持双向绑定功能。
70
71
72### 系统组件参数双向绑定
73
74!!运算符为系统组件提供TS变量的引用,使得TS变量和系统组件的内部状态保持同步。添加方式是在变量名后添加,例如isShow!!。
75
76内部状态具体指什么取决于组件。例如,[bindMenu](../../reference/apis-arkui/arkui-ts/ts-universal-attributes-menu.md)组件的isShow参数。
77
78#### 使用规则
79
80- 当前!!支持以下接口参数基础类型变量的双向绑定,也就是参数同步当前弹出菜单或气泡状态。!!双向绑定支持基础类型变量,当该变量使用状态管理V2[\@Local](arkts-new-local.md)或状态管理V1[\@State](arkts-state.md)装饰时,变量值的变化会触发UI刷新。
81
82  | 属性                                                         | 支持的参数 | 起始API版本 |
83  | ------------------------------------------------------------ | --------------- | ----------- |
84  | [bindMenu](../../reference/apis-arkui/arkui-ts/ts-universal-attributes-menu.md#bindmenu11) | isShow | 13          |
85  | [bindContextMenu](../../reference/apis-arkui/arkui-ts/ts-universal-attributes-menu.md#bindcontextmenu12) | isShown | 13          |
86  | [bindPopup](../../reference/apis-arkui/arkui-ts/ts-universal-attributes-popup.md#bindpopup) | show | 13   |
87  | [TextInput](../../reference/apis-arkui/arkui-ts/ts-basic-components-textinput.md#textinputoptions对象说明) | text | 18   |
88  | [TextArea](../../reference/apis-arkui/arkui-ts/ts-basic-components-textarea.md#textareaoptions对象说明) | text | 18   |
89  | [Search](../../reference/apis-arkui/arkui-ts/ts-basic-components-search.md#searchoptions18对象说明) | value | 18   |
90  | [BindSheet](../../reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md) | isShow | 18   |
91  | [BindContentCover](../../reference/apis-arkui/arkui-ts/ts-universal-attributes-modal-transition.md) | isShow | 18   |
92  | [SideBarContainer](../../reference/apis-arkui/arkui-ts/ts-container-sidebarcontainer.md#sidebarwidth) | sideBarWidth | 18   |
93  | [Navigation](../../reference/apis-arkui/arkui-ts/ts-basic-components-navigation.md#navbarwidth9) | navBarWidth | 18   |
94  | [Toggle](../../reference/apis-arkui/arkui-ts/ts-basic-components-toggle.md#toggleoptions18对象说明) | isOn | 18   |
95  | [Checkbox](../../reference/apis-arkui/arkui-ts/ts-basic-components-checkbox.md#select) | select | 18   |
96  | [CheckboxGroup](../../reference/apis-arkui/arkui-ts/ts-basic-components-checkboxgroup.md#selectall) | selectAll | 18   |
97  | [Radio](../../reference/apis-arkui/arkui-ts/ts-basic-components-radio.md#checked) | checked | 18   |
98  | [Rating](../../reference/apis-arkui/arkui-ts/ts-basic-components-rating.md#ratingoptions18对象说明) | rating | 18   |
99  | [Slider](../../reference/apis-arkui/arkui-ts/ts-basic-components-slider.md#slideroptions对象说明) | value | 18   |
100  | [Select](../../reference/apis-arkui/arkui-ts/ts-basic-components-select.md#selected) | selected | 18   |
101  | [Select](../../reference/apis-arkui/arkui-ts/ts-basic-components-select.md#value) | value | 18   |
102  | [MenuItem](../../reference/apis-arkui/arkui-ts/ts-basic-components-menuitem.md#selected) | selected | 18   |
103- !!绑定的[\@Local](arkts-new-local.md)变量变化时,会触发UI的同步刷新。
104
105
106#### 使用示例
107
108bindMenu接口isShow参数双向绑定功能。
109
110```ts
111@Entry
112@ComponentV2
113struct BindMenuInterface {
114  @Local isShow: boolean = false;
115
116  build() {
117    Column() {
118      Row() {
119        Text('click show Menu')
120          .bindMenu(this.isShow!!, // 双向绑定
121            [
122              {
123                value: 'Menu1',
124                action: () => {
125                  console.info('handle Menu1 click');
126                }
127              },
128              {
129                value: 'Menu2',
130                action: () => {
131                  console.info('handle Menu2 click');
132                }
133              },
134            ])
135      }.height('50%')
136      Text("当前isShow: " + this.isShow).fontSize(18).fontColor(Color.Red)
137      Row() {
138        Button("Click")
139          .onClick(() => {
140            this.isShow = true;
141          })
142          .width(100)
143          .fontSize(20)
144          .margin(10)
145      }
146    }.width('100%')
147  }
148}
149```
150
151![bindMenu](figures/bindmenu_doublebind.gif)
152