react从0到1的探索记录04

18、React中的路由

React中路由的基本使用
  • 在react中使用路由首先需要安装react的路由模块 npm install react-router-dom -S。
  • 在项目主入口文件index.js或根组件处导入。
import {HashRouter,Route,Link} from 'react-router-dom'

HashRouter:表示路由的根容器,将来所有跟路由相关的内容都需要包裹在HashRouter里面,一个网站中只需要一个HashRouter就好。
Route 路由规则,有两个重要的属性 path和component。
Link表示路由的连接,相当于Vue中的<router-link-to=""></router-link>
使用实例

index.js

import React from 'react'
import ReactDom from 'react-dom'
import App from '@/components/App'


ReactDom.render(<div>
    <App></App>
</div>,document.getElementById('app'))

根组件

import React from 'react'
import Home from '@/components/Home'
import Movie from '@/components/Movie'
import About from '@/components/About'

//在react中使用路由需要安装路由模块 npm install react-router-dom -S,之后需要在主入口将其导入
import {HashRouter,Route,Link} from 'react-router-dom'
//HashRouter表示路由的根容器,将来所有跟路由相关的内容都需要包裹在HashRouter里面,一个网站中只需要一个HashRouter就好
//Route 路由规则,有两个重要的属性 path和component
//Link表示路由的连接,相当于Vue中的<router-link-to=""></router-link>

export default class App extends React.Component{
    constructor(props){
        super(props)
        this.state = {}
    }
    render(){
        //用HashRouter来包裹根组件, 为当前网站启用路由,在HashRouter中只能有唯一一个根元素,如此处的div
        return <HashRouter>
            <div>
                <h3>我是网站App的根组件</h3>
                <Link exact to = "/">首页</Link>&nbsp;&nbsp;
                <Link to = "/movie">电影</Link>&nbsp;&nbsp;
                <Link to = "/about">我的</Link>&nbsp;&nbsp;
                <hr/>
                {/* 添加路由规则,path表示匹配的路由,component表示需要展示的组件*/}
                {/* 在Vue中有<router-view></router-view>这样的路由标签,专门用来放匹配到的路由组件,在react中,没有router-view,而是直接使用Route标签来当做占位符。 */}
                {/* react中的Route有两种身份,首先是路由规则,其次还是占位符 */}
                {/* 这里的exact是精确匹配的意思,比如我们有多层路由进行嵌套时,exact可以帮助我们精确匹配到你想跳转的路由。exact的值为bool型,为true是表示严格匹配,为false时为正常匹配 */}
                <Route exact path = "/" component = {Home}></Route>
                <Route path = "/movie" component = {Movie}></Route>
                <Route path = "/about" component = {About}></Route>
            </div>
        </HashRouter>
    }
}

其他组件
以Home组件为例

import React from 'react'

export default class Home extends React.Component{
    constructor(props){
        super(props)
        this.state = {}
    }
    render(){
        return <div>
            <h4>我是首页</h4>
        </div>
    }
}
路由传参,匹配路由参数

在路由规则中向movie组件中传参如下

import React from 'react'
import Home from '@/components/Home'
import Movie from '@/components/Movie'
import About from '@/components/About'

//在react中使用路由需要安装路由模块 npm install react-router-dom -S,之后需要在主入口将其导入
import {HashRouter,Route,Link} from 'react-router-dom'
//HashRouter表示路由的根容器,将来所有跟路由相关的内容都需要包裹在HashRouter里面,一个网站中只需要一个HashRouter就好
//Route 路由规则,有两个重要的属性 path和component
//Link表示路由的连接,相当于Vue中的<router-link-to=""></router-link>

