当前位置: 首页 > wzjs >正文

重庆忠县网站建设公司哪里有中国建设监理协会网站个人会员系统栏

重庆忠县网站建设公司哪里有,中国建设监理协会网站个人会员系统栏,第三方电子商务平台的特点,分析一个网站前言 本文代码案例基于Api13,温馨提示:内容相对来说比较简单,如果您已掌握,略过即可。 如果说一个页面中组件有很多,我们都统一写到build函数中,显而易见,会导致build函数代码非常冗余&#xff…

前言

本文代码案例基于Api13,温馨提示:内容相对来说比较简单,如果您已掌握,略过即可。

如果说一个页面中组件有很多,我们都统一写到build函数中,显而易见,会导致build函数代码非常冗余,并且在有相同UI时,也做不到可复用效果,那么,针对这一问题如何解决呢?答案就是抽取出来;在页面内实现UI组件的抽取剥离,其实,在实际的开发中是非常常见的,也就是通过@Builder装饰器来实现。

简单案例

以下是一个多文本展示案例,非常简单,就是几个Text组件,未抽取之前,都统一写在build函数之中。

@Entry
@Component
struct Index {build() {Column() {Text("文本测试一").fontSize(20).fontWeight(FontWeight.Bold)Text("文本测试二").fontSize(20).fontWeight(FontWeight.Bold)Text("文本测试三").fontSize(20).fontWeight(FontWeight.Bold)Text("文本测试四").fontSize(20).fontWeight(FontWeight.Bold)}.height('100%').width('100%')}
}

使用@Builder装饰器之后:

@Entry
@Component
struct Index {@BuildertextView(text: string) {Text(text).fontSize(20).fontWeight(FontWeight.Bold)}build() {Column() {this.textView("文本测试一")this.textView("文本测试二")this.textView("文本测试三")this.textView("文本测试四")}.height('100%').width('100%')}
}

显而可见,代码相比未抽取之前,简洁了很多,虽然上述只是一个案例,然而在实际的开发中,页面的复杂程度远远比案例复杂,所以更应该合理的使用@Builder装饰器

什么是@Builder?

在前言中已经明确告知,@Builder它是一个装饰器,主要用于UI元素的复用以及抽取,@Builder所修饰的函数,统称为“自定义构建函数”,可以在函数中定义任何的UI组件,用法和build中的使用是一样的。

使用方式

@Builder装饰器有两种使用方式,一种是定义在UI组件内,也就是上述的使用方式,可以称为私有自定义构建函数,也就是只能给当前的UI组件进行使用,别的UI组件是无法使用的。

与私有自定义构建函数相对应的就是全局自定义构建函数,它可以实现任意的UI组件进行使用,需要用到function关键字,如果定义在非UI组件中,需要用export关键字导出。

我们可以自定义一个扩展类,把共用的组件定义在这里。

@Builder
export function TextView(text: string) {Text(text).fontSize(20).fontWeight(FontWeight.Bold)
}

任何一个页面或者UI组件中都可以使用。

import { TextView } from './BuilderView'@Entry
@Component
struct Index {build() {Column() {TextView("文本测试一")TextView("文本测试二")TextView("文本测试三")TextView("文本测试四")}.height('100%').width('100%')}
}

当然了,如果不是全局共用,仅仅是本页面内共用,也可以使用这种方式来实现。

数据更新

当我们直接更改传递的变量时,会发现@Builder修饰的函数内并没有实现数据改变,如下案例,怎么点击Button都不会发生改变。

