javascript - 在链接路径中使用 "#"的 React-router-dom 不会导航到组件

标签 javascript reactjs react-router-dom

我正在尝试创建一个功能,当用户点击 <Link> 时,他们导航到另一个组件(帖子)并直接滚动到评论。该路径满足 <Route> 的要求定义,但是当我使用“#”作为 URL 的一部分时,重定向不会生效:

路线:<Route path="/post/:id/:hash" component={Post} />

网址:https://b881s.codesandbox.io/post/4/#ve33e

但是,有趣的是,当我使用“@”而不是“#”时,该功能会按预期工作。

网址:https://b881s.codesandbox.io/post/4/@ve33e

我试图找到任何提及“#”是 react-router-dom 的某种特殊字符的内容,但还没有发现任何东西。也许我从根本上缺少一些东西?

这是带有工作代码的沙箱:https://codesandbox.io/s/scrollintoview-with-refs-and-redux-b881s

App.js

import React from "react";
import ReactDOM from "react-dom";
import Home from "./Home";
import Posts from "./Posts";
import Post from "./Post";
import { BrowserRouter, Route, Switch } from "react-router-dom";
import store from "./store";
import { Provider } from "react-redux";

import "./styles.css";

const App = () => {
  return (
    <Provider store={store}>
      <BrowserRouter>
        <div>
          <Switch>
            <Route path="/" exact component={Home} />
            <Route path="/posts" component={Posts} />
            <Route path="/post/:id/:hash" component={Post} />
            <Route path="/post/:id/" component={Post} />
          </Switch>
        </div>
      </BrowserRouter>
    </Provider>
  );
};

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

Posts.js

import React from "react";
import { connect } from "react-redux";
import { Link } from "react-router-dom";

class Posts extends React.Component {
  createPostList = () => {
    const { posts } = this.props;

    if (posts.posts) {
      return posts.posts.map(post => {
        return (
          <div key={post.id} className="post">
            <Link to={`/post/${post.id}`}>{post.title}</Link>
            <p>{post.text}</p>
            <div>
              {post.comments.map(comment => {
                return (
                  <div>
                    <Link to={`/post/${post.id}/@${[comment.id]}`}>
                      {comment.id}
                    </Link>
                  </div>
                );
              })}
            </div>
          </div>
        );
      });
    } else {
      return <h4>Loading...</h4>;
    }
  };

  render() {
    return <div>{this.createPostList()}</div>;
  }
}

const mapStateToProps = state => {
  return {
    posts: state.posts
  };
};

export default connect(mapStateToProps)(Posts);

最佳答案

URL 字符串中 # 之后的任何内容都称为 hash .您可以使用 location.hash 访问给定 location 的哈希。所以在你的 route 你不需要提及 :hash。您应该改为通过 Route 组件注入(inject)组件的 location 对象读取哈希。

您的路线:

<Route path="/post/:id" component={Post} />

Post 组件中读取哈希:

class Post extends React.Component {
    render() {
        const {location} = this.props;
        console.log(location.hash);
        ...
    }
}

关于javascript - 在链接路径中使用 "#"的 React-router-dom 不会导航到组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57025889/

相关文章:

reactjs - 如何让react-hot-loader与webpack 2和webpackDevMiddleware一起使用?

javascript - Chrome 应用程序 JavaScript : Save text as a DOCX file

使用 jQuery 插入 DOM 时不执行 JavaScript

javascript - 淡入淡出动画不起作用

reactjs - Webpack-dev-server 如何删除 React 应用程序的默认路由?

javascript - 如何减少react-chart-js2中显示的数据点数(数据抽取)

javascript - 如何使用多语言/多个 index.html 文件正确设置 React Router?

javascript - 如何处理从 Node Express 重定向到 React Client 的身份验证(react-router-dom 和 useContext)

javascript - 当我使用 Firebase Auth 在 React 中刷新主页时,会显示登录页面

javascript - 如何从组件外部的 Redux 存储中获取值?