一、$$
语法概述
在鸿蒙Next开发中,$$
语法为系统内置组件提供了一种强大的双向同步机制,用于实现TypeScript(TS)变量与系统内置组件内部状态之间的同步。这一特性使得开发者能够更加便捷地管理组件状态,确保用户界面(UI)与应用数据的一致性,提升用户体验。
二、使用规则
(一)变量类型支持
- 基础类型变量:包括数字(如
number
)、字符串(string
)、布尔值(boolean
)等常见的基础数据类型。这些基础类型变量可以直接与支持$$
语法的内置组件属性进行双向绑定,实现数据的同步更新。 - 装饰器修饰的变量:
@State
装饰的变量:用于在组件内部管理本地状态,$$
能够使其与组件属性保持同步,方便在组件内部响应状态变化并更新UI。@Link
装饰的变量:主要用于实现父子组件或不同组件之间的双向数据绑定,通过$$
,可以确保数据在多个组件间的一致性传递和同步更新。@Prop
装饰的变量:用于组件间的数据传递,$$
语法使这些传递的数据与组件内部状态实时同步,便于组件间的协同工作。
(二)支持的内置组件及属性
以下是部分支持$$
语法的内置组件及其对应的属性(起始API版本如表格所示):
组件 | 属性 | 起始API版本 |
---|---|---|
Checkbox |
select |
10 |
CheckboxGroup |
selectAll |
10 |
DatePicker |
selected |
10 |
TimePicker |
selected |
10 |
MenuItem |
selected |
10 |
Panel |
mode |
10 |
Radio |
checked |
10 |
Rating |
rating |
10 |
Search |
value |
10 |
SideBarContainer |
showSideBar |
10 |
Slider |
value |
10 |
Stepper |
index |
10 |
Swiper |
index |
10 |
Tabs |
index |
10 |
TextArea |
text |
10 |
TextInput |
text |
10 |
TextPicker |
selected 、value |
10 |
Toggle |
isOn |
10 |
AlphabetIndexer |
selected |
10 |
Select |
selected 、value |
10 |
BindSheet |
isShow |
10 |
BindContentCover |
isShow |
10 |
Refresh |
refreshing |
8 |
GridItem |
selected |
10 |
ListItem |
selected |
10 |
(三)同步机制
- 当使用
$$
语法将TS变量与组件属性绑定后,任何一方的变化都会立即触发另一方的更新。例如,若绑定的变量值发生改变,组件会自动刷新以显示新的值;反之,当用户在组件中进行操作导致组件属性变化时,绑定的变量也会同步更新,从而保证数据的一致性。
三、使用示例
(一)以TextInput
组件为例
- 假设我们有一个简单的输入框场景,希望实时获取用户输入的文本并进行处理。
// xxx.ets
@Entry
@Component
struct TextInputExample {
// 使用@State装饰器声明一个text变量,用于存储输入框中的文本
@State text: string = ''
// 创建一个TextInputController实例,用于控制TextInput组件的行为(可选,根据需求)
controller: TextInputController = new TextInputController()
build() {
Column({ space: 20 }) {
// 显示当前text变量的值
Text(this.text)
// 使用$$语法将text变量与TextInput组件的text参数绑定,实现双向同步
TextInput({ text: $$this.text, placeholder: 'input your word...', controller: this.controller })
.placeholderColor(Color.Grey)
.placeholderFont({ size: 14, weight: 400 })
.caretColor(Color.Blue)
.width(300)
}.width('100%').height('100%').justifyContent(FlexAlign.Center)
}
}
- 在上述代码中:
- 首先,通过
@State
声明了text
变量,并初始化为空字符串。 - 然后,在
TextInput
组件中,使用$$this.text
将text
变量与组件的text
参数进行绑定。 - 当用户在输入框中输入文本时,
text
变量会实时更新,同时Text
组件会显示最新的输入内容。反之,如果在代码中修改text
变量的值,输入框中的显示也会相应改变。
- 首先,通过
(二)其他组件的类似用法
- 对于其他支持
$$
语法的组件,使用方法类似。例如,对于Checkbox
组件:
@Entry
@Component
struct CheckboxExample {
@State isChecked: boolean = false
build() {
Column {
Checkbox({ select: $$this.isChecked })
Text(`Checkbox is ${this.isChecked? 'checked' : 'unchecked'}`)
}
}
}
- 这里,
@State
装饰的isChecked
变量与Checkbox
组件的select
属性通过$$
绑定。当用户点击复选框改变其状态时,isChecked
变量会更新,Text
组件也会显示相应的提示信息。
四、注意事项
- 虽然
$$
语法在双向同步方面提供了很大的便利,但开发者需要谨慎使用,避免过度复杂的双向绑定关系导致代码难以维护。在设计组件和状态管理时,应尽量遵循清晰、简洁的原则,确保数据流向的可理解性。 - 注意
$$
语法在不同组件和属性上的行为可能存在细微差异,尤其是在处理复杂组件或涉及多个状态变量的情况下。开发者应充分测试不同场景下的功能,以确保应用的稳定性和正确性。 - 当与其他状态管理机制(如
AppStorage
、LocalStorage
等)结合使用时,要注意避免冲突和不必要的重复操作,确保整个应用的状态管理逻辑协调一致。例如,如果同时使用$$
绑定和AppStorage
进行状态管理,需要明确各自的职责和数据更新时机,避免数据不一致的问题。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