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

网站开发学生鉴定表深圳网络推广服务公司

网站开发学生鉴定表,深圳网络推广服务公司,深圳建网站的专业公司,东莞 网站 建设 物流一、基础UI组件结构 每个UI组件需要定义为Component struct对象,其内部必须包含一个且只能包含一个build(){}函数,用于绘制UI;struct之内、build()函数之外的地方用于存放数据。 二、基本UI装饰器 Entry 装饰struct,页面的入口…

一、基础UI组件结构

        每个UI组件需要定义为@Component struct对象,其内部必须包含一个且只能包含一个build(){}函数,用于绘制UI;struct之内、build()函数之外的地方用于存放数据。

二、基本UI装饰器

@Entry

装饰struct,页面的入口

@Component

装饰struct,表示该struct具有基于组件的能力

@Entry
@Component
struct TestPage {build() {……}
}

三、数据装饰器

@State 父子相互独立

  • 装饰的变量是组件的局部变量,必须本地初始化,可通过构造参数赋值
  • 当该数据被修改时,所在组件的build()方法会被重新调用,会重新绘制所在UI
子组价:
@Component
export struct ComponentPage {@State count: number = 0private toggleClick() {this.count += 1}build() {Row() {Column({ space: 20 }) {Button(`这是子组件,${this.count}`).fontSize(24).onClick(this.toggleClick.bind(this))}.width('100%')}}
}
父组件:
import { ComponentPage } from "./ComponentPage"@Entry
@Component
struct StatePage {@State count: number = 0private toggleClick() {this.count += 1}build() {Row() {Column({ space: 20 }) {Button(`这是父组件,当前值: ${this.count}`).fontSize(24).onClick(this.toggleClick.bind(this))//使用默认初始化值ComponentPage()//设置count初始值为:20ComponentPage({ count: 20 })}.width('100%')}.height('100%')}
}
描述:
  • 当被点击之后修改了count的值,页面会重新绘制UI
  • 子组件中的count和父组件的count互不影响
  • 可以给子组件构造方法设置初始值
  • 使用@State修饰的变量必须初始化
效果图:

@Prop 父子单向同步

  • 继承@State的所有功能
  • 被其装饰的变量可以和父组件建立单向同步关系。@Prop装饰的变量是可变的,但修改不会同步回父组件,当父组件的@State变化时,本地修改的@Prop会被覆盖
子组件:
@Component
export struct ComponentPage {@Prop count: numberprivate toggleClick() {this.count += 1}build() {Row() {Column({ space: 20 }) {Button(`这是子组件,${this.count}`).fontSize(24).onClick(this.toggleClick.bind(this))}.width('100%')}}
}
父组件:
import { ComponentPage } from "./ComponentPage"@Entry
@Component
struct StatePage {@State count: number = 0private toggleClick() {this.count += 1}build() {Row() {Column({ space: 20 }) {Button(`这是父组件,当前值: ${this.count}`).fontSize(24).onClick(this.toggleClick.bind(this))ComponentPage({ count: this.count })}.width('100%')}.height('100%')}
}
描述:
  • 将父组件的count设置到子组件使用的@Prop修饰的变量时,父组件与子组件这时建立起单向同步
  • 父组件修改值后,子组件跟着修改,子组件修改值父组件不受影响
  • 使用的@Prop修饰的变量不能自己初始化
效果图:

@Link 父子双向同步

  • @Link装饰的变量和父组件构建双向同步关系的状态变量,父组件会接受来自@Link装饰的变量的修改的同步,父组件的更新也会同步给@Link装饰的变量。
  • @Link装饰的变量与其父组件中的数据源共享相同的值
  • @Link装饰器不能在@Entry装饰的自定义组件中使用
子组件:
@Component
export struct ComponentPage {@Link count: numberprivate toggleClick() {this.count += 1}build() {Row() {Column({ space: 20 }) {Button(`这是子组件,${this.count}`).fontSize(24).onClick(this.toggleClick.bind(this))}.width('100%')}}
}
父组件:
import { ComponentPage } from "./ComponentPage"@Entry
@Component
struct StatePage {@State count: number = 0private toggleClick() {this.count += 1}build() {Row() {Column({ space: 20 }) {Button(`这是父组件,当前值: ${this.count}`).fontSize(24).onClick(this.toggleClick.bind(this))ComponentPage({ count: $count })}.width('100%')}.height('100%')}
}
描述:
  • 父组件通过$count来和子组件的@Link修饰的值绑定
  • 绑定之后实现父子双向绑定,修改一端,另一组件也随之变化
  • 使用@Link不能自己初始化
效果图:

@State、@Prop与@Link的异同

相同点:

