当前位置: 首页 > 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.dtcms.com/a/319251.html

相关文章:

  • 机器学习工程化 3.0:从“实验科学”到“持续交付”的 7 个关卡
  • 淘宝商品价格数据采集||淘宝SKU价格数据采集API
  • 从配置到远程访问:如何用群晖NAS FTP+ Cpolar搭建稳定文件传输通道
  • Charles中文版抓包工具使用指南 提高API调试和网络优化效率
  • 通信中间件 Fast DDS(一) :编译、安装和测试
  • rk3588s vscode索引失败的问题
  • Numpy科学计算与数据分析:Numpy随机数生成入门
  • Numpy科学计算与数据分析:Numpy数据分析基础之统计函数应用
  • 【线性代数】5特征值和特征向量
  • Android 原生与 Flutter 通信完整实现 (Kotlin 版)
  • C++基础:继承
  • qt系统--事件
  • 设计模式中的行为模式
  • sqli-labs-master/Less-41~Less-50
  • 论文Review 激光实时动态物体剔除 DUFOMap | KTH出品!RAL2024!| 不上感知,激光的动态物体在线剔除还能有什么方法?
  • DrissionPage自动化:高效Web操作新选择
  • 【人工智能99问】NLP(自然语言处理)大模型有哪些?(20/99)
  • 【多重BFS】Monsters
  • 调用阿里云-阿里云百炼 AI
  • 表驱动法-灵活编程范式
  • Java 中 Object 类的解析:知识点与注意事项
  • Oracle参数Process
  • 深度学习的视觉惯性里程计(VIO)算法优化实践
  • PCB制造中压接孔、插接孔、沉头孔、台阶孔的区别及生产流程
  • [Oracle] MOD()函数
  • 数据库入门:从零开始构建你的第一个数据库
  • idea工具maven下载报错:PKIX path building failed,配置忽略SSL检查
  • [Oracle] CEIL()函数
  • 无人机航拍数据集|第7期 无人机绵羊红外目标检测YOLO数据集1964张yolov11/yolov8/yolov5可训练
  • 计算虚拟化技术