当前位置:   article > 正文

学习鸿蒙基础(6)

学习鸿蒙基础(6)

一、@Prop属性 父——>子 单向同步
@Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装饰的变量是可变的,但是变化不会同步回其父组件。@Prop装饰的变量和父组件建立单向的同步关系。@Prop变量允许在本地修改,但修改后的变化不会同步回父组件。当父组件中的数据源更改时,与之相关的@Prop装饰的变量都会自动更新。如果子组件已经在本地修改了@Prop装饰的相关变量值,而在父组件中对应的@State装饰的变量被修改后,子组件本地修改的@Prop装饰的相关变量值将被覆盖。

注意:
@Prop变量装饰器允许装饰的变量类型只有:string、number、boolean、enum类型 

二、@Link属性  父——>子 双向同步
子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定@Link变量装饰器说明允许装饰的变量类型Object、class、string、number、boolean、enum类型,以及这些类型的数组。类型必须被指定,且和双向绑定状态变量的类型相同。不支持any,不支持简单类型和复杂类型的联合类型,不允许使用undefined和null。不支持Length、ResourceStr、ResourceColor类型,Length、ResourceStr、ResourceColor为简单类型和复杂类型的联合类型。
被装饰变量的初始值:无。

  1. @Entry
  2. @Component
  3. struct PageLink {
  4. @State message: string = 'Hello World'
  5. @State isShow:boolean =false
  6. build() {
  7. Row() {
  8. Column() {
  9. nav({isShow:$isShow})
  10. if(this.isShow){
  11. textrr()
  12. }
  13. }
  14. .height('100%')
  15. }
  16. }
  17. }
  18. @Component
  19. struct nav{
  20. @Link isShow:boolean
  21. build(){
  22. Row(){
  23. Button("show").onClick(v=>{
  24. this.isShow=!this.isShow
  25. }).margin(20)
  26. }
  27. }
  28. }
  29. @Component
  30. struct textrr{
  31. build(){
  32. Row(){
  33. Text("你好").margin(60)
  34. }
  35. }
  36. }

三、嵌套类对象属性变化
@ObiectLink变量装饰器和@Observed类装饰器用于在涉及嵌套对象或数组的场景中进行双向数据同步。被@observed装饰的类,可以被观察到属性的变化。
子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被@Observed装饰的项,或者是class obiect中的属性,这个属性同样也需要被@observed装饰。。单独使用@Observed是没有任何作用的,需要搭配@obiectLink或者@Prop使用
@Observed类装饰器:装饰class。需要放在class的定义前,使用new创建类对象
@ObiectLink变量装饰器:不与父组件中的任何类型同步变量。
允许装饰的变量类型:必须为被@Observed装饰的class实例,必须指定类型。不支持简单类型,可以使用@Prop。@ObiectLink的属性是可以改变的,但是变量的分配是不允许的,也就是说这个装。饰器装饰变量是只读的,不能被改变。

  1. import myList from '../components/myListObserved'
  2. import Item from '../model/ItemFlag'
  3. @Entry
  4. @Component
  5. struct PageObserved {
  6. @State text: string = ''
  7. @State list: Item [] = [
  8. new Item(Date.now(), "房子"),
  9. new Item(Date.now(), "车子")
  10. ]
  11. build() {
  12. Row() {
  13. Column() {
  14. Row(){
  15. CheckboxGroup({group:"checkBoxGroup"})
  16. Text("全选")
  17. Button("删除").onClick(v=>{
  18. this.list=this.list.filter(v=>!v.isChecked)
  19. }).margin({left:"20"}).backgroundColor(Color.Red)
  20. }.width("100%").margin({top:"10",left:'20'})
  21. Row() {
  22. TextInput({ text: this.text }).width(250).onChange((value) => {
  23. this.text = value
  24. })
  25. Button("增加").onClick(() => {
  26. this.list.push(new Item(Date.now(), this.text))
  27. this.text = ""
  28. }).margin(10)
  29. }.width("100%").justifyContent(FlexAlign.SpaceBetween).margin(10)
  30. List() {
  31. ForEach(this.list, (item, index) => {
  32. ListItem() {
  33. myList({ item, index, list: this.list})
  34. }.margin(10)
  35. })
  36. }.layoutWeight(1).divider({
  37. strokeWidth: 1,
  38. color: Color.Blue,
  39. startMargin: 10,
  40. endMargin: 10
  41. })
  42. .width('100%')
  43. }
  44. }
  45. .height('100%')
  46. }
  47. }
  1. import Item from '../model/ItemFlag';
  2. //自定义组件 组件与组件之间是隔离的
  3. @Component
  4. struct myListObserved {
  5. @ObjectLink item: Item;
  6. private index: number;
  7. private list: Item [];
  8. build() {
  9. Row() {
  10. Checkbox({group:"checkBoxGroup"}).select(this.item.isChecked).onChange(v=>{
  11. this.item.isChecked=v
  12. console.log(JSON.stringify(this.item))
  13. })
  14. Text(this.item.text).fontSize(20).decoration(
  15. {type:this.item.isChecked?TextDecorationType.Underline:TextDecorationType.None,
  16. color:Color.Blue}
  17. )
  18. Button("删除").backgroundColor(Color.Red).onClick(() => {
  19. this.list.splice(this.index, 1)
  20. })
  21. }.justifyContent(FlexAlign.SpaceBetween).width("100%")
  22. }
  23. }
  24. export default myListObserved
  1. @Observed class ItemFlag {
  2. id: number;
  3. text: string;
  4. isChecked:boolean;
  5. constructor(id: number, text: string,isChecked=false) {
  6. this.id = id
  7. this.text = text
  8. this.isChecked=isChecked
  9. }
  10. }
  11. export default ItemFlag

