Vue3 学习总结补充(一)
创始人
2025-06-01 08:57:56

文章目录

      • 1、Vue3中为什么修改变量的值后,视图不更新?
      • 2、使用 ref 还是 reactive?
      • 3、reactive 为什么会有响应性连接丢失情况?
      • 4、watch的不同使用方法
      • 5、watchEffect和 watch 的区别
        • 区别1:数据源的区别
        • 区别2:获取新值和旧值的区别
        • 区别3:惰性执行和非惰性(立即)执行的区别
      • 6、watchEffect和 watch 使用注意点
      • 7、使用ref修改DOM元素

1、Vue3中为什么修改变量的值后,视图不更新?


2、使用 ref 还是 reactive?

  • reactive 可以转换【复杂数据类型】(例如:对象、数组等) 成为响应式数据,但是不支持简单数据类型(例如:字符串、数值、布尔值);
  • ref 可以转换【简单数据类型】或【复杂数据类型】 为响应式数据,但是操作的时候需要 .value

如果能确定数据是复杂数据类型,并且定义的属性也是知道的,则可以使用 reactive 转成响应式数据,如果不满足以上条件,则使用 ref

代码如下:

    // 1. 明确login对象有两个字段,需要使用 reactiveconst login = reactive({username: '',password: ''})// 2. 后台返回的数据对象const data = ref(null)const res = await axios.get('/login')data.value = res.data // 把不是响应式的 res 赋值给 响应式data中的value,data仍然是响应式的。// 3. 思考:为什么以下方式不可行?const data = reactive({ })const res = await axios.get('/login')data = res // 由于res 不是响应式的,然后把不是响应式的 res 赋值给 响应式的data ,那么data就不是响应式的了。

3、reactive 为什么会有响应性连接丢失情况?

响应性连接丢失的意思是:一个响应式对象原本是响应式的,但随意通过 “赋值”操作,把一个非响应式的数据,赋值给响应式的数据对象,这个响应式对象就变成了非响应式数据对象了。

reactive API有两个限制性情况:

  • 情况1:reactive 仅支持复杂数据类型(对象、数组等),对简单数据类型(字符串、数值、布尔值)等原始类型不支持。

  • 情况2:因为Vue 的响应式系统是通过属性访问进行跟踪的,必须始终保持对该响应式对象的相同引用。所以不可以随意地“替换(赋值)”一个响应式对象,因为这将导致对初始引用的响应性连接丢失。

    也就是说:如果重新赋值或解构赋值,就会丢失原来响应式对象的引用地址,然后变成了一个新的引用地址,因为这个新的引用地址指向的对象是没有经过 reactive 处理的,所以就是一个普通对象,而不是响应式对象。

❌ 响应性连接丢失 代码举例1:

    const data = reactive({ })const res = await axios.get('/login')data = res // 由于res 不是响应式的,然后把不是响应式的 res 赋值给 响应式的data ,那么data就不是响应式的了

❌ 响应性连接丢失 代码举例2:

// 将响应式对象的属性直接赋值或解构赋值时,或是将该属性传入一个函数时,也会失去响应性连接let dataCount = reactive({ count: 0 })// 响应式对象的属性直接赋值时,响应式对象的属性响应性连接丢失,也就是说:dataCount.count 失去响应式连接,但不会影响 dataCount (dataCount仍然是响应式数据对象)
let num = dataCount.count // 响应式对象的属性值 直接赋值给了 num
num++// 响应式对象属性解构时,响应式对象属性(dataCount.count)响应性连接丢失,但不会影响 dataCount
let { count } = dataCount // 响应式对象的属性解构赋值
count++// change函数接收一个普通数字,将无法跟踪 dataCount.count 的变化, dataCount.count失去响应性连接
const change = (item) => {console.log(item)
}
change(dataCount.count)

4、watch的不同使用方法

watch 第一个参数:不同形式的数据源,

  • 可以是 ref(含计算属性)
  • 一个getter函数
  • 一个响应式对象
  • 或多个数据源组成的数组。

注意: watch不能侦听到响应式对象的属性值,比如:watch(data.count,()=>{ }),可以提供一个getter函数进行返回响应式对象的属性值。

watch 第二个参数:回调函数,当数据源发生变化时,执行回调函数

watch 第三个参数【可选】:是一个配置项,

  • deep 用于强制深度遍历
  • immediate 用于立即执行第二个参数中的回调函数
  • flush 用于调整回调函数的刷新时机
  • onTrack / onTrigger 调试侦听器的依赖

