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

站在Vue的角度,对比鸿蒙开发中的状态管理

开局一张图  内容全靠手搓

看到图片没:State就是状态的意思   UI就是页面的意思  研究的就是数据变了页面变

事件驱动和数据驱动的区别

所以又找了两张图

看到虚拟DOM的都是数据驱动 (这个虚拟DOM 就会产生diff算法,面试也喜欢问,其实没啥用)

看到事件触发 事件队列的都是事件驱动

事件驱动代码实操一个例子


<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="box"></div><button id="btn">点击</button>
</body>
<script>let  box = document.getElementById("box")let  btn = document.getElementById("btn")btn.onclick = function(){box.innerHTML = "我是大雷神"}</script></html>

点击按钮  触发事件,  事件找到box元素,找到以后就可以修改里面的内容,就是一个典型的事件驱动

热身结束

先创建一个vue的项目 用的是最新的Vite

npm create vue@latest

如果vite构建项目不会,可以看这个学习文档 Vite构建项目

数据的声明和使用

vue中声明响应式数据
<template><div>数据 {{ num }}<button @click="change">修改</button></div>
</template><script setup lang="ts">
import  {ref,reactive,toRefs,toRef,shallowRef,shallowReactive,customRef} from  "vue" let  num  = ref<number>(10);//声明let change = ()=>{num.value++
}</script>

解释一下

就可以做到数据改变  页面效果跟着变

来个面试题

import  {ref,reactive,toRefs,toRef,shallowRef,shallowReactive,customRef} from  "vue" 


这里引入的这些都是啥区别

鸿蒙中声明响应式数据
@Entry
@Component
struct Myvue {@State  num:number = 10;build() {Column() {Text(`${this.num}`)Button("修改").onClick(()=>{this.num++;})}.height('100%').width('100%')}
}

代码解析

1:声明的内容需要写在Build前  2:声明需要使用 @State   

 3:变量需要有类型    4:修改的时候需要带this

vue中声明非响应式数据

修改代码  请问点击按钮n会变吗?

<template><div>数据 {{ num }} 和 {{ n }}<button @click="change">修改</button></div>
</template><script setup lang="ts">
import  {ref,reactive,toRefs,toRef,shallowRef,shallowReactive,customRef} from  "vue" let  num  = ref<number>(10);//声明let n = 666;let change = ()=>{num.value++n++;console.log(n);
}</script>

答案是点击以后 n和num在页面都更新

点两下的结果

这么看的话,n是不是也是响应式数据????  n肯定不是响应式数据 ,只要注释掉一行代码即可

为什么?  (用最新版本的Vue3哈,别用老的)留给会Vue的大哥们  在评论区回答吧

鸿蒙中声明非响应式数据

@Entry
@Component
struct Myvue {@State  num:number = 10;private   n:number = 999;//非响应式数据  build() {Column() {Text(`${this.num}`)Text(`${this.n}`)Button("修改").onClick(()=>{this.num++;this.n++;})}.height('100%').width('100%')}
}

vue中嵌套数据的响应式

先声明数据

<template><div>{{ info.data.num }}<button @click="change">修改数据</button></div>
</template><script setup lang="ts">
import  {ref,reactive,toRefs,toRef,shallowRef,shallowReactive,customRef} from  "vue" let  info  = ref({ //嵌套数据data:{num:10}})
let change = ()=>{info.value.data.num++;
}</script>

没有任何问题  数据变页面变化

鸿蒙中嵌套数据的响应式
interface dataModel{num:number
}@Entry
@Component
struct Myvue {@State  info:infoModel = {data:{num:10}}build() {Column() {Text("数据为"+this.info.data.num)Button("修改").onClick(()=>{this.info.data.num++;})}.height('100%').width('100%')}
}

代码解析

发现在鸿蒙中不能像Vue那样直接修改嵌套数据  直接修改的数据页面不会更新 

解决方法直接更新对象 其实这个问题在Vue2中也存在,只是后来更新了,因此还有面试题问Vue2和Vue3中数据更新的问题和原理

这样修改就可以了,这是鸿蒙第一版的问题,现在推荐使用V2的状态管理来做

鸿蒙中V2的状态管理

鸿蒙中V2的状态管理文档

未完待续,下一篇接着讲 这种数据在页面的显示

鸿蒙官方学习地址

http://www.lryc.cn/news/613543.html

相关文章:

  • Casrel关系抽取
  • vue3 el-select 加载触发
  • AI绘画:生成唐初李世民全身像提示词
  • 【unity实战】使用Unity程序化生成3D随机地牢(附项目源码)
  • 8.3.1 注册服务中心Etcd
  • 【感知机】感知机(perceptron)学习算法的对偶形式
  • Java包装类详解与应用指南
  • Caffeine 三种过期策略详解
  • Day 6: CNN卷积神经网络 - 计算机视觉的核心引擎
  • MCU中的USB
  • 论文解读:单个标点符号如何欺骗LLM,攻破AI评判系统
  • Linux总线,设备和驱动关系以及匹配机制解析
  • vue打包号的文件如何快速查找文件打包后的位置
  • Redis 编译错误:缺少静态库文件,如何解决?
  • 在NVIDIA Orin上用TensorRT对YOLO12进行多路加速并行推理时内存泄漏 (中)
  • PoE延长器——突破网络距离限制
  • 数据赋能(386)——数据挖掘——迭代过程
  • PyCharm 图标 c、m、f、F、v、p 的含义
  • 科技云报到:热链路革命:阿卡 CRM 的 GTM 定位突围
  • 健永科技工位RFID读卡器实现生产流水线物料跟踪与柔性化升级
  • 美食广场: 城市胃的便利店
  • MySQL UNION 操作符详细说明
  • 如何在GPU上安装使用Docker
  • SupChains团队:订单生产型供应链销量预测建模案例分享(六)
  • 容器之王--Docker的部署及基本操作演练
  • vLLM:彻底改变大型语言模型推理延迟和吞吐量
  • Aurora MySQL 8.0 性能分析账号创建完整指南
  • 神经网络入门指南:从零理解 PyTorch 的核心思想
  • 跨境电商增长突围:多维变局下的战略重构与技术赋能
  • 从“数字网格”到“空中交警” :星图低空云如何重构低空管理?