样式复用
概述
当多个组件具有相同的样式时,若每个组件都单独设置,将会有大量的重复代码。为避免重复代码,开发者可使用@Styles
或者@Extend
装饰器将多条样式设置提炼成一个方法,然后直接在各组件声明的位置进行调用,这样就能完成样式的复用。
@Styles
方法
@Styles
方法可定义在组件内
或者全局
,具体语法如下
● 组件内
@Entry
@Component
struct StylesPage {build() {Column() {Row({ space: 50 }) {Button('确认').type(ButtonType.Normal).backgroundColor(Color.Green).compButtonStyle() //复用样式.onClick(() => console.log('确认'))Button('取消').type(ButtonType.Normal).backgroundColor(Color.Gray).compButtonStyle() //复用样式.onClick(() => console.log('取消'))}}.width('100%').height('100%').justifyContent(FlexAlign.Center)}//组件内样式定义@Styles compButtonStyle() {.width(100).height(40).borderRadius(10)}
}
● 全局
@Entry
@Component
struct StylesPage {build() {Column() {Row({ space: 50 }) {Button('确认').type(ButtonType.Normal).backgroundColor(Color.Green).globalButtonStyle() //复用样式.onClick(() => console.log('确认'))Button('取消').type(ButtonType.Normal).backgroundColor(Color.Gray).globalButtonStyle() //复用样式.onClick(() => console.log('取消'))}}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}//全局样式定义
@Styles function globalButtonStyle() {.width(100).height(40).borderRadius(10)
}
注意
- 组件内的
@Styles
方法只能在当前组件中使用,全局的@Styles
方法目前只允许在当前的.ets
文件中使用 - 组件内定义
@Styles
方法时不需要使用function
关键字,全局的@Styles
方法需要使用function
关键字 @Styles
方法中只能包含通用属性方法和通用事件方法@Styles
方法不支持参数
@Extend
方法
@Extend
装饰的方法同样可用于组件样式的复用,与@Styles
不同的是,@Extend
方法只能定义在全局。并且@Extend
方法只能用于指定类型的组件,例如以下方法只能用于Button
组件(可以理解为是Button
组件的扩展样式)
@Extend(Button) function buttonStyle(){...
}
由于@Extend
方法只能用于指定类型的组件,因此方法中可包含指定组件的专有属性方法和专有事件方法。另外,@Extend
方法还支持参数,具体语法如下
@Entry
@Component
struct ExtendPage {build() {Column() {Row({ space: 50 }) {Button('确认').buttonExtendStyle(Color.Green, () => console.log('确认')) //复用样式Button('取消').buttonExtendStyle(Color.Gray, () => console.log('取消')) //复用样式}}.width('100%').height('100%').justifyContent(FlexAlign.Center)}
}//样式定义
@Extend(Button) function buttonExtendStyle(color: Color, callback: () => void) {.width(100).height(40).borderRadius(10).type(ButtonType.Normal).backgroundColor(color).onClick(callback)
}
总结
@Extend
方法只能定义在全局,使用范围目前只限于当前的.ets
文件@Extend
方法用于特定类型的组件,因此可包含该组件的专有属性方法和专有事件方法@Extend
方法支持参数