第 85 题:react-router 里的 <Link> 标签和 <a> 标签有什么区别

发布于 2022-10-21 20:33:22 字数 66 浏览 117 评论 10

如何禁掉 <a> 标签默认事件,禁掉之后如何实现跳转。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

上课铃就是安魂曲 2022-05-04 13:55:43
  • <Link>标签是react-router-dom下的元素,<a>是html原生标签
  • 两者同样都会实现页面的跳转功能,<Link>会页面无刷新的跳转,而<a>标签进行刷新
  • 出现上面现象的原因<a>标签在涉及到path变化后浏览器的原生反应就是会刷新页面,虽然<Link>渲染后默认也是a标签,在<Link>内部的实现原理是通过history进行了跳转,并且event.preventDefault()阻止了a标签的默认事件
东京女 2022-05-04 13:54:20

之前遇到过一个bug, 在一个SPA里点击一个链接按钮后,redux里的数据都丢了。后来才发现,不知道谁写了一个a,没有用Link。相当于重新打开了一个SPA。

你说的对,这才是最大的区别

复古式 2022-05-04 13:53:57

之前遇到过一个bug, 在一个SPA里点击一个链接按钮后,redux里的数据都丢了。后来才发现,不知道谁写了一个a,没有用Link。相当于重新打开了一个SPA。

玩心态つ 2022-05-04 13:53:41
  • Router

history 跟 hash 模式混为一谈了吧...

待"谢繁草 2022-05-04 13:48:14

link会根据HASH的形态不同自动调整

葬花如无物 2022-05-04 13:42:56

<a href="javascript: void 0" @click="$router.push(route)">

柠檬色的秋千 2022-05-04 13:34:06

Link 的本质也是a 标签。只不过在Link 中禁用了 a 标签的默认事件,改用了history对象提供的方法进行跳转。

不寐倦长更 2022-05-04 12:36:42
  • 禁掉 a 标签的默认事件,可以在点击事件中执行 event.preventDefault();
  • 禁掉默认事件的 a 标签 可以使用 history.pushState() 来改变页面 url,这个方法还会触发页面的 hashchange 事件,Router 内部通过捕获监听这个事件来处理对应的跳转逻辑。
一腔孤↑勇 2022-05-03 10:04:47

先看Link点击事件handleClick部分源码

      if (_this.props.onClick) _this.props.onClick(event);

      if (!event.defaultPrevented && // onClick prevented default
      event.button === 0 && // ignore everything but left clicks
      !_this.props.target && // let browser handle "target=_blank" etc.
      !isModifiedEvent(event) // ignore clicks with modifier keys
      ) {
          event.preventDefault();

          var history = _this.context.router.history;
          var _this$props = _this.props,
              replace = _this$props.replace,
              to = _this$props.to;


          if (replace) {
            history.replace(to);
          } else {
            history.push(to);
          }
        }

Link做了3件事情:

  1. 有onclick那就执行onclick
  2. click的时候阻止a标签默认事件(这样子点击<a href="/abc">123</a>就不会跳转和刷新页面)
  3. 再取得跳转href(即是to),用history(前端路由两种方式之一,history & hash)跳转,此时只是链接变了,并没有刷新页面
离鸿 2022-05-01 06:26:43

从最终渲染的 DOM 来看,这两者都是链接,都是 <a> 标签,区别是:
<Link> 是 react-router 里实现路由跳转的链接,一般配合 <Route> 使用,react-router 接管了其默认的链接跳转行为,区别于传统的页面跳转,<Link> 的“跳转”行为只会触发相匹配的 <Route> 对应的页面内容更新,而不会刷新整个页面。
<a> 标签就是普通的超链接了,用于从当前页面跳转到 href 指向的另一个页面(非锚点情况)。

~没有更多了~

关于作者

拥抱没勇气

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

花开柳相依

文章 0 评论 0

zyhello

文章 0 评论 0

故友

文章 0 评论 0

对风讲故事

文章 0 评论 0

Oo萌小芽oO

文章 0 评论 0

梦明

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文