前端vue3 watch

watch作用:监视数据的变化

当你监视的是 「基本类型值」(字符串 / 数字 / 布尔值,比如person2.name/ref(18).value)→ watch监视的是 **【值本身】**;

当你监视的是 「引用类型」(对象 / 数组 / Proxy/RefImpl,比如person2/ref({name:''}))→ watch监视的是 **【内存地址】**;

1、监视ref定义的基本数据类型:

let a=ref(0)

直接监视:

watch(a,(new,old)=>{

        //操作内容

})

监视的是基本类型,所以值变化了,new和old就不同

2、监视ref定义的对象类型:

 let person=ref({ name:"张三", age:18 }) function changeName(){ person.value.name+='~' } function changeAge(){ person.value.age+=1 } function changePerson(){ person.value={ //地址值会发生变化 name:"李四", age:20 } }

 使用方式:

watch(person,(newValue,oldValue)=>{

    console.log("person的值变化了",newValue,oldValue);

  })

此时,由于watch监视的是引用类型,看地址变化,因此调用changeName或changeAge改变单个属性时,地址不变化,不会触发监视,而调用changePerson时,person.value的地址会发生变化,因此会触发监视

解决方法:手动开启深度监视:

watch(person,(newValue,oldValue)=>{

    console.log("person的值变化了",newValue,oldValue);

  },{deep:true,immediate:true})//深度监视,立即监视(页面一刷新就先执行watch,而不是等person变化了再执行)

在这个watch的回调函数中,newValue和oldValue都是ref对象,需要.value才能获取到里面的值

 此时,如果只有单个属性发生变化,newValue和oldValue的值是一样的,因为地址值没有变化,但是如果是全部发生了变化,也就是如果触发了changePerson函数,newValue和oldValue的值就不一样了,因为地址值发生了变化。

3、监视reactive定义的对象类型:

 let person1=reactive({ name:"张三", age:18 }) function changeName1(){ person1.name+='~' } function changeAge1(){ person1.age+=1 } function changePerson1(){ Object.assign(person1, {//地址没有变化 name:"李四", age:20 }) }

开启监视:

 watch(person1,(newValue,oldValue)=>{

    console.log("person1的值变化了",newValue,oldValue);

  })

监视的是reactive定义的对象,默认开启深度监视,隐式创建深度监视,无法关闭,同上,由于地址没有发生变化(Object.assign不改变地址),所以newValue和oldValue的值是一样的

4、监视ref或reactive定义的对象类型中的某个属性:

 let person2=reactive({ name:"张三", age:18, job:{ a:10, b:20 } }) function changeName2(){ person2.name+='~' } function changeAge2(){ person2.age+=1 } function changeJob1(){ person2.job.a+=1 } function changeJob2(){ person2.job.b+=1 } function changeJob(){ person2.job={ //地址值会发生变化 a:100, b:200 } }

(1)如果该属性不是对象类型,而是比如name,需要写成函数形式,才能监视到变化,开启监视方式:

watch(()=>{return person2.name},(new,old)=>{

//内容

})

Vue 执行这个函数后,拿到的返回值是 person2.name → 也就是一个 字符串(基本数据类型),值为 '张三'watch 最终监视的,是这个函数的【返回值】,而不是函数本身,也不是 person2 这个对象。所以值变化了,new和old就会不同

(2)若该属性值是**依然**是【对象类型】,可直接编,也可写成函数,建议写成函数。

直接写:

watch(person2.job,(new,old)=>{})

此时,如果job中的单个属性发生变化,会触发监视,但由于地址不变,new和old是相同的。但是如果调用了:

  function changeJob(){

    person2.job={  //地址值会发生变化

      a:100,

      b:200

    }

  }

来改变job中的内容的话,person2.job的地址就发生变化,相当于此时的person2.job就不是原来的person2.job,就不会触发watch,甚至之后再单单改变a或者b,也不会再触发了(因为watch是挂载在原来的person2.job上的而不是这个person2.job上)

  写成函数形式,并开启深度监视后,无论是修改单个属性,还是全部属性,都会触发:

  watch(()=>{return person2.job},(newValue,oldValue)=>{

    console.log('person2的job变化了11',newValue,oldValue)

  },{deep:true})//深度监视

5、监视上述多个数据,组成数组

  //监视名字和单个车:

  watch([()=>{return person2.name},()=>{return person2.job.a}],(newValue,oldValue)=>{

    console.log('person2的name或job.a变化了',newValue,oldValue)

//value是数组[],new和oldvalue不同

  },{deep:true})




个人学习记录,如果错误,欢迎指正,也欢迎补充!

Read more

宇树G1机器人强化学习训练完整实战教程

宇树G1机器人强化学习训练完整实战教程

0. 前言 人形机器人的运动控制一直是机器人领域的重要挑战,而强化学习为解决这一问题提供了强有力的工具。本教程将基于宇树G1人形机器人,从基础的强化学习环境搭建开始,逐步深入到高自由度模型的训练配置、奖励函数设计与优化,最终实现复杂动作的训练控制。作者看到一个很棒的系列,所以针对性的对文章内容进行了整理和二次理解,方便大家更好的阅读《不同自由度的宇树G1机器人强化学习训练配置及运行实战 + RSL-RL代码库问题修复》、《宇树G1机器人强化学习训练奖励函数代码架构 + 创建新的奖励函数(1)》、《RL指标分析与看板应用 — 宇树G1机器人高自由度模型强化学习训练实战(3)》、《调参解析 — 宇树G1机器人高自由度模型强化学习训练实战(4)》、《舞蹈训练?手撕奖励函数 — 宇树G1机器人高自由度模型强化学习训练实战(5)》。 1. 强化学习训练环境配置 1.1 基础环境搭建 宇树机器人的强化学习训练基于Isaac Gym物理仿真环境和RSL-RL强化学习框架。首先需要确保这两个核心组件正确安装和配置。 在开始训练之前,我们通过简单的命令来启动12自由度G1机器人的基础训练:

FPGA教程系列-Vivado AXI4-Stream Data FIFO核解读测试

FPGA教程系列-Vivado AXI4-Stream Data FIFO核解读测试

FPGA教程系列-Vivado AXI4-Stream Data FIFO核解读测试 FIFO depth (FIFO 深度): 定义了 FIFO 能存储多少个数据字(Data Words)。 注意:实际占用的存储资源取决于深度乘以数据宽度(TDATA width)。 Memory type (存储器类型): Auto * 决定用 FPGA 内部的哪种资源来实现 FIFO。 * Auto: 让 Vivado 综合工具根据 FIFO 的大小自动选择(通常小 FIFO 用分布式 RAM/LUTRAM,大 FIFO 用块 RAM/BRAM)。 * Block RAM: 强制使用 BRAM。 * Distributed RAM: 强制使用 LUT 搭建的

OpenClaw 多机器人多 Agent 模式:打造你的 AI 助手团队

OpenClaw 多机器人多 Agent 模式:打造你的 AI 助手团队

OpenClaw 多机器人多 Agent 模式:打造你的 AI 助手团队 完整教程:https://awesome.tryopenclaw.asia/docs/04-practical-cases/15-solo-entrepreneur-cases.html 16.1 为什么需要多 Agent? 作为超级个体创业者,你可能需要不同类型的 AI 助手来处理不同的工作: * 主助理:使用最强大的模型(Claude Opus)处理复杂任务 * 内容创作助手:专注于文章写作、文案创作 * 技术开发助手:处理代码开发、技术问题 * AI 资讯助手:快速获取和整理 AI 行业动态 传统的单 Agent 模式需要频繁切换模型和上下文,效率低下。多 Agent 模式让你可以同时拥有多个专业助手,各司其职。

OpenClaw 安装 + 接入飞书机器人完整教程

OpenClaw 安装 + 接入飞书机器人完整教程 OpenClaw 曾用名:ClawdBot → MoltBot → OpenClaw(同一软件,勿混淆) 适用系统:Windows 10/11 最后更新:2026年3月 一、什么是 OpenClaw? OpenClaw 是一款 2026 年爆火的开源个人 AI 助手,GitHub 星标已超过 10 万颗。 与普通 AI 聊天机器人的核心区别: * 真正的执行能力:不只回答问题,能实际操作你的电脑 * 24/7 全天候待命:睡觉时也能主动完成任务 * 完全开源免费:数据完全掌控在自己手中 * 支持国内平台:飞书、钉钉等均已支持接入 二、安装前准备:安装 Node.js 建议提前手动安装