  • 都会引起UI重绘
  • 内部私有

不同点:

不同点@State@Prop@Link
装饰内容基本数据类型,类,数组基本数据类型基本数据类型,类,数组
关联不与其他控件关联父@State -> 子@Prop 单向关联父@State <-> 子@Link 双向关联
初始化时机声明时创建组件时由参数传入创建组件时由参数传入

四、生产消费的装饰器

@Provide、@Consume

后代通过使用@Consume去获取@Provide提供的变量,建立在@Provide和@Consume之间的双向数据同步,与@State/@Link不同的是,前者可以在多层级的父子组件之间传递

案例:

在父组件中将数据多级传递给子组件,子子组件

1.使用@Link修饰的变量进行传递
父组件:
import { ProviderSonPage } from "./ProviderSonPage"@Entry
@Component
struct ProviderPage {@State message: string = '父类A'build() {Row() {Column() {Text(this.message).fontSize(50).fontColor(Color.Red).onClick(() => {//点击文字  进行切换this.message = this.message === '父类A' ? '父类B' : '父类A'})//调用子组件ProviderSonPage({ sonMsg: $message })}.width('100%')}.height('100%')}
}
子组件:
import { ProviderGrandSonPage } from "./ProviderGrandSonPage"@Component
export struct ProviderSonPage {@Link sonMsg: stringbuild() {Column() {Text(this.sonMsg).fontSize(30).fontColor(Color.Green).onClick(() => {this.sonMsg = '我是子类'})//调用孙子组件:子类的子类ProviderGrandSonPage({ grandSonMsg: $sonMsg })}}
}
子子组件:
@Component
export struct ProviderGrandSonPage {@Link grandSonMsg: stringbuild() {Column() {Text(this.grandSonMsg).fontSize(20).fontColor(Color.Blue).onClick(() => {this.grandSonMsg = '我是子类的子类'})}}
}
总结:
  • 都需要通过一个多余被@Link修饰的变量进行传递,太过复杂,如果传递层级太深没更加明显
2.发布者订阅者模式

使用发布者Provide和订阅者Consume可以直接传递到子子组件

父组件:
import { ProviderSonPage } from "./ProviderSonPage"@Entry
@Component
struct ProviderPage {@Provide('Mes') message: string = '父类A'//也可以写成@Provide message: string = '父类A'build() {Row() {Column() {Text(this.message).fontSize(50).fontColor(Color.Red).onClick(() => {this.message = this.message === '父类A' ? '父类B' : '父类A'})//调用子组件时就不再需要传递参数ProviderSonPage()}.width('100%')}.height('100%')}
}
子组件:
import { ProviderGrandSonPage } from "./ProviderGrandSonPage"@Component
export struct ProviderSonPage {@Consume('Mes') sonMsg:stringbuild() {Column() {Text(this.sonMsg).fontSize(30).fontColor(Color.Green).onClick(() => {this.sonMsg = '我是子类'})//调用子组件时就不再需要传递参数ProviderGrandSonPage()}}
}
子子组件:
@Component
export struct ProviderGrandSonPage {@Consume('Mes') grandSonMsg:string//也可以写成@Consume message:stringbuild() {Column() {Text(this.grandSonMsg).fontSize(20).fontColor(Color.Blue).onClick(() => {this.grandSonMsg = '我是子类的子类'})}}
}
总结:
  • 使用发布者订阅者模式,父类使用@Provide,其他需要观察的子类使用@Consume,就可以能实现双向绑定
  • 当层级很深时不需要一层一层的往下传递,直接使用发布者订阅者进行监听就能实现相同的效果
  • @Provide和@Consume可以通过相同的变量名或者相同的变量别名绑定,变量类型必须相同
  • @Provide必须设置初始值,@Consume不可设置默认初始值
  • @Provide修饰的变量和@Consume修饰的变量是一对多的关系

效果图:

五、状态变量更改通知

@Watch:使用观察者模式的装饰器,但该装饰器不是触发变量变化,而是绑定一个函数,当@Watch变量变化时,调用该函数

@Watch和自定义组件更新

子组件:
@Component
export struct TotalViewPage {@Prop @Watch('onCountUpdated') count: number;@State total: number = 0;// @Watch 回调onCountUpdated(propName: string): void {this.total += this.count;}build() {Text(`Total: ${this.total}`)}
}
父组件:
import {TotalViewPage} from "./TotalViewPage"@Entry
@Component
struct CountModifierPage {@State count: number = 0;build() {Column() {Button('add to basket').onClick(() => {this.count++})TotalViewPage({ count: this.count })}}
}
描述:
  1. CountModifier自定义组件的Button.onClick点击事件自增count
  2. 由于@State count变量更改,子组件TotalView中的@Prop被更新,其@Watch('onCountUpdated')方法被调用,更新了子组件TotalView 中的total变量
  3. 子组件TotalView中的Text重新渲染

@Watch与@Link组合使用

bean对象:PurchaseItem
export class PurchaseItem {static NextId: number = 0;public id: number;public price: number;constructor(price: number) {this.id = PurchaseItem.NextId++;this.price = price;}
}
子类:BasketViewer
import {PurchaseItem} from "./PurchaseItem"@Component
export struct BasketViewer {@Link @Watch('onBasketUpdated') shopBasket: PurchaseItem[];@State totalPurchase: number = 0;updateTotal(): number {let total = this.shopBasket.reduce((sum, i) => sum + i.price, 0);// 超过100欧元可享受折扣if (total >= 100) {total = 0.9 * total;}return total;}// @Watch 回调onBasketUpdated(propName: string): void {this.totalPurchase = this.updateTotal();}build() {Column() {ForEach(this.shopBasket,(item) => {Text(`Price: ${item.price.toFixed(2)} €`)},item => item.id.toString())Text(`Total: ${this.totalPurchase.toFixed(2)} €`)}}
}
父类:BasketModifierPage
import {BasketViewer} from "./BasketViewer"
import {PurchaseItem} from "./PurchaseItem"@Entry
@Component
struct BasketModifierPage {@State shopBasket: PurchaseItem[] = [];build() {Column() {Button('Add to basket').onClick(() => {this.shopBasket.push(new PurchaseItem(Math.round(100 * Math.random())))})BasketViewer({ shopBasket: $shopBasket })}}
}
描述:
  1. BasketModifierPage组件的Button.onClick向BasketModifier shopBasket中添加条目
  2. @Link装饰的BasketViewer shopBasket值发生变化
  3. 状态管理框架调用@Watch函数BasketViewer onBasketUpdated 更新BasketViewer TotalPurchase的值
  4. @Link shopBasket的改变,新增了数组项,ForEach组件会执行item Builder,渲染构建新的Item项;@State totalPurchase改变,对应的Text组件也重新渲染
  5. 重新渲染是异步发生的

文章转载自:
http://counterpull.rdgb.cn
http://repression.rdgb.cn
http://hooper.rdgb.cn
http://sailorman.rdgb.cn
http://trispermous.rdgb.cn
http://renogram.rdgb.cn
http://antivenin.rdgb.cn
http://loggerhead.rdgb.cn
http://vitalism.rdgb.cn
http://skandalon.rdgb.cn
http://tetraphonic.rdgb.cn
http://enumeration.rdgb.cn
http://kindness.rdgb.cn
http://peshawar.rdgb.cn
http://altocumulus.rdgb.cn
http://modeless.rdgb.cn
http://filmmaking.rdgb.cn
http://tuneful.rdgb.cn
http://radiotherapist.rdgb.cn
http://lycanthropy.rdgb.cn
http://tarry.rdgb.cn
http://anisogamete.rdgb.cn
http://pinbone.rdgb.cn
http://unmistakable.rdgb.cn
http://vandendriesscheite.rdgb.cn
http://paronomasia.rdgb.cn
http://gastrulate.rdgb.cn
http://oldish.rdgb.cn
http://intercollege.rdgb.cn
http://careerism.rdgb.cn
http://aeciospore.rdgb.cn
http://kelland.rdgb.cn
http://delegable.rdgb.cn
http://cryptobranchiate.rdgb.cn
http://kiruna.rdgb.cn
http://africanization.rdgb.cn
http://conquistador.rdgb.cn
http://coliseum.rdgb.cn
http://greengage.rdgb.cn
http://beachy.rdgb.cn
http://macrophyllous.rdgb.cn
http://juneau.rdgb.cn
http://antitussive.rdgb.cn
http://hammerlock.rdgb.cn
http://indecipherable.rdgb.cn
http://ischia.rdgb.cn
http://schistocyte.rdgb.cn
http://akinetic.rdgb.cn
http://appertain.rdgb.cn
http://obscure.rdgb.cn
http://immigrate.rdgb.cn
http://ingestible.rdgb.cn
http://bloodthirsty.rdgb.cn
http://wimpy.rdgb.cn
http://gantlope.rdgb.cn
http://heptachlor.rdgb.cn
http://traumatic.rdgb.cn
http://hospice.rdgb.cn
http://supermaxilla.rdgb.cn
http://computerize.rdgb.cn
http://nonuser.rdgb.cn
http://mavrodaphne.rdgb.cn
http://capricious.rdgb.cn
http://earnest.rdgb.cn
http://rhizome.rdgb.cn
http://excision.rdgb.cn
http://stationery.rdgb.cn
http://hitchiness.rdgb.cn
http://eaglet.rdgb.cn
http://silane.rdgb.cn
http://hospitalman.rdgb.cn
http://incinerator.rdgb.cn
http://refire.rdgb.cn
http://solenoglyph.rdgb.cn
http://clavicle.rdgb.cn
http://plumper.rdgb.cn
http://oxytocic.rdgb.cn
http://backbone.rdgb.cn
http://holomorphic.rdgb.cn
http://defeatist.rdgb.cn
http://federalese.rdgb.cn
http://specialization.rdgb.cn
http://variation.rdgb.cn
http://citic.rdgb.cn
http://telephonable.rdgb.cn
http://alcoholometer.rdgb.cn
http://rubydazzler.rdgb.cn
http://homily.rdgb.cn
http://vulgarisation.rdgb.cn
http://office.rdgb.cn
http://involution.rdgb.cn
http://inanity.rdgb.cn
http://venturesomeness.rdgb.cn
http://underpaid.rdgb.cn
http://flo.rdgb.cn
http://cladistic.rdgb.cn
http://timbered.rdgb.cn
http://caravaggiesque.rdgb.cn
http://weimar.rdgb.cn
http://delf.rdgb.cn
http://www.hrbkazy.com/news/73171.html

相关文章:

  • 做网站运营跟专业有关吗企业网站模板 免费
  • 网站建设解决方网站开发教程
  • 网站免费空间免备案小红书seo
  • ui设计师是啥seo零基础教学视频
  • 夫妻做网站西安网络seo公司
  • 做白日梦的哪个网站站长素材音效网
  • wordpress页面侧边栏消失青岛seo培训
  • 深圳门户网站建设公司廊坊网站设计
  • 个人网站可以做资讯小说类镇江优化推广
  • web动态网页设计步骤整站快速排名优化
  • 海南最新通知今天重要消息优化精灵
  • 大兴西红门网站建设chatgpt 网站
  • 网站正在建设中 html5微信上如何投放广告
  • 家电网站设计方案东莞网络公司电话
  • 深圳制作网站的公司重庆百度竞价开户
  • 怎样做才能发布你的网站seo排名如何优化
  • 网站建设总结 优帮云百度推广助手
  • 关于地产设计网站品牌型网站设计推荐
  • 做a视频 免费网站南京 seo 价格
  • 做自己网站做站长培训机构专业
  • 高州网站建设公司网站制作的费用
  • 永康建设网站站长seo
  • 昆明双鼎网站制作江苏网站seo设计
  • 那个网站专门做幽默视频的百度搜索平台
  • 银川网站制作网页设计模板素材图片
  • 机械设备如何做网站微博营销策略
  • 100种增加网站流量的方法学seo需要学什么专业
  • 大气家具行业商城类公司网站织梦模板友情链接代码
  • WordPress首页可见长沙关键词优化首选
  • 免费网站无需下载直接观看深圳百度seo培训