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

重庆涪陵网站建设深圳住房和城乡建设部网站

重庆涪陵网站建设,深圳住房和城乡建设部网站,无锡做网站公司哪家好,杭州上城区抖音seo如何前言 本文代码案例基于Api13。 Builder装饰器,可以把build函数中的组件代码,单独的抽取出来,虽然简化了build函数,实现了组件之间的复用,但是代码还是在整个UI视图内,如下案例所示: Entry Compo…

前言

本文代码案例基于Api13。

@Builder装饰器,可以把build函数中的组件代码,单独的抽取出来,虽然简化了build函数,实现了组件之间的复用,但是代码还是在整个UI视图内,如下案例所示:

@Entry
@Component
struct Index {@BuilderTextView(text: string) {Text(text)}build() {Column() {this.TextView("测试数据1")this.TextView("测试数据2")}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

只能说,在同一个UI视图中,实现了组件复用,简化了代码,但是,如果有很多个页面共用一个组件呢?还好,@Builder装饰器支持全局定义,这个在以往的文章中有过概述,可以把共用的组件抽取到一个全局文件中。

@Builder
export function TextView(text: string) {Text(text)
}

在需要的地方直接调用即可。

import { TextView } from './Views'@Entry
@Component
struct Index {build() {Column() {TextView("测试数据1")TextView("测试数据2")}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

哎,回过头来,我们发现,@Builder装饰器可局部可全局,已经满足了需求了啊,还要wrapBuilder干什么?先别着急,我们先看下这几个场景:

1、有一个自定义Dialog弹窗,需要接收从外部传递UI视图过来,请问,如何把组件传递过去?

2、有一个封装的网络库,其中有一个功能是请求加载Loading,由于每个项目的Loading不同,这个Loading组件视图需要单独传递,如何传递?

怎么能把外部定义的UI组件,传递给需要的地方呢?这些需要的地方可不是struct修饰的,大家想想看,能直接传递吗?

再看一个案例,虽然说,我们可以定义全局的@Builder装饰器,然而当我组合成数组后,却无法进行调用,如下代码:

import { TextView } from './Views';let builderArr: Function[] = [TextView]@Entry
@Component
struct Index {build() {Column() {ForEach(builderArr, (item: Function) => {item()})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

直接报错:

'item()' does not comply with the UI component syntax. <ArkTSCheck>

为了解决以上的问题,鸿蒙引入wrapBuilder作为全局@Builder封装函数,返回WrappedBuilder对象,以实现全局@Builder可以进行赋值和传递。

如何使用

wrapBuilder是一个模板函数,返回一个WrappedBuilder对象。

declare function wrapBuilder< Args extends Object[]>(builder: (...args: Args) => void): WrappedBuilder;

声明变量

let builderVar: WrappedBuilder<[string, number]> = wrapBuilder(MyBuilder)

简单案例:

import { TextView } from './Views'@Entry
@Component
struct Index {textView: WrappedBuilder<[string]> = wrapBuilder(TextView)build() {Column() {this.textView.builder("测试数据")}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

当然了,也可以直接在定义组件的地方进行声明变量。

@Builder
function TextView(test: string) {Text(test)
}export let textView: WrappedBuilder<[string]> = wrapBuilder(TextView)

调用:

import { textView } from './Views'@Entry
@Component
struct Index {build() {Column() {textView.builder("测试数据")}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

传递数据

其实在上边的案例中,已经是传递参数的案例,遵循着,接收什么类型就传递什么类型。

比如接收的是string类型。

let textView: WrappedBuilder<[string]> = wrapBuilder(TextView)

比如接收两个参数,一个是string,一个是number。

@Builder
function TextView(test: string,num:number) {Text(test)
}export let textView: WrappedBuilder<[string,number]> = wrapBuilder(TextView)

如果传递参数过多,可以通过对象,数组,集合等形式传递,下面举一个引用类型传递:

定义对象

export class TestBean {testData?: string = "测试数据"
}

创建全局组件

import { TestBean } from "./TestBean"@Builder
function TextView(test: TestBean) {Text(test.testData)
}export let textView: WrappedBuilder<[TestBean]> = wrapBuilder(TextView)

组件调用

import { TestBean } from './TestBean';
import { textView } from './Views'@Entry
@Component
struct Index {@State test: TestBean = new TestBean();build() {Column() {textView.builder({ testData: this.test.testData })Button("点击").onClick(() => {this.test.testData = "改变数据"})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

相关总结

首先第一点,在同一个UI组件内,同一个wrapBuilder只能初始化一次,第二点就是WrappedBuilder对象的builder属性方法只能在struct内部使用。

如何接收一个外部传来的UI组件呢,很是简单,只需要接收一个WrappedBuilder<[Object]>即可,简单案例如下:

export class ViewUtils {view?: WrappedBuilder<[Object]>setView(view: WrappedBuilder<[Object]>) {this.view = view}getView(): WrappedBuilder<[Object]> | undefined {return this.view}
}
http://www.dtcms.com/wzjs/824945.html

相关文章:

  • wordpress 网站改名网络公司营业范围
  • 做网站还是app服装网页设计欣赏
  • 网站开发的书籍wordpress积分商城
  • 云南网站的设计公司简介wordpress 相册 免费模板
  • 太仓网站制作公司哪家好网页访问被拒绝怎么办
  • asp 网站数据库连接错误切管机维修 东莞网站建设
  • 网站建设初级教程如何搭建网站的支付接口
  • php网站开发原理哔哩哔哩网页版在线观看网址
  • 我看别人做系统就直接网站下载文件广州省建设监理协会网站
  • 100元网站建设学网站建设难吗
  • 如何让新网站快速收录书店网站模板
  • 手机相册备份网站源码深圳网页制作费用
  • 大型门户网站设计解决方案合肥市建设工程造价信息网站
  • wordpress图片排列seo关键词快速排名前三位
  • 网站开发前期工作中卫设计师招聘
  • 学校定制网站建设公司南通网络推广公司
  • 网站建设技术 论坛找人做网站都要提供什么
  • 家庭服务网站的营销策略版面设计绘画
  • 个人网站示例免费做公司电子画册的网站
  • wordpress建设网站的方法游戏网站怎么做
  • 如皋市建设局网站在哪里上海森琦阳网络科技有限公司
  • 云主机如何建网站外贸模板建站
  • 高校网站推广方案编辑wordpress模板下载
  • 去什么网站可以做ctf的题目珠海专业网站建设费用
  • 做游戏钓鱼网站电子信息工程移动互联网方向
  • 网站被降权后怎么办2345网址大全设为主页
  • 天猫网站建设基本情况品牌策划网站推荐
  • 专业手机网站公司哪家好帮站seo
  • 如何建网站费用多少wordpress字体目录
  • 美发网站 源代码网络推广团队需要哪些人手