四、与后代组件双向同步
@Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,@Provide和@Consume摆脱参数传递机制的束缚,实现跨层级传递。
其中@Provide装饰的变量是在祖先节点中,可以理解为被”提供”给后代的状态变量。@Consume装饰的变量是在后代组件中,去”消费(绑定)”祖先节点提供的变量。

1.装饰器参数:别名:常量字符串,可选。如果指定了别名,则通过别名来绑定变量,如果未指定别名,则通过变量名绑定变量。
2.同步类型:双向同步。从@Provide变量到所有@Consume变量以及相反的方向的数据同步。双向同步的操作与@State和@Link的组合相同。
3.允许装饰的变量类:Object、class、string、number、boolean、enum类型,以及这些类型的数组。不支持any.不支持简单类型和复杂类型的联合类型,不允许使用undefined和null。必须指定类型@Provide变量的@Consume变量的类型必须相同。说明不支持Length、ResourceStr、ResourceColor类型,Length、ResourceStr、ResourceColor为简单类型和复杂类型的联合类。

  1. @Entry
  2. @Component
  3. struct PageProvide {
  4. @Provide('msg') message: string = 'Hello World'
  5. build() {
  6. Row() {
  7. Column() {
  8. Text("爷爷"+this.message)
  9. .fontSize(50)
  10. .fontWeight(FontWeight.Bold)
  11. Fahter()
  12. }
  13. .width('100%')
  14. }
  15. .height('100%')
  16. }
  17. }
  18. @Component
  19. struct Fahter{
  20. @Consume message:string
  21. build(){
  22. Column(){
  23. Text("爸爸"+this.message).fontSize(50)
  24. .fontWeight(FontWeight.Bold)
  25. Son()
  26. }
  27. }
  28. }
  29. @Component
  30. struct Son{
  31. @Consume msg:string
  32. message:string ="nn"
  33. build(){
  34. Column(){
  35. Text("儿子"+this.msg).fontSize(50)
  36. .fontWeight(FontWeight.Bold)
  37. Button("gaibian").onClick(v=>{
  38. this.msg="love world"
  39. })
  40. }
  41. }
  42. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/164534
推荐阅读
相关标签
  

闽ICP备14008679号