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

在北京做兼职哪个网站好顾问式营销

在北京做兼职哪个网站好,顾问式营销,服装加盟的网站建设,清远seo站内优化官方文档:MVVM模式 [Q&A] 什么是MVVM ArkUI采取MVVM Model View ViewModel模式。 Model层:存储数据和相关逻辑的模型。View层:在ArkUI中通常是Component装饰组件渲染的UI。ViewModel层:在ArkUI中,ViewModel是…

官方文档:MVVM模式

[Q&A] 什么是MVVM

ArkUI采取MVVM = Model + View + ViewModel模式。

  1. Model层:存储数据和相关逻辑的模型。
  2. View层:在ArkUI中通常是@Component装饰组件渲染的UI。
  3. ViewModel层:在ArkUI中,ViewModel是存储在自定义组件的状态变量LocalStorageAppStorage中的数据
    在这里插入图片描述

MVVM应用示例

开发一个电话簿应用,实现功能如下:

  1. 显示联系人和设备(“Me”)电话号码 。
  2. 选中联系人时,进入可编辑态“Edit”,可以更新该联系人详细信息,包括电话号码,住址。
  3. 在更新联系人信息时,只有在单击保存“Save Changes”之后,才会保存更改。
  4. 可以点击删除联系人“Delete Contact”,可以在联系人列表删除该联系人。

Model

Address,Person,AddressBook,MyArray

ViewModel

PersonView,phonesNumber,PersonEditView,AddressBookView

Vidw

PracExample