watch 的五种不同使用方法如下:


5、watchEffect和 watch 的区别

区别1:数据源的区别

  • watch 是需要侦听一个数据源(ref、响应式对象等),当依赖数据更新时执行回调函数;
  • watchEffect 不需要设置侦听的数据源,而是自动收集依赖数据,当依赖数据更新时会立即执行回调函数

区别2:获取新值和旧值的区别

  • watch 在回调函数中获取到 新值(变化后的值)和 旧值(变化之前的值);
  • watchEffect 在回调函数中 只可以获取到新值(变化后的值),不能获取到 旧值(变化之前的值);
//  watchEffect 和 watch 区别2:// watchEffect 只能拿到 新值
watchEffect(() => {console.log('count.value', count.value) // 只能拿到 新值
})// watch 可以获取到 新值和 旧值
watch(count, (newVal, oldVal) => {console.log('newVal', newVal) // 累加后 新的值console.log('oldVal', oldVal) // 累加前 旧的值
})

区别3:惰性执行和非惰性(立即)执行的区别

  • watch 的回调函数具有一定的惰性 当第一次页面展示的时候不会执行,只有数据变化的时候才会执行(设置immediate 选项为true时可以变为非惰性(可以立即执行),页面首次加载就会执行;
  • watchEffect 的回调函数可以立即执行,没有惰性,页面的首次加载就会执行;
//  watchEffect 和 watch 区别3:
const todoId = ref(1)
const data = ref(null)// watchEffect 中的回调函数会立即执行,不需要指定 immediate: true
watchEffect(async () => {const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${todoId.value}`)data.value = await response.json()
})// 在 watch 中想要立即执行回调函数,就需要 设置 immediate: true
// watch 默认是惰性的:仅当数据源变化时,才会执行回调。但在某些场景中,我们希望在创建侦听器时,立即执行一遍回调。举例来说,我们想请求一些初始数据,然后在相关状态更改时重新请求数据。
watch(todoId,async () => {const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${todoId.value}`)data.value = await response.json()},{ immediate: true }
)

6、watchEffect和 watch 使用注意点

【注意点1】: 侦听器必须用同步语句创建:如果用异步回调创建一个侦听器,那么它不会绑定到当前组件上,必须手动停止侦听,以防止内存泄漏。例如:

// 它会自动停止 ( watch同理 )
watchEffect(() => {})// 这个则不会! ( watch同理 )
setTimeout(() => {watchEffect(() => {})
}, 100)// 要手动停止一个侦听器,请调用 watch 或 watchEffect 返回的函数:
const unwatch = watchEffect(() => {})// 当该侦听器不再需要时
unwatch()

【注意点2】: 需要异步创建侦听器的情况很少,请尽可能选择同步创建,如果需要等待一些异步数据,你可以使用条件式的侦听逻辑:

