javascript - 了解如何使用 React 和 React-router 拥有多个页面

标签 javascript reactjs react-router react-bootstrap

对于 react 非常陌生,尝试在此过程中完成多个教程。

我相信我错过了 React 的核心概念之一,并且错误地设置了我的结构。我想做的是有一个主页(Main_Layout),顶部有一个导航栏。该页面中将有一个链接,可转到显示用户信息的辅助页面 (User_Layout)。该 User_Layout 页面还将有一个导航栏,但它与主页不同。

因此,我将路由设置为仅包含用户页面的一个额外路由: client.js

document.addEventListener('DOMContentLoaded', function (){

 const app = document.getElementById('app');

 ReactDOM.render(
    <Router history={hashHistory}>
        <Route path="/" component={Main_Layout}>
            <Route path="user" component={User_Layout}></Route>
        </Route>
    </Router>,
 app);
});

因此,当应用加载时,它将加载 Main_Layout.js

import React from "react";
import Header from "./components/Header"

export default class Main_Layout extends React.Component {
  constructor(){
    super();
    this.state = {
        "title" : "Go to user page!",
    }
  }

  render(){
    return (
        <div>
            <Header title={this.state.title}/>
        </div>
    )
  }
}

这是我的 Header.js 组件,它只有一个指向/user 路由的链接:

import React from 'react';
import { Button, Nav, Navbar, NavDropdown, MenuItem, NavItem } from 'react-bootstrap';
import { Route, RouteHandler, Link } from 'react-router';
import { LinkContainer } from 'react-router-bootstrap';

export default class Header extends React.Component {
  render(){
    return(
         <Navbar>
            <Navbar.Header>
              <Navbar.Brand>
                <a href="#">Website Title</a>
              </Navbar.Brand>
            </Navbar.Header>
            <Nav pullRight>
              <LinkContainer to="/user">
                <NavItem eventKey={1}>{this.props.title}</NavItem>
              </LinkContainer>
            </Nav>
          </Navbar>
    )
  }
}

最后是我的显示用户信息的页面:User_Layout.js

 import React from "react";

 import Footer from "./components/Footer"
 import Header from "./components/Header"

 export default class User_Layout extends React.Component {
   render(){
    console.log("Made it to the user page");
    var title = "You are at the user page!";
    return (
        <div>
            <Header title={title}/>
        </div>
    )
   } 
 }

我想我有一些问题:

  1. 当我点击“转到您的用户页面”时,我看到 URL 栏中的路由更改为/#/user,但 User_Layout 中的代码从未触发(console.log 不会触发)

  2. 如果我要覆盖现有 header ,我是否可以在 User_Layout 中重新声明 header 组件?更改导航栏元素的最佳方法是什么?

最佳答案

如果您不使用父组件 Main_layout 作为子组件 User_Layout 的框架(因为您使用不同的 header ),则应该保持这两条路由彼此平行。 例如

 ReactDOM.render(
    <Router history={hashHistory}>
        <Route path="/" component={Main_Layout}/>
        <Route path="user" component={User_Layout}/>
    </Router>,
 app);
});

此外,如果您想要父子关系,您可以通过连接主组件中的一个函数来将新的 Prop 传递给 header 组件,该函数处理路由更改时传递给 header 的所有 Prop 。

您在 React 中缺少的关键概念是不使用 main_layout 中的 this.props.children 来渲染其中的子路由。 你的 main_layout 应该看起来像

    import React from "react";
    import Header from "./components/Header"

    export default class Main_Layout extends React.Component {
      constructor(){
        super();
        this.state = {
            "title" : "Go to user page!",
        }
      }

      render(){
        return (
            <div>
                <Header title={this.state.title}/>
               {this.props.children}
            </div>
        )
      }

}

只有使用 this.props.children 后,您才能在嵌套路由中渲染组件。

关于javascript - 了解如何使用 React 和 React-router 拥有多个页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42194681/

相关文章:

javascript - 如何始终显示第一个 TAB

javascript - javascript中的event.clientX位置问题

javascript - 具有间隔更新的 React 时钟组件非常慢

javascript - 如何在公共(public)文件reactjs中包含文件?

javascript - React 使用 React Hooks 从 Router 获取 props

reactjs - 在外部包中使用 Route 或 Link 时 React Router Invariant 失败

javascript - 合并重叠数据集

javascript - 如何在Shopify中构建真正的React SPA主题

javascript - 在 React 应用程序和 Firebase 数据库之间同步状态

javascript - 如何从对象中的 forEach 中获取搜索结果?