侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130555 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

react 入门到放弃 之 react-router

2024-05-10 星期五 / 0 评论 / 0 点赞 / 7 阅读 / 7863 字

前言 文章是本人自己的学习笔记 本篇为 react-router 之前还写有 react 入门到放弃 之 webpack 1.react-router的安装 npm install reac

前言

文章是本人自己的学习笔记  本篇为 react-router  

之前还写有 react 入门到放弃 之 webpack

1.react-router的安装

  npm install react-router —save

  版本:"react-router": "^2.4.1"

2.用法

入口文件

import ReactDOM from 'react-dom';import React from 'react';import MyRouter from './components/MyRouter.jsx';import './sass/main.scss';ReactDOM.render(  <MyRouter/>,  document.getElementById('root'));

首先在自己的程序入口 引入自己写的jsx的文件  将路由写成单独的文件 方便维护

我的demo设计参考了 其他作者的demo  不过他的示例版本好像有问题 在我的版本中出错了

其中 页面区分为 头部  底部  中间部分  头部有导航 导航会替换掉中间部分的内容

导航为 书籍列表  电影列表  其他页面

点击 书籍列表->书籍列表->书籍详情   电影同理

MyRouter.jsx

import React, {Component} from 'react';import { hashHistory , Router, Route, Link , IndexRoute} from 'react-router';import Main from './Main.jsx';import Book from './Book.jsx';    //书籍详情import Books from './Books.jsx';  //书籍列表import Movie from './Movie.jsx';  //电影详情import Movies from './Movies.jsx';//电影列表import One from './One.jsx';      //单独页面import NoThing from './NoThing.jsx'; //404class MyRouter extends Component {    render() {        return (                       <Router history={ hashHistory}>                {/** history={ hashHistory} 不写这个就报错 */}                {/** React Router 是建立在 history 之上的。                     简而言之,一个 history 知道如何去监听浏览器地址栏的变化,                     并解析这个 URL 转化为 location 对象,                 然后 router 使用它匹配到路由,最后正确地渲染对应的组件。 */}                                                <Route path='/' component = {Main} >                {/**配置根目录的jsx  会根据 下面的Route的path 内容 拿到相应组件 传给Main                     Main 中通过 {this.props.children} 获取到组件 */}                                    <IndexRoute component={Books}/>                    {/**默认情况下 {this.props.children} 没有数据 IndexRoute 为设置默认组件 */}                                        <Route path='movies' component = {Movies} />                                             <Route path='movie/:mid/:tid' component = {Movie} />                                        <Route path='books' component = {Books} />                                             <Route path='book/:bid' component = {Book} />                                        </Route>                {/**一个单独的路由 跳转到单独的页面 页面可以为活动页面 */}                <Route path='one' component = {One} >                </Route>                {/** 其他路由 没有设置的路由 404 */}                <Route path="*" component={NoThing}/>           </Router>                                    );    }}export default MyRouter;

 最外围 需要 Router 标签 并且history={ hashHistory}

<Route path='/' component = {Main} > 意思为根目录 中间嵌套的 Route  当连接指向 movies之类的 会将movies 页面 传给 Main页面 

Main 页面 

import React, {Component} from 'react';import Footer from './public/Footer.jsx';import Header from './public/Header.jsx';class Main extends Component {    render() {        return (            <div>                <Header/>                {this.props.children}                <Footer/>            </div>        );    }}export default Main;

页面通过 {this.props.children} 获取传入的页面信息 渲染

我们看导航的header页面 

import React, {Component} from 'react';import { Link } from 'react-router'class Header extends Component {    render() {        return (            <div className='Header'>                <ul>                    <a href='#books'>书籍</a>                    <a href='#movies'>电影</a>                    <a href='#one'>单独页面</a>                </ul>            </div>        );    }}export default Header;

会根据 href 匹配 路由上的path 然后拿到 对应的页面 传给 Main

如果路由需要带参数  比如 Books页面

import React, {Component} from 'react';import {  Link } from 'react-router';class Books extends Component {    render() {        return (            <div>                <a href='#book/123'>测试书籍</a>                <a href='#book/1234'>js修炼之道</a>                <a href='#book/12345'>不可描述之书</a>            </div>        );    }}export default Books;

点击书籍 需要带参数  123   1234 之类的 给 书籍详情页面 

路由需要 这么写 <Route path='book/:bid'  …

如果多个参数 <a href='#movie/12345/nnd'>马赛克的艺术</a>

路由:<Route path='movie/:mid/:tid' 

详情页面获取参数:我是电影详情 {this.props.params.mid} {this.props.params.tid}

上面这种传递数据 可行  但是  不可取

如果参数过多 那么要设置很长  而且 频繁维护 router  下面说下 高效的方式

import {  Link } from 'react-router';
<Link to={{ pathname: '/book/23', query: { bid: 'query' } ,state:{ ssd : 'ttt'}}} >测试书籍</Link>

Link 是 react-router 提供的 跳转的组件 其实就是包装了a标签   

pathname 其实就是之前写的a标签的href   真正的参数 应该写在 query 或者 state 

query和state的区别呢   query对象参数 会在导航显示  state不会 或者说 state被包装了

获取query  state 的参数  在book中  用  this.props.location.query  this.props.location.state 获取 

还有不通过a标签 或者 Link标签跳转的方式  在被router管理的jsx里 可以通过js的方式跳转  在props 里获取 history

this.props.history.push({ pathname: '/book/23', query: { bid: 'query' } ,state:{ ssd : 'ttt'}});或this.props.history.replace({ pathname: '/book/23', query: { bid: 'query' } ,state:{ ssd : 'ttt'}});

3.demo地址

http://git.oschina.net/huanggua/react-router-Demo

https://git.oschina.net/huanggua/react-router-Demo.git

 

广告 广告

评论区