// 需要异步请求得到的数据
const info = ref(null)watchEffect(() => {if (info.value) {// 数据加载后执行某些操作...}
})

7、使用ref修改DOM元素


相关内容

热门资讯

jp是哪个国家的缩写(jp是哪... 本篇文章极速百科给大家谈谈jp是哪个国家的缩写,以及jp是哪个国家的缩写名字对应的知识点,希望对各位...
苹果手机显示不支持此配件怎么办... 不支持此配件怎么解决 苹果iphone可能不支持此配件怎么办怎么解除不支持此配件 不支持此配件怎么解...
支付宝借呗的利息是多少,蚂蚁借... 支付宝借呗的利息是多少目录支付宝借呗的利息是多少蚂蚁借呗利息是怎么计算的蚂蚁借呗的利息是多少借呗的利...
关于兰字的词语或成语越多越好.... 关于兰字的词语或成语越多越好.目录关于兰字的词语或成语越多越好.有关兰字的成语有哪些关于兰的词语或成...
宝马m5多少钱是不是很贵呢?(... 本篇文章极速百科给大家谈谈宝马m5多少钱是不是很贵呢?,以及宝马m5li多少钱对应的知识点,希望对各...
辽宁省喀左县在哪个城市,辽宁省... 辽宁省喀左县在哪个城市目录辽宁省喀左县在哪个城市辽宁省朝阳市喀左县的邮政编码辽宁省喀左县在哪里辽宁省...
关于marcjacobs香水,... 关于marcjacobs香水目录关于marcjacobs香水marcjacobs香水(探索时尚与艺术...
四级英语考试时间分配,大学英语... 四级英语考试时间分配目录四级英语考试时间分配大学英语四级考多长时间?英语四级考试时间安排?英语四级考...
dnfbuff强化有什么用,地... dnfbuff强化有什么用目录dnfbuff强化有什么用地下城buff强化栏DNF中人物的Buff有...
幼儿园孩子新年祝福语简短,适合... 幼儿园孩子新年祝福语简短目录幼儿园孩子新年祝福语简短适合幼儿园小朋友说的新年祝福语幼儿园老师给小朋友...
正断层有哪些断层组合类型,断层... 正断层有哪些断层组合类型目录正断层有哪些断层组合类型断层的组合类型简答题 断层的类型及组合形式有哪些...
腿皮肤干燥起皮怎么办,腿上起干... 腿皮肤干燥起皮怎么办目录腿皮肤干燥起皮怎么办腿上起干皮怎么办腿干燥脱皮怎么办?腿上皮肤干燥起皮怎么办...
怎么用qq号注册微信,如何用q... 怎么用qq号注册微信目录怎么用qq号注册微信如何用qq号注册微信号呢?微信用qq号怎么注册?怎么用q...
招聘技巧和方法有哪些,招聘途径... 招聘技巧和方法有哪些目录招聘技巧和方法有哪些招聘途径和方法有哪些最有效的招聘方法有哪些?招聘的渠道和...
美团怎么评价,美团外卖怎么给好... 美团怎么评价目录美团怎么评价美团外卖怎么给好评?美团30字通用好评语有哪些?美团怎么评价商家的菜品呢...
龙虾片可以用空气炸锅吗,空气炸... 龙虾片可以用空气炸锅吗目录龙虾片可以用空气炸锅吗空气炸锅龙虾片用空气炸锅炸虾片的做法分享空气炸锅能炸...
小楼是什么烟(小楼多少钱一条)... 本篇文章极速百科给大家谈谈小楼是什么烟,以及小楼多少钱一条对应的知识点,希望对各位有所帮助,不要忘了...
电动汽车的品牌有那些?(电动汽... 本篇文章极速百科给大家谈谈电动汽车的品牌有那些?,以及电动汽车的品牌有哪些?对应的知识点,希望对各位...
全开麦和半开麦区别是什么,半开... 全开麦和半开麦区别是什么目录全开麦和半开麦区别是什么半开麦和全开麦的区别一般韩国音乐节目中歌手用的麦...
转机的流程是什么,飞机中转需要... 转机的流程是什么目录转机的流程是什么飞机中转需要什么流程坐飞机中转机需要注意什么,怎么转?飞机中转需...
什么的田野填空三字词语,什么的... 什么的田野填空三字词语目录什么的田野填空三字词语什么的田野 什么的田野如何组词恰当的词语()的田野什...
wps排序怎么操作步骤,wps... wps排序怎么操作步骤目录wps排序怎么操作步骤wps怎么排序wps表格可以设置排序么?wps怎么自...
中秋节思念家人的诗句,八月十五... 中秋节思念家人的诗句目录中秋节思念家人的诗句八月十五思念亲人的诗词中秋节思念亲人的诗句。中秋节思念家...
新买的苹果手机怎么激活,苹果手... 4. 同意条款和条件:在屏幕上出现的界面中,滑动屏幕并同意苹果的条款和条件。 5. 选择语言和...
烯丙基取代和加成的条件 极速百... 烯丙基取代和加成的条件目录烯丙基取代和加成的条件烯丙基取代和加成的条件
薛平贵与王宝钏结局,薛平贵与王... 薛平贵与王宝钏结局目录薛平贵与王宝钏结局薛平贵与王宝钏大结局????薛平贵与王宝钏结局 薛平贵...
给自己背影唯美简短一句话,给背... 给自己背影唯美简短一句话目录给自己背影唯美简短一句话给背影的唯美简短说说拍了自己的背影要怎么发说说给...
万宝路薄荷香烟有几种,万宝路薄... 万宝路薄荷香烟有几种目录万宝路薄荷香烟有几种万宝路薄荷脆味道如何?万宝路常见的薄荷味香烟有哪些万宝路...
石家庄是哪个省的 极速百科网 ... 石家庄是哪个省的目录石家庄是哪个省的石家庄是哪个省的 石家庄是河北省的省会,是国务院批复确定的...
怎么双开软件,如何实现应用程序... 怎么双开软件目录怎么双开软件如何实现应用程序的双开怎么双开软件 操作步骤以分身大师为例: ...