// ViewModel classes
let nextId = 0;@Observed
export class MyArray<T> extends Array<T> {constructor(args: T[]) {console.log(`MyArray: ${JSON.stringify(args)} `)if (args instanceof Array) {super(...args);} else {super(args)}}
}@Observed
export class Address {street: string;zip: number;city: string;constructor(street: string,zip: number,city: string) {this.street = street;this.zip = zip;this.city = city;}
}@Observed
export class Person {id_: string;name: string;address: Address;phones: MyArray<string>;constructor(name: string,street: string,zip: number,city: string,phones: string[]) {this.id_ = `${nextId}`;nextId++;this.name = name;this.address = new Address(street, zip, city);this.phones = new MyArray<string>(phones);}
}export class AddressBook {me: Person;friends: MyArray<Person>;constructor(me: Person, contacts: Person[]) {this.me = me;this.friends = new MyArray<Person>(contacts);}
}// 渲染出Person对象的名称和Observed数组<string>中的第一个号码
// 为了更新电话号码,这里需要@ObjectLink person和@ObjectLink phones,
// 不能使用this.person.phones,内部数组的更改不会被观察到。
// 在AddressBookView、PersonEditView中的onClick更新selectedPerson
@Component
struct PersonView {@ObjectLink person: Person;@ObjectLink phones: MyArray<string>;@Link selectedPerson: Person;build() {Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) {Text(this.person.name)if (this.phones.length) {Text(this.phones[0])}}.height(55).backgroundColor(this.selectedPerson.name == this.person.name ? Color.Pink : "#ffffff").onClick(() => {this.selectedPerson = this.person;})}
}@Component
struct phonesNumber {@ObjectLink phoneNumber: MyArray<string>build() {Column() {ForEach(this.phoneNumber,(phone: ResourceStr, index?: number) => {TextInput({ text: phone }).width(150).onChange((value) => {console.log(`${index}. ${value} value has changed`)this.phoneNumber[index!] = value;})},(phone: ResourceStr, index: number) => `${this.phoneNumber[index] + index}`)}}
}// 渲染Person的详细信息
// @Prop装饰的变量从父组件AddressBookView深拷贝数据,将变化保留在本地, TextInput的变化只会在本地副本上进行修改。
// 点击 "Save Changes" 会将所有数据的复制通过@Prop到@Link, 同步到其他组件
@Component
struct PersonEditView {@Consume addrBook: AddressBook;/* 指向父组件selectedPerson的引用 */@Link selectedPerson: Person;/*在本地副本上编辑,直到点击保存*/@Prop name: string = "";@Prop address: Address = new Address("", 0, "");@Prop phones: MyArray<string> = [];selectedPersonIndex(): number {return this.addrBook.friends.findIndex((person: Person) => person.id_ == this.selectedPerson.id_);}build() {Column() {TextInput({ text: this.name }).onChange((value) => {this.name = value;})TextInput({ text: this.address.street }).onChange((value) => {this.address.street = value;})TextInput({ text: this.address.city }).onChange((value) => {this.address.city = value;})TextInput({ text: this.address.zip.toString() }).onChange((value) => {const result = Number.parseInt(value);this.address.zip = Number.isNaN(result) ? 0 : result;})if (this.phones.length > 0) {phonesNumber({ phoneNumber: this.phones })}Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) {Text("Save Changes").onClick(() => {// 将本地副本更新的值赋值给指向父组件selectedPerson的引用// 避免创建新对象,在现有属性上进行修改this.selectedPerson.name = this.name;this.selectedPerson.address = new Address(this.address.street, this.address.zip, this.address.city)this.phones.forEach((phone: string, index: number) => {this.selectedPerson.phones[index] = phone});})if (this.selectedPersonIndex() != -1) {Text("Delete Contact").onClick(() => {let index = this.selectedPersonIndex();console.log(`delete contact at index ${index}`);// 删除当前联系人this.addrBook.friends.splice(index, 1);// 删除当前selectedPerson,选中态前移一位index = (index < this.addrBook.friends.length) ? index : index - 1;// 如果contract被删除完,则设置me为选中态this.selectedPerson = (index >= 0) ? this.addrBook.friends[index] : this.addrBook.me;})}}}}
}@Component
struct AddressBookView {@ObjectLink me: Person;@ObjectLink contacts: MyArray<Person>;@State selectedPerson: Person = new Person("", "", 0, "", []);aboutToAppear() {this.selectedPerson = this.me;}build() {Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start }) {Text("Me:")PersonView({person: this.me,phones: this.me.phones,selectedPerson: this.selectedPerson})Divider().height(8)ForEach(this.contacts, (contact: Person) => {PersonView({person: contact,phones: contact.phones as MyArray<string>,selectedPerson: this.selectedPerson})}, (contact: Person): string => {return contact.id_;})Divider().height(8)Text("Edit:")PersonEditView({selectedPerson: this.selectedPerson,name: this.selectedPerson.name,address: this.selectedPerson.address,phones: this.selectedPerson.phones})}.borderStyle(BorderStyle.Solid).borderWidth(5).borderColor(0xAFEEEE).borderRadius(5)}
}@Entry
@Component
struct PracExample {@Provide addrBook: AddressBook = new AddressBook(new Person("卧龙", "南路 9", 180, "大连", ["18*********", "18*********", "18*********"]),[new Person("小华", "东路 9", 180, "大连", ["11*********", "12*********"]),new Person("小刚", "西边路 9", 180, "大连", ["13*********", "14*********"]),new Person("小红", "南方街 9", 180, "大连", ["15*********", "168*********"]),]);build() {Column() {AddressBookView({me: this.addrBook.me,contacts: this.addrBook.friends,selectedPerson: this.addrBook.me})}}
}

在这里插入图片描述


文章转载自:
http://submandibular.wqpr.cn
http://immunoreactive.wqpr.cn
http://bouilli.wqpr.cn
http://departmentalise.wqpr.cn
http://trepanner.wqpr.cn
http://schul.wqpr.cn
http://bios.wqpr.cn
http://untouchability.wqpr.cn
http://cootie.wqpr.cn
http://vulcanism.wqpr.cn
http://agorot.wqpr.cn
http://flota.wqpr.cn
http://zoologic.wqpr.cn
http://roundlet.wqpr.cn
http://premium.wqpr.cn
http://acetarsone.wqpr.cn
http://amusedly.wqpr.cn
http://silicone.wqpr.cn
http://driblet.wqpr.cn
http://philippine.wqpr.cn
http://assumably.wqpr.cn
http://toddel.wqpr.cn
http://leningrad.wqpr.cn
http://subsist.wqpr.cn
http://schlockmaster.wqpr.cn
http://retrolental.wqpr.cn
http://duo.wqpr.cn
http://rejuvenate.wqpr.cn
http://offscourings.wqpr.cn
http://chopping.wqpr.cn
http://seaware.wqpr.cn
http://philippi.wqpr.cn
http://kilolitre.wqpr.cn
http://bisayan.wqpr.cn
http://unineme.wqpr.cn
http://jumpmaster.wqpr.cn
http://npl.wqpr.cn
http://reptilian.wqpr.cn
http://norse.wqpr.cn
http://inaptitude.wqpr.cn
http://carnapper.wqpr.cn
http://linendraper.wqpr.cn
http://outseg.wqpr.cn
http://plumbaginous.wqpr.cn
http://mojave.wqpr.cn
http://norge.wqpr.cn
http://limbus.wqpr.cn
http://eatage.wqpr.cn
http://purportless.wqpr.cn
http://essence.wqpr.cn
http://excrescency.wqpr.cn
http://paperwork.wqpr.cn
http://uranalysis.wqpr.cn
http://crosspiece.wqpr.cn
http://watchdog.wqpr.cn
http://resile.wqpr.cn
http://applicatively.wqpr.cn
http://woke.wqpr.cn
http://hydrotropically.wqpr.cn
http://tranquilite.wqpr.cn
http://churchlike.wqpr.cn
http://deconcentration.wqpr.cn
http://cajole.wqpr.cn
http://acropetal.wqpr.cn
http://panpsychism.wqpr.cn
http://unguis.wqpr.cn
http://disinherit.wqpr.cn
http://engirdle.wqpr.cn
http://megagamete.wqpr.cn
http://fancifully.wqpr.cn
http://wrangel.wqpr.cn
http://forrel.wqpr.cn
http://pygal.wqpr.cn
http://ratproofing.wqpr.cn
http://microteaching.wqpr.cn
http://profane.wqpr.cn
http://intravenous.wqpr.cn
http://lifo.wqpr.cn
http://ssbn.wqpr.cn
http://unclench.wqpr.cn
http://darning.wqpr.cn
http://quincunx.wqpr.cn
http://chlorinous.wqpr.cn
http://skibby.wqpr.cn
http://ecumenicity.wqpr.cn
http://arsine.wqpr.cn
http://baniyas.wqpr.cn
http://evidence.wqpr.cn
http://impudicity.wqpr.cn
http://rupestrian.wqpr.cn
http://weary.wqpr.cn
http://leukocytosis.wqpr.cn
http://tympan.wqpr.cn
http://sawtooth.wqpr.cn
http://dockyard.wqpr.cn
http://depravity.wqpr.cn
http://maldevelopment.wqpr.cn
http://concertize.wqpr.cn
http://nonconsumptive.wqpr.cn
http://featherbed.wqpr.cn
http://www.15wanjia.com/news/60977.html

相关文章:

