锚点是通过在界面中增加一些特征(比如 id),然后在 URL 地址后面加上 #id 就可以访问到指定页面的指定位置,这样可以让我们快速跳转到页面的某个位置,但是在 react-router 中这种方法遇到了问题,因为 react-router 会把 # 当做是 hash 来处理。导致即使跳转到指定页面后,# 后面的锚点也不生效。针对这个问题,在 react-router 的一个 issue 中大家也展开了激烈的讨论。以下是我看过以后整理的几种解决办法。

只有某些页面需要

当只有某些页面需要使用锚点的时候,可以在访问到该页面后使用 react 生命周期中 componentDidMount 阶段来判断 # 后面的字符串,然后使用 dom 操作取到这个字符串所属的 dom,然后滚动到该位置。具体代码如下:

componentDidMount() {

// Decode entities in the URL

// Sometimes a URL like #/foo#bar will be encoded as #/foo%23bar

window.location.hash = window.decodeURIComponent(window.location.hash);

const scrollToAnchor = () => {

const hashParts = window.location.hash.split('#');

if (hashParts.length > 2) {

const hash = hashParts.slice(-1)[0];

document.querySelector(`#${hash}`).scrollIntoView();

}

};

scrollToAnchor();

window.onhashchange = scrollToAnchor;

}

说不准哪些页面会使用

以上方法适用于具有生命周期的 react component,而且是在组件的生命周期中实现这个功能,若需要所有页面都实现这个功能,明显我们不可能在所有 component 中都增加这个方法。这就产生另外一个方案,就是在 Router 的 onUpdate 函数中实现该功能。onUpdate 函数在路由跳转后会被调用一次,如下所示:

import React from 'react';

import { render } from 'react-dom';

import { Router, Route, browserHistory } from 'react-router';

const routes = (

// your routes

);

function hashLinkScroll() {

const { hash } = window.location;

if (hash !== '') {

// Push onto callback queue so it runs after the DOM is updated,

// this is required when navigating from a different page so that

// the element is rendered on the page before trying to getElementById.

setTimeout(() => {

const id = hash.replace('#', '');

const element = document.getElementById(id);

if (element) element.scrollIntoView();

}, 0);

}

}

render(

history={browserHistory}

routes={routes}

onUpdate={hashLinkScroll}

/>,

document.getElementById('root')

)

当地址改变后,hashLinkScroll 会被调用,函数内部实现原理与上面的原理是一样的,拿到 # 后面的 id 并找到指定 dom,然后滚动到该 dom 的位置。

总结

两种方案各有优劣,可以根据自己的情况来选择使用。

相关

router锚点和html锚点,react-router 环境使用锚点的方法相关推荐

  1. React Router入门指南

    by Nader Dabit 纳德·达比特(Nader Dabit) React Router入门指南 (Beginner's Guide to React Router) Or what I wis ...

  2. 初探 React Router 4.0

    React Router 4.0 (以下简称 RR4) 已经正式发布,它遵循React的设计理念,即万物皆组件.所以 RR4 只是一堆 提供了导航功能的组件(还有若干对象和方法),具有声明式(引入即用 ...

  3. hitchhiker部署_《 Hitchhiker的React Router v4指南》:路由配置的隐藏值

    hitchhiker部署 Welcome to the Hitchhiker's Guide to React Router v4, Part IV! 欢迎来到< React Router v4 ...

  4. react router

    目录 前言 核心 1.内置的组件 2.内置的路由器组件 3.History 对象 4.Location 对象 5.react router 的安装包 一.React-Router v1 1.一些概念 ...

  5. 关于React Router v4的虚张声势指南

    In this article, we'll cover the important things you can quickly learn to be informed and confident ...

  6. React Router 4 简易入门

    React Router4是一个流行的纯React重写的包.现在的版本中已不需要路由配置,现在一切皆组件. 本文涵盖了开始使用React Router构建网站所需要的一切知识.我们将会为本地运动队制作 ...

  7. 在React中使用React Router v6

    具有多个视图的单页应用程序 (SPA) 需要有一种路由机制,以便在这些不同视图之间导航,而无需刷新整个网页.这可以通过使用诸如React Router之类的路由库来处理. 在本教程中,让我们看看如何使 ...

  8. React router 的 Route 中 component 和 render 属性理解

    React router 的 Route 中 component 和 render 属性理解 Route 标签的三个互斥属性 render.component.children Route 就是用来匹 ...

  9. router路由react_使用React Router在React中受保护的路由

    router路由react In this video, you will see how to create a protected route using React Router. This r ...

  10. hitchhiker部署_Hitchhiker的React Router v4指南:无限远的递归路径!

    hitchhiker部署 Welcome to the third part of the Hitchhiker's Guide to React Router v4. In this article ...

最新文章

  1. 表单form类型数据转换为数组array
  2. css实验内容,12个令人惊叹的CSS实验项目
  3. [architecture]-ARMV8的一些总结-一篇就够了
  4. tp5中在where中使用in
  5. Windows Server 笔记之活动目录,域的联系和区别
  6. 异常--自定义异常类
  7. Julia中的supertype()函数
  8. 奥鹏20春在线作业c语言,电子科20春《C语言(专科)》在线作业3答案
  9. 使用Asp.net MVC源代码调试你的应用程序
  10. C语言if 语句的基本用法
  11. Beyond Accuracy:Behavioral Testing of NLP Models with Checklist 论文阅读
  12. AOSP添加Google Apps(Open Gapps)构建并刷入Pixel
  13. AndroidStudio haxm installer win10安装失败问题建议
  14. iOS searchbar实现汉字更具拼音首字母排序
  15. gateway的官方文档解读
  16. mysql查询历史执行sql记录
  17. css动画和js动画比较!
  18. 手机中的便签如何保存到另一手机中
  19. 使用Direct3D实现如幻灯片的动态图片切换效果
  20. 64位系统Python注册表问题修复方案

热门文章

  1. linux md5sum命令
  2. 操作系统:进程间的相互作用(多线程基础)
  3. oracle运维工作中每天巡检的必要性--job的相关问题
  4. php输出echo、print、print_r、printf、sprintf、var_dump比较
  5. C#用注册表开机自动启动某某软件
  6. [程序猿感悟] [悟] 两篇不错的文章 (转载自 stay4it )
  7. Winrunner与QTP
  8. wxAdditions使用小结
  9. 掌握 Ajax,第 11 部分: 服务器端的 JSON
  10. 四、Spring中使用@Conditional按照条件注册Bean