基本路由的使用
本篇的vue项目,代码涉及的主要文件有:
- 模板文件index.html
- 入口文件index.js
- 入口组件App.js
- 路由组件Home:pages/Home/index.jsx
- 路由组件About:pages/About/index.jsx
模板文件index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="%PUBLIC_URL%/css/bootstrap.css">
<title>React App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>
入口文件index.js
import React from 'react';
import ReactDOM from 'react-dom';
import {BrowserRouter} from "react-router-dom";
import App from './App';
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById("root")
);
入口组件App.js
import React, { Component } from 'react'
import {NavLink,Route} from "react-router-dom";
import About from "./pages/About";
import Home from "./pages/Home";
export default class App extends Component {
render() {
return (
<div>
<div className="row">
<div className="col-xs-offset-2 col-xs-8">
<div className="page-header"><h2>Vue Router Demo</h2></div>
</div>
</div>
<div className="row">
<div className="col-xs-2 col-xs-offset-2">
<div className="list-group">
<NavLink className="list-group-item" activeClassName='active' to="/about">About</NavLink>
<NavLink className="list-group-item" activeClassName='active' to="/home">Home</NavLink>
</div>
</div>
<div className="col-xs-6">
<div className="panel">
<div className="panel-body">
<Route path="/about" component={About}></Route>
<Route path="/home" component={Home}></Route>
</div>
</div>
</div>
</div>
</div>
)
}
}
pages/Home/index.jsx(Home组件)
import React, { Component } from 'react'
export default class Home extends Component {
render() {
return (
<h2>我是Home的内容</h2>
)
}
}
pages/About/index.jsx(About组件)
import React, { Component } from 'react'
export default class About extends Component {
render() {
return (
<h2>我是About的内容</h2>
)
}
}
一般组件和路由组件
路由组件,放在pages文件夹下。
一般组件,放在components文件夹下。
不妨把Vue Router Demo这部分封装成一个一般组件,于是,在src下新建文件夹:components,components下新建:Header/index.jsx,即Header组件。
代码变更涉及的文件有:
- components/Header/index.jsx,即Header组件
- App.js,即App组件
Header/index.jsx(Header组件)
import React, { Component } from 'react';
export default class Header extends Component {
render() {
return (
<div className="row">
<div className="col-xs-offset-2 col-xs-8">
<div className="page-header"><h2>Vue Router Demo</h2></div>
</div>
</div>
);
}
}
App.js(App组件)
import React, { Component } from 'react'
import {NavLink,Route} from "react-router-dom";
import About from "./pages/About";
import Home from "./pages/Home";
import Header from "./components/Header";
export default class App extends Component {
render() {
return (
<div>
<Header/>
<div className="row">
<div className="col-xs-2 col-xs-offset-2">
<div className="list-group">
<NavLink className="list-group-item" activeClassName='active' to="/about">About</NavLink>
<NavLink className="list-group-item" activeClassName='active' to="/home">Home</NavLink>
</div>
</div>
<div className="col-xs-6">
<div className="panel">
<div className="panel-body">
<Route path="/about" component={About}></Route>
<Route exact path="/home" component={Home}></Route>
</div>
</div>
</div>
</div>
</div>
)
}
}
新增导航与路由
以上路由实例,导航栏有:Home、About,现在需新增如下导航及其展示内容:
- Business(业务),/business->Business组件
- Employees(员工),/employees->Employees组件
- Investors(投资者),/investors->Investors组件
- Media(媒体),/media->Media组件
代码变更涉及的文件有
- pages文件夹下新增:Business/index.jsx,即Business组件
- pages文件夹下新增:Employees/index.jsx,即Employees组件
- pages文件夹下新增:Investors/index.jsx,即Investors组件
- pages文件夹下新增:Media/index.jsx,即Media组件
- 修改App.js,变更部分:路由链接、路由注册。
Business/index.jsx(Business组件)
import React, { Component } from 'react'
export default class Business extends Component {
render() {
return (
<h2>我是Business的内容</h2>
)
}
}
Employees/index.jsx(Employees组件)
import React, { Component } from 'react'
export default class Employees extends Component {
render() {
return (
<h2>我是Employees的内容</h2>
)
}
}
Investors/index.jsx(Investors组件)
import React, { Component } from 'react'
export default class Investors extends Component {
render() {
return (
<h2>我是Investors的内容</h2>
)
}
}
Media/index.jsx(Media组件)
import React, { Component } from 'react'
export default class Media extends Component {
render() {
return (
<h2>我是Media的内容</h2>
)
}
}
App.js
import React, { Component } from 'react'
import {NavLink,Route} from "react-router-dom";
import About from "./pages/About";
import Home from "./pages/Home";
import Business from "./pages/Business";
import Employees from "./pages/Employees";
import Investors from "./pages/Investors";
import Media from "./pages/Media";
import Header from "./components/Header";
export default class App extends Component {
render() {
return (
<div>
<Header/>
<div className="row">
<div className="col-xs-2 col-xs-offset-2">
<div className="list-group">
<NavLink className="list-group-item" activeClassName='active' to="/about">About</NavLink>
<NavLink className="list-group-item" activeClassName='active' to="/home">Home</NavLink>
<NavLink className="list-group-item" activeClassName='active' to="/business">Business</NavLink>
<NavLink className="list-group-item" activeClassName='active' to="/employees">Employees</NavLink>
<NavLink className="list-group-item" activeClassName='active' to="/investors">Investors</NavLink>
<NavLink className="list-group-item" activeClassName='active' to="/media">Media</NavLink>
</div>
</div>
<div className="col-xs-6">
<div className="panel">
<div className="panel-body">
<Route path="/about" component={About}></Route>
<Route exact path="/home" component={Home}></Route>
<Route exact path="/business" component={Business}></Route>
<Route exact path="/employees" component={Employees}></Route>
<Route exact path="/investors" component={Investors}></Route>
<Route exact path="/media" component={Media}></Route>
</div>
</div>
</div>
</div>
</div>
)
}
}
封装NavLink
封装NavLink的第一种方式
components下新建:MyNavLink/index.jsx,用于封装NavLink。
代码变更涉及的文件有:
- components/MyNavLink/index.jsx,即MyNavLink组件
- App.js,即App组件
MyNavLink/index.jsx(MyNavLink组件)
import React, { Component } from 'react'
import { NavLink } from 'react-router-dom'
export default class index extends Component {
render() {
const {title,...theOtherProps} = this.props;
return <NavLink className="list-group-item" activeClassName='active' {...theOtherProps}>{title}</NavLink>
}
}
App.js(App组件)
import React, { Component } from 'react'
import {Route} from "react-router-dom";
import About from "./pages/About";
import Home from "./pages/Home";
import Business from "./pages/Business";
import Employees from "./pages/Employees";
import Investors from "./pages/Investors";
import Media from "./pages/Media";
import Header from "./components/Header";
import MyNavLink from "./components/MyNavLink";
export default class App extends Component {
render() {
return (
<div>
<Header/>
<div className="row">
<div className="col-xs-2 col-xs-offset-2">
<div className="list-group">
<MyNavLink to="/about" title="About"/>
<MyNavLink to="/home" title="Home"/>
<MyNavLink to="/business" title="Business"/>
<MyNavLink to="/employees" title="Employees"/>
<MyNavLink to="/investors" title="Investors"/>
<MyNavLink to="/media" title="Media"/>
</div>
</div>
<div className="col-xs-6">
<div className="panel">
<div className="panel-body">
<Route path="/about" component={About}></Route>
<Route exact path="/home" component={Home}></Route>
<Route exact path="/business" component={Business}></Route>
<Route exact path="/employees" component={Employees}></Route>
<Route exact path="/investors" component={Investors}></Route>
<Route exact path="/media" component={Media}></Route>
</div>
</div>
</div>
</div>
</div>
)
}
}
封装NavLink的第二种方式
代码变更涉及的文件有:
- components/MyNavLink/index.jsx,即MyNavLink组件
- App.js,即App组件
MyNavLink/index.jsx(MyNavLink组件)
import React, { Component } from 'react'
import { NavLink } from 'react-router-dom'
export default class index extends Component {
console.log(this.props);
render() {
return <NavLink className="list-group-item" activeClassName='active' {...this.props}/>
}
}
App.js(App组件)
import React, { Component } from 'react'
import {Route} from "react-router-dom";
import About from "./pages/About";
import Home from "./pages/Home";
import Business from "./pages/Business";
import Employees from "./pages/Employees";
import Investors from "./pages/Investors";
import Media from "./pages/Media";
import Header from "./components/Header";
import MyNavLink from "./components/MyNavLink";
export default class App extends Component {
render() {
return (
<div>
<Header/>
<div className="row">
<div className="col-xs-2 col-xs-offset-2">
<div className="list-group">
<MyNavLink to="/about">About</MyNavLink>
<MyNavLink to="/home">Home</MyNavLink>
<MyNavLink to="/business">Business</MyNavLink>
<MyNavLink to="/employees">Employees</MyNavLink>
<MyNavLink to="/investors">Investors</MyNavLink>
<MyNavLink to="/media">Media</MyNavLink>
</div>
</div>
<div className="col-xs-6">
<div className="panel">
<div className="panel-body">
<Route path="/about" component={About}></Route>
<Route exact path="/home" component={Home}></Route>
<Route exact path="/business" component={Business}></Route>
<Route exact path="/employees" component={Employees}></Route>
<Route exact path="/investors" component={Investors}></Route>
<Route exact path="/media" component={Media}></Route>
</div>
</div>
</div>
</div>
</div>
)
}
}
React组件的标签体内容是一个特殊的标签属性:children。
看下console控制台打印出的东西就知道了,如下。