对于路由使用的ref的疑问

news/2025/10/7 8:00:38/文章来源:https://www.cnblogs.com/BKYNEKO/p/19128158

<script setup>
import { ref, computed } from 'vue'
import Home from './Home.vue'
import About from './About.vue'
import NotFound from './NotFound.vue'
const routes = {
  '/': Home,
  '/about': About
}
const currentPath = ref(window.location.hash)
window.addEventListener('hashchange', () => {
  currentPath.value = window.location.hash
})
const currentView = computed(() => {
  return routes[currentPath.value.slice(1) || '/'] || NotFound
})
</script>
<template>
  <a href="#/">Home</a> |
  <a href="#/about">About</a> |
  <a href="#/non-existent-path">Broken Link</a>
  <component :is="currentView" />
</template>为什么还要重新赋值一遍currentPath.value = window.location.hash原本const currentPath = ref(window.location.hash)不就代表ref括号的参数默认是这个变量的value了吗

 

 

 

 

这个问题非常好,它触及了 Vue 响应式系统与原生浏览器API(如 window.location.hash)如何交互的核心,也是很多初学者容易困惑的地方。

简单来说,ref() 只在创建时读取一次 window.location.hash 的值,它并不会持续自动跟踪这个值的变化。

我们来详细分解一下这个过程。


 

1. ref() 的作用:“一次性快照”,而非“持续绑定”

当您执行这行代码时:

JavaScript
 
const currentPath = ref(window.location.hash)

背后发生的事情是:

  1. JavaScript 首先执行括号里的内容:window.location.hash。假设页面刚加载时,URL是 ...#/about,那么这个表达式会返回一个普通的字符串 "#about"

  2. 然后,Vue 的 ref() 函数接收到这个字符串 "#about",并用它来创建一个响应式对象

  3. 这个响应式对象被赋值给 currentPath 变量。此时,currentPath.value 的值就是字符串 "#about"

最关键的一点是:从这一刻起,currentPath.valuewindow.location.hash 之间就没有任何关系了。ref() 只是在初始化的那一瞬间,拍了一张 window.location.hash 的“快照”作为自己的初始值。

window.location.hash 是一个原生的浏览器属性,它本身并不是一个 Vue 的响应式源。当浏览器因为用户点击链接而改变了它的值时,Vue 的响应式系统是完全不知情的。

 

2. addEventListener 的作用:“手动连接的桥梁”

既然 Vue 无法自动知道 window.location.hash 变了,我们就需要一个“信使”来告诉它。这个“信使”就是 window.addEventListener

JavaScript
 