@Entry
@Component
struct Index {@State testContent: string = "文本测试"@BuildertextView(text: string) {Text(text).fontSize(20).fontWeight(FontWeight.Bold)}build() {Column() {this.textView(this.testContent)Button("改变").margin({ top: 10 }).onClick(() => {this.testContent = "文本测试2"})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

这是因为,在@Builder修饰的函数内部,不允许改变参数值,也就是状态变量的改变不会引起@Builder方法内的UI刷新,那么要怎么实现可以动态改变@Builder修饰的函数里的数据呢,有两种方式,一种是,直接把当前的引用也就是当前的类传递过去,直接调用,另一种则是使用引用传递。

this指向当前类

把以上的代码做下更改,由传递值,直接传递当前的类,也就是当前的this,由this直接调用。

@Entry
@Component
struct Index {@State testContent: string = "文本测试"@BuildertextView(_this: Index) {Text(_this.testContent).fontSize(20).fontWeight(FontWeight.Bold)}build() {Column() {this.textView(this)Button("改变").margin({ top: 10 }).onClick(() => {this.testContent = "文本测试2"})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

可以发现点击Button后,数据实现了动态改变。

按引用传递参数

直接传递当前的this,可以说是最简单的方式,除了这种方式之外,我们还可是使用引用传递参数的方式,动态改变数据,也就是通过传递对象的方式。

class TestBean {testContent?: string;
}@Entry
@Component
struct Index {@State testContent: string = "文本测试"@BuildertextView(testBean: TestBean) {Text(testBean.testContent).fontSize(20).fontWeight(FontWeight.Bold)}build() {Column() {this.textView({ testContent: this.testContent })Button("改变").margin({ top: 10 }).onClick(() => {this.testContent = "文本测试2"})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

可以看到,以上的数据传递,也能实现数据的动态改变,相对于this传递,使用这种方式则更加灵活,毕竟在实际的开发中,我们可能会遇到多个页面共用组件的情况,传递this显然只适合当前的页面,如果多个页面复用,还是以对象形式传递为佳。

由此可见,在使用@Builder进行参数传递的时候,如果要引起@Builder方法内的UI刷新,可以按照引用传递参数进行实现,按值传递是无法更新UI的。

参数规则

@Builder修饰的函数,其定义的参数类型,必须和传递的类型保持一致,并且不允许undefined、null和返回undefined、null的表达式。

还有一点非常重要,@Builder如果传入的参数是两个或两个以上,不会触发动态渲染UI,比如,上面的案例中,我们随便增加一个参数。

