router锚点和html锚点,react-router 环境使用锚点的方法
锚点是通过在界面中增加一些特征(比如 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 环境使用锚点的方法相关推荐
- React Router入门指南
by Nader Dabit 纳德·达比特(Nader Dabit) React Router入门指南 (Beginner's Guide to React Router) Or what I wis ...
- 初探 React Router 4.0
React Router 4.0 (以下简称 RR4) 已经正式发布,它遵循React的设计理念,即万物皆组件.所以 RR4 只是一堆 提供了导航功能的组件(还有若干对象和方法),具有声明式(引入即用 ...
- hitchhiker部署_《 Hitchhiker的React Router v4指南》:路由配置的隐藏值
hitchhiker部署 Welcome to the Hitchhiker's Guide to React Router v4, Part IV! 欢迎来到< React Router v4 ...
- react router
目录 前言 核心 1.内置的组件 2.内置的路由器组件 3.History 对象 4.Location 对象 5.react router 的安装包 一.React-Router v1 1.一些概念 ...
- 关于React Router v4的虚张声势指南
In this article, we'll cover the important things you can quickly learn to be informed and confident ...
- React Router 4 简易入门
React Router4是一个流行的纯React重写的包.现在的版本中已不需要路由配置,现在一切皆组件. 本文涵盖了开始使用React Router构建网站所需要的一切知识.我们将会为本地运动队制作 ...
- 在React中使用React Router v6
具有多个视图的单页应用程序 (SPA) 需要有一种路由机制,以便在这些不同视图之间导航,而无需刷新整个网页.这可以通过使用诸如React Router之类的路由库来处理. 在本教程中,让我们看看如何使 ...
- React router 的 Route 中 component 和 render 属性理解
React router 的 Route 中 component 和 render 属性理解 Route 标签的三个互斥属性 render.component.children Route 就是用来匹 ...
- router路由react_使用React Router在React中受保护的路由
router路由react In this video, you will see how to create a protected route using React Router. This r ...
- hitchhiker部署_Hitchhiker的React Router v4指南:无限远的递归路径!
hitchhiker部署 Welcome to the third part of the Hitchhiker's Guide to React Router v4. In this article ...
最新文章
- 表单form类型数据转换为数组array
- css实验内容,12个令人惊叹的CSS实验项目
- [architecture]-ARMV8的一些总结-一篇就够了
- tp5中在where中使用in
- Windows Server 笔记之活动目录,域的联系和区别
- 异常--自定义异常类
- Julia中的supertype()函数
- 奥鹏20春在线作业c语言,电子科20春《C语言(专科)》在线作业3答案
- 使用Asp.net MVC源代码调试你的应用程序
- C语言if 语句的基本用法
- Beyond Accuracy:Behavioral Testing of NLP Models with Checklist 论文阅读
- AOSP添加Google Apps(Open Gapps)构建并刷入Pixel
- AndroidStudio haxm installer win10安装失败问题建议
- iOS searchbar实现汉字更具拼音首字母排序
- gateway的官方文档解读
- mysql查询历史执行sql记录
- css动画和js动画比较!
- 手机中的便签如何保存到另一手机中
- 使用Direct3D实现如幻灯片的动态图片切换效果
- 64位系统Python注册表问题修复方案
热门文章
- linux md5sum命令
- 操作系统:进程间的相互作用(多线程基础)
- oracle运维工作中每天巡检的必要性--job的相关问题
- php输出echo、print、print_r、printf、sprintf、var_dump比较
- C#用注册表开机自动启动某某软件
- [程序猿感悟] [悟] 两篇不错的文章 (转载自 stay4it )
- Winrunner与QTP
- wxAdditions使用小结
- 掌握 Ajax,第 11 部分: 服务器端的 JSON
- 四、Spring中使用@Conditional按照条件注册Bean