// 当浏览器的 hash 值发生变化时,请执行这个函数
window.addEventListener('hashchange', () => {// 这就是信使要传递的消息:// "嘿,Vue!请把 currentPath 的值更新为浏览器最新的 hash 值!"currentPath.value = window.location.hash
})
  • 'hashchange' 事件: 这是浏览器提供的标准事件。每当 URL 的 hash 部分(# 后面的内容)发生改变时,浏览器就会触发这个事件。

  • () => { ... }: 这是事件触发时要执行的回调函数。

  • currentPath.value = window.location.hash: 这就是我们手动重新赋值的关键步骤。我们在这里读取最新的 window.location.hash 值,并把它赋给 currentPath.value

因为 currentPath 是一个 ref,所以当它的 .value 被重新赋值时,Vue 的响应式系统就会被激活。Vue 会注意到 currentPath 变了,然后:

  1. 重新计算 currentView 这个计算属性。

  2. currentView 返回了新的组件(比如从 Home 变成了 About)。

  3. Vue 自动将模板中的 <component :is="currentView" /> 更新为新的组件。


 

一个生动的比喻

  • const currentPath = ref(window.location.hash):你抬头看了一眼公共广场上的大钟 (window.location.hash),然后把当前时间写在了你自己的个人白板 (currentPath) 上。

  • 之后,你的白板上的时间就不会再动了,即使广场上的大钟在不停地走。你的白板和大钟之间没有自动同步的魔法。

  • window.addEventListener('hashchange', ...):你雇了一个人(事件监听器),让他一直盯着广场上的大钟。

  • currentPath.value = window.location.hash:你告诉这个人,每当大钟的时间变了,就立刻跑过来,擦掉你白板上的旧时间,然后写上大钟的最新时间

正是这个“手动更新白板”的动作,才让你的 Vue 应用(办公室里的其他人)知道现在是几点了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天津到天津天津网站开发iis v6 新建网站

大数据管理数据处理过程图大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察力。大数据处理的主要流程包括数据收集、数据存储、数据处理、数据应用等主要环节。随着业务的增长,大量和流程、规…

自建购物网站福建响应式网站制作

目录 详细布置&#xff1a; 1. 层序遍历 2. 226. 翻转二叉树 3. 101. 对称二叉树 详细布置&#xff1a; 1. 层序遍历 昨天练习了几种二叉树的深度优先遍历&#xff0c;包括&#xff1a; ​​​​​​前中后序的递归法前中后序的迭代法前中后序迭代的统一写法 今天&…

扁平化企业网站从零开始制作wordpress主题

文章目录 360篡改浏览器主页方法1锁定浏览器主页 方法2注册表修改 360广告和弹窗360极速版 小结 360篡改浏览器主页 如果您使用360,且不想卸载它,那么当你启动360后,它可能会篡改你的浏览器(比如edge)的主页start page为360早期可能是通过修改快捷方式的target等属性,但是现在…

新网站建设验收公司手机网站模板

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

公司专业网站建设百度分享代码 wordpress

背景&#xff1a; 想知道四川省包含哪些水系&#xff0c;以及各个水系的分布&#xff0c;起点、流经省市、终点等 {label: "嘉陵江",value: "嘉陵江",},{label: "渠江",value: "渠江",},{label: "涪江",value: "涪江&q…

Paypal 设置不自动换汇

进入 PayPal 网页版自动付款设置。选择结算商户,查看兑换选项,修改为使用银行的兑换方式。

网站建设培训赚钱吗怎么才能在百度上做引流呢

目录 引出Redis持久化方式Redis入门1.Redis是什么&#xff1f;2.Redis里面存Java对象 Redis进阶1.雪崩/ 击穿 / 穿透2.Redis高可用-主从哨兵3.持久化RDB和AOF4.Redis未授权访问漏洞5.Redis里面安装BloomFilte Redis的应用1.验证码2.Redis高并发抢购3.缓存预热用户注册验证码4.R…

威县网站建设报价微信app开发价格表

我们需要将Python对象序列化为字节流&#xff0c;这样就可以将其保存到文件中、存储到数据库中或者通过网络连接进行传输。 解决方案 序列化最普遍的做法是使用 pickle 模块。为了将一个对象保存到一个文件中&#xff0c;可以这样做&#xff1a; import pickledata ... # Some…

国外网站参考住房城乡与建设厅网站首页

压缩方式是网络视频服务器和网络摄像机的核心技术&#xff0c;压缩方式很大程度上决定着图像的质量、压缩比、传输效率、传输速度等性能&#xff0c;它是评价网络视频服务器和网络摄像机性能优劣的重要一环。 随着多媒体技术的发展&#xff0c;相继推出了许多压缩编码标准&…

中博建设集团有限公司网站湖南软件开发公司

前言 由于兼容性问题&#xff0c;使得我们若想用较新版本的 PyTorch&#xff0c;通过 GPU 方式训练模型&#xff0c;也得更换较新版本得 CUDA 工具包。然而 CUDA 的版本又与电脑显卡的驱动程序版本关联&#xff0c;如果是低版本的显卡驱动程序安装 CUDA11 及以上肯定会失败。 比…

wordpress圆角插件汉化青岛网络优化推广公司

C#流和文件 文件及文件夹管理 WinForm中的文件对话框 文件内容的读写 注册表操作

手机网站前端电商法规定企业网站必须做3年

1. 业务理解与需求分析 业务场景梳理&#xff1a;深入理解业务流程、业务规则、用户行为模式等&#xff0c;明确系统需要支持的核心功能和应用场景。非功能性需求识别&#xff1a;关注性能指标&#xff08;如响应时间、并发处理能力、数据吞吐量等&#xff09;、可用性要求&am…

诺贝尔生理与医学奖颁给这项革命技术,多家中国公司已布局!(附名单)

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 刚刚,2025年诺贝尔生理学或医学奖震撼公布。科学家玛丽E布伦科(…

网站上传好了如何做定向wordpress用户注册代码修改哪里

数据驱动将测试数据和测试行为完全分离&#xff0c;实施数据驱动测试步骤如下&#xff1a; A、编写测试脚本&#xff0c;脚本需要支持从程序对象、文件或者数据库读入测试数据&#xff1b; B、将测试脚本使用的测试数据存入程序对象、文件或者数据库等外部介质中&#xff1b;…

服务好的南京网站建设搜索引擎营销方案例子

使用ws自动创建的vitevue3项目后设置不了alias 答&#xff1a;不懂原理&#xff0c;但是有其他方法解决。直接在命令行执行“npm init vitelatest"后&#xff0c;一路选下去有create-vue的选项&#xff0c;就选这个create-vue创建&#xff1b;创建后会自动导入一个叫node…

钱璐璐,唯一通讯发Nature,作者仅2人!

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087在人工分子机器领域,寻找一种像ATP或电力那样通用的能源一直是一个…

公司网站怎么选网站改了title 删除百度就的收录

什么是DCS DCS&#xff0c;即分散控制系统&#xff0c;是一种用于监控和控制工业过程的系统。它通过连接多个控制器、传感器和执行器实现自动化控制&#xff0c;提高生产效率和安全性。在中国&#xff0c;随着工业化和自动化水平的提高&#xff0c;DCS技术得到了广泛应用和快速…

手机怎么上wap网站网站编辑怎么做的

规定word导入格式 1、[单选题][2024][一般]题目1 A.选项1 B.选项2 C.选项3 D.选项4 答案&#xff1a;D 试题图片&#xff08;上传多媒体图片&#xff09;&#xff1a; 分数&#xff1a;2 答案解析&#xff1a; 2、[多选题][2024][困难]题目2 A.选项1 B.选项2 C.选项3 D.选项4 E…

安徽网站建站系统哪家好wordpress单栏简洁

本软件仅供学习交流&#xff0c;完全免费&#xff0c;同时也为帮助有缘人能买到自用的口罩&#xff0c;度过这段特殊时期&#xff01;请勿用于其它用途&#xff0c;谢谢&#xff01;如有违规&#xff0c;请删帖&#xff01;下载地址&#xff1a;https://www.lanzous.com/ia3bfl…

华为员工工资待遇表:

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087华为员工工资待遇表:13级 年薪:20-25W(无股票) 14级 年薪:30-…