export default class App extends React.Component{
    constructor(props){
        super(props)
        this.state = {}
    }
    render(){
        //用HashRouter来包裹根组件, 为当前网站启用路由,在HashRouter中只能有唯一一个根元素,如此处的div
        return <HashRouter>
            <div>
                <h3>我是网站App的根组件</h3>
                <Link to = "/">首页</Link>&nbsp;&nbsp;
                <Link to = "/movie/top100/5">电影</Link>&nbsp;&nbsp;
                <Link to = "/about">我的</Link>&nbsp;&nbsp;
                <hr/>
                
                {/* 添加路由规则,path表示匹配的路由,component表示需要展示的组件*/}
                {/* 在Vue中有<router-view></router-view>这样的路由标签,专门用来放匹配到的路由组件,在react中,没有router-view,而是直接使用Route标签来当做占位符。 */}
                {/* react中的Route有两种身份,首先是路由规则,其次还是占位符 */}
                {/* 默认情况下,react中的路由是模糊匹配的,如果路由可以部分匹配成功,就会展示这个路由对应的组件 */}
                {/* 这里的exact是精确匹配的意思,比如我们有多层路由进行嵌套时,exact可以帮助我们精确匹配到你想跳转的路由。exact的值为bool型,为true是表示严格匹配,为false时为正常匹配 */}
                {/* 在路由中想要传递参数可以在匹配规则中使用:修饰符,表示这个位置匹配到的是参数 */}
                {/* 这里添加的replace的作用去除警告  Warning: Hash history cannot PUSH the same path; a new entry will not be added to the history stack */}
                <Route exact path = "/" component = {Home}></Route>
                <Route exact path = "/movie/:type/:id" component = {Movie} replace></Route>
                <Route path = "/about" component = {About}></Route>
            </div>
        </HashRouter>
    }
}

Movie组件中获取路由中传递的参数

import React from 'react'

export default class Movie extends React.Component{
    constructor(props){
        super(props)
        this.state = {
            routeParams:props.match.params
        }
    }
    render(){
        // 如果想要在路由规则中提取匹配的参数进行使用可以使用this.props.match.params来访问
        console.log(this.props.match.params)
        return <div>
            <h4>我是电影 参数为{this.state.routeParams.type}---{this.state.routeParams.id} </h4>
        </div>
    }
}
React中antd的使用
  • antd是什么
    antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。
  • 为React项目启用Ant Design组件
    1、安装 npm install antd -S
    2、在主入口文件引入antd的样式表 import 'antd/dist/antd.css
    3、在想使用antd组件的react组件中将antd组件导入
    4、将导入的antd组件以标签的方式丢到使用的位置即可
  • antd组件的按需导入
    如果在引用第三方框架的时候,将整个css全部引入进来,虽然是可以的,但是打包之后的文件体积显得过大
    有时候我们只引用了某个组件,那么这时再将整个的样式表全部引入就显得不是那么合适,所以可以通过配置将所需的样式按需自动加载,同时也避免了在主入口文件引入样式表。
    实现按需导入的方式
    1、安装用于按需加载组件代码和样式的 babel 插件。npm install babel-plugin-import
    2、在.babellrc中的plugins中添加如下配置 ["import", { "libraryName": "antd", "style": "css" }]或者在babel-loader中配置
    在.babellrc中配置如下
{
"presets":["env","stage-0","react"],
"plugins":["transform-runtime",["import", { "libraryName": "antd", "style": "css" }]]
}
React中使用antd组件,并实现按需加载的实例

index.js

import React from 'react'
import ReactDom from 'react-dom'
import Appone from '@/components/Appone'
//导入Ant-Design的样式表
// import 'antd/dist/antd.css'
//如果在引用第三方框架的时候,像上面这样将整个css全部引入进来,虽然是可以的,但是打包之后的文件体积显得过大
//有时候我们只引用了某个组件或者ui,那么这时再将整个的样式表全部引入就显得不是那么合适,所以可以通过配置将所需的样式按需自动加载
//同时也避免了在主入口文件引入样式表

//实现按需加载的方式
//1、安装用于按需加载组件代码和样式的 babel 插件npm install babel-plugin-import
//2、在.babellrc中的plugins中添加如下配置 ["import", { "libraryName": "antd", "style": "css" }]


ReactDom.render(<div>
    <Appone></Appone>
</div>,document.getElementById('app'))

Appone.jsx

import React from 'react'
import locale from 'antd/es/date-picker/locale/zh_CN'
import {DatePicker} from 'antd'

export default class Appone extends React.Component{
    constructor(props){
        super(props)
        this.state = {}
    }
    render(){
        return <div>
            <h3>使用ant-design</h3>
            <DatePicker locale = {locale}></DatePicker>
        </div>
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容