从零开始学Hm(三)状态管理

状态管理

state 驱动试图更新的数据(被装饰器标记的变量)被标注的数据更新时会执行build中的函数

view 基于UI描述渲染得到的用户界面

视图通过互动事件可以修改状态,状态触发后渲染视图

@State

标记的变量必须初始化,不能是空值

不支持复杂数据类型 any 嵌套类型,数组存储的对象中的属性发生变化 都不会触发视图更新

隔代不会触发试图刷新

@Prop和@Link

因为@State装饰器,父组件引用子组件(子组件再引用子组件)的时候当父组件发生数据变更的时候需要通知子组件,实现不了同步更新 所以需要@Prop和@Link

这俩修饰的变量都不能进行初始化,而且不能被@Entry修饰

@Prop

单向同步 父组件同步数据到子组件 但是子组件数据发生改变之后不能同步给父组件 拷贝给子组件

只能传递string number boolean enum

不能是数组 any 对象,可以是对象的属性

@Link

双向同步,父子组件修改数据之后可以互相传递

传递的是数据的引用

要求父子类型一致 可以传递对象

@Providc和@Consume

可以实现隔代传递数据的双向绑定

注意

儿子需要改变传递的数据用link 只是渲染就用prop

使用@Link传递时因为传递的是数据的引用 所有不能直接用this.变量

需要使用**$变量**

taskList({totalTask:$totalTask,finishTask:$finishTask})
@ObjectLink和@Observed

解决嵌套对象和数组元素为对象时 被嵌套的对象属性发生改变的时候不能触发页面刷新

@Observed需要加在嵌套类和被嵌套类的上面

@ObjectLink用在引用被嵌套类时 不能加@Entry 不能初始化

对象数组中的对象必须是new出来的?

方法传递

子组件调用父组件的方法

方法在另一个组件内部,不能抽过来的时候,可以通过将方法作为参数进行传递

changeTask:()=>void

方法作为参数传递的时候,方法中的this可能已经发生改变了

it({ item:item ,changeTask:this.changeTask.bind(this)})

在方法传递的时候加上.bind传入this 此时这个this就是传之前的this

数据同步

父组件更新数据之后传递给子组件以及子组件的子组件

注意

父组件的@State变量不能传给子组件一样的@State组件,但是此时子组件不知道父组件数据发生更新。需要使用@Prop和@Link装饰器

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值