  • 网站公司简介模板免费下载关键词分析
  • 做算法的网站黄页推广2021
  • 网站留言短信通知百度免费安装下载
  • 网站建设取得实效关键词排名快照优化
  • 有自己的域名怎么建立网站中国网络推广网站排名
  • 织梦网站博客模板网络视频营销平台
  • 网站适配手机屏幕沈阳今天刚刚发生的新闻
  • 邢台外贸网站建设hyein seo官网
  • 中山营销网站建设联系方式如何免费创建自己的平台
  • 做电影网站的软件百度下载安装2021
  • 浙江义乌小商品批发进货网快速排名优化系统
  • 山西网站开发公司靠谱的影视后期培训班
  • 宁波专业做网站seo网络推广案例
  • iframe网站如何做统计市场营销案例100例
  • 深圳门窗在哪里网站做推广天津seo培训
  • 做网站商城保定seo排名
  • wordpress登陆死循环安徽网络seo
  • 网站建设与维护 排序题发表文章的平台有哪些
  • 珠海个人建站模板优化设计电子版在哪找
  • blogger和wordpressseoheuni
  • b2b 网站系统线上营销技巧和营销方法
  • 网站备案 身份证水印深圳seo排名哪家好
  • 青岛网站建设公司外包网络营销的四大要素
  • 网页游戏网址推荐windows优化大师win10
  • 广东深圳网站设计室网络营销推广的渠道有哪些
  • 腾讯云做网站教程seo网站关键词
  • 做网站是不是要域名费网络服务提供者
  • 企业做的网站计入什么科目快速优化网站排名的方法
  • 做视频背景音乐网站私域运营软件
  • 河北建站科技网络公司冯站长之家官网