 @BuildertextView(testBean: TestBean, isBoolean: boolean) {Text(testBean.testContent).fontSize(20).fontWeight(FontWeight.Bold)}

运行后可以发现,数据是无法动态更改的,如果有多个值如何传递呢?两种方式,第一种以this为传递对象,使用this调用更多定义的参数,第二种就是直接定义在对象里,既然都以对象的形式进行传递了,何不都直接定义在对象里呢?

@ComponentV2装饰器更新

使用ComponentV2装饰器,遵循的道理一样,也就是使用简单数据类型不可以触发UI的刷新。

@Entry
@ComponentV2
struct Index {@Local testContent: string = "文本测试"@BuildertextView(testContent: string) {Column() {Text(testContent).fontSize(20).fontWeight(FontWeight.Bold)}}build() {Column() {this.textView(this.testContent)Button("改变").margin({ top: 10 }).onClick(() => {this.testContent = "文本测试2"})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

如果要更新UI的话,还是需要按引用传递参数,也就是修改为对象传递。

class TestBean {testContent?: string;
}@Entry
@ComponentV2
struct Index {@Local testContent: string = "文本测试"@BuildertextView(testBean: TestBean) {Column() {Text(testBean.testContent).fontSize(20).fontWeight(FontWeight.Bold)}}build() {Column() {this.textView({ testContent: this.testContent })Button("改变").margin({ top: 10 }).onClick(() => {this.testContent = "文本测试2"})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

如果直接以对象的形式传递,不借助成员变量,需要使用@ObservedV2修饰的对象类和@Trace修饰属性才可以触发UI的刷新。

@ObservedV2
class TestBean {@Trace testContent: string = "文本测试";
}@Entry
@ComponentV2
struct Index {@Local testBean: TestBean = new TestBean()@BuildertextView(testBean: TestBean) {Column() {Text(testBean.testContent).fontSize(20).fontWeight(FontWeight.Bold)}}build() {Column() {this.textView(this.testBean)Button("改变").margin({ top: 10 }).onClick(() => {this.testBean.testContent = "文本测试2"})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

相关总结

@Builder装饰是鸿蒙UI开发中,非常重要的一个装饰器,在实际的开发中,合理且正确的使用,能够让我们的代码更加的简洁,有两点需要注意,一是,是用私有还是全局,取决于当前的组件的复用机制,如果多个页面都使用了,建议以全局为主;二是传参的动态更新,有更新就使用引用参数传递,没有更新按值传递即可。


文章转载自:

http://eUdW0Eg7.ntqgz.cn
http://hfLpe9Uf.ntqgz.cn
http://bDi6u4ao.ntqgz.cn
http://Kgu9biRe.ntqgz.cn
http://7gmuTpym.ntqgz.cn
http://lRr4KJf3.ntqgz.cn
http://uVm8akQe.ntqgz.cn
http://8uR57m7y.ntqgz.cn
http://FNdKIAWB.ntqgz.cn
http://EqwnQg6H.ntqgz.cn
http://2XyOkyH7.ntqgz.cn
http://SPLDQlQi.ntqgz.cn
http://bhJ0xMIP.ntqgz.cn
http://OjXWzrXR.ntqgz.cn
http://04T2wtkG.ntqgz.cn
http://pSGdRCKt.ntqgz.cn
http://3gJr1xre.ntqgz.cn
http://S1iupbay.ntqgz.cn
http://tqi0HPO1.ntqgz.cn
http://74PXVbHb.ntqgz.cn
http://ZAJhYDsC.ntqgz.cn
http://Df6Ewe2S.ntqgz.cn
http://FikxH8z3.ntqgz.cn
http://VcOj0bI5.ntqgz.cn
http://3U8YzNWF.ntqgz.cn
http://lEa0sO7o.ntqgz.cn
http://dEu7EF0I.ntqgz.cn
http://1apOg26p.ntqgz.cn
http://coGpeCcg.ntqgz.cn
http://dvZk2Vrk.ntqgz.cn
http://www.dtcms.com/wzjs/635070.html

相关文章:

  • 云南省建设厅招标办网站wordpress in
  • 网站推广的基本方法是哪四个外国网站签到做任务每月挣钱
  • 做网站用百度地图和天地图响应式网站 向下兼容
  • 新手如何注册网站域名网站建设管理考核办法
  • 网站用什么字体263企业邮箱登官网
  • 阿里云建设网站费用大型网站快速排名
  • 网站建设安全性原则织梦 手机网站模板
  • 做悬浮导航的网站安阳网站自然优化
  • wordpress仿小米主题网站优化报价单
  • 做网站送的企业邮箱能用吗中企动力科技股份有限公司南通分公司
  • 网站怎么做备案变更怎么iis设置网站
  • 绚丽的网站欣赏wordpress 创建时间
  • 做网站台式还是笔记本全媒体运营技巧和工具
  • 外国网站接单做翻译上海中高风险地区查询
  • 网站被别人做镜像信息推广平台有哪些
  • 可视化网站建设软件易进网站建设推广
  • windows2008 iis 网站商城网站做推广有什么好处
  • 网站建设肆金手指排名6网络安全维护是做什么
  • 厦门建设工程招标中心的网站绍兴市高速公路建设指挥部网站
  • 织梦增加网站英文名称西安十大广告设计公司
  • 免费flash网站源码带后台网站降权的原因
  • 珠海网站建设哪个平台好美食网站开发的难点
  • 珠海正规网站制作哪家好lol解说网站源码
  • 怎么做移动端网站WordPress5新版文章标签
  • 泰兴企业网站建设做php网站会员开店代码如何编写
  • 简述网站设计的开发流程手机端是什么
  • 网站开发留言板网站建站免费
  • 临汾网站建设价格网站建设工作汇报
  • wp做音乐网站必备广州网络科技有限公司
  • 网站建设应注意的问题有哪些怎么建设网站手机网站制作价格