bunny笔记|React学习-AntDesign组件库(UI)和Router的理解与运用

AntDesign

官网
AntDGithub

作用:
提供丰富、高质量的组件(开箱即用,使用typescript构建,提供完整的类型定义文件,全链路开发和设计工具体系)
react+antDesign可以理解为 React定制的UI组件库

使用:
安装 npm install antd --save yarn add antd
引入样式文件
引入UI组件

按需加载
(1)原因
虽然组件成功运行起来了,但实际上加载了全部的antd 组件的样式,会影响前端的性能,借助react-app-rewired进行自定义配置
(2)方法
1)引react-app-rewired 并修改package.json 里的启动配置 yarn add react-app-rewired customize-cra
2)配置package.json文件步骤
3)在项目根目录创建一个config-overrides.js用于修改默认配置
4)安装用于按需加载组件代码和样式的babel插件yan add babel-plugin-import

React-Router

概念:
1)什么是路由?我想去应用的某个页面,通过路由就可以帮助跳转到对应的页面
V4.x版本中:
react-router是浏览器和原生应用的通用部分,
react-router被分为几部分
react-router-dom是用于浏览器的
react-router-native是用于原生应用的

React router v4.x特性
1)路由不再是集中在一个文件,它成了应用布局、UI的一部分;
2)浏览器用的router在react-router-dom里;所以,浏览器里使用的时候只需要importreact-router-dom就可以:
3)增加了BrowerRouter和HashRouter
4)v4的路由默认不再排他,会有多个四配;而v3是默认排他的,只会有一个匹配被使用。
5)不再使用{props.children}来处理嵌套的路由

使用:
安装:我们使用react开发web应用,所以只需要安装react-router-dom yarn add react-router-dom

Route组件
通过Route组件可以在需要匹配某个路径的时候绘制一个组件日 <Route exact path="/" component={MainPage) />
常用属性
path属性,字符串类型,它的值就是用来匹配url的
component属性,它的值是一个组件。在path匹配成功之后会绘制这个组件
exact属性,用来指明这个路由是不是排他的匹配
strict属性,用来指明路径只匹配以斜线结尾的路径
....

Link组件
1)Link是reactrouterv4特有的一个组件,是用来代替上一版的anchorlink:
2)使用Link可以在React应用的不同页面之间跳转;
3)与anchorlink会重新加载整个页面不同,Link只会重新加载页面里和当前url可以匹配的部分

BorwserRouter和HashRouter
BrowserRouter:
对Router接口的实现,使得页面和浏览器的history保持一致;如:window.location
HashRouter:
也是对Router接口的实现,只是使用的是ur的hash部分,比如:window.location.hash
区别:
1)如果是非静态站点,要外理各种不同的ur,则需要使用BrowserRouter
2)如果是静态站点,只需要匹配静态url,则使用HashRouter即可

动态路由配置
<Route path="/hot/:hid"component={Hot) />
2)对应动态路由加载的组件里获取传值。 thispropsmatch.params
3)跳转传值

路由重定向
1)引入 import {Redirect) from "react-router-dom"
2)定义标记(flag) this.state ={ loginFlag: false}
3)render中判断,决定是否跳转 if(this.state.loginFlag){return <Redirect to={{pathname:"/"}}/>
4)执行JS实现跳转 改变状态

demo理解Router

结果展示:

Router.png

router2.png

1)一级路由的使用:
在React APP的src下新建一个components文件夹,新建Home.jsx、Student.jsx、User.jsx

.jsx文件内部代码的基础格式:

import React, {Component} from 'react'; 

export default class Home extends Component{
    constructor(props){
        super(props);
        this.state={}
    }
    
    render(){
        return(
        <div>首页</div>
        )
    }
}
import React, {Component} from 'react';

export default class Student extends Component{
    constructor(props){
        super(props);
        this.state = {}
    }

    render() {
        return (
            <div className="student">
                学生中心
            </div>
        )
    }
}
import React, {Component} from 'react';
import {Route, Link} from "react-router-dom";

export default class User extends Component{
    constructor(props){
        super(props);
        this.state = {}
    }

    render() {
        console.log(this.props.routes);
        return (
            <div>
            个人中心
            </div>
        )
    }
}

2)然后再到app.js中引入

import React, {Component} from 'react';
import './assets/index.css'
import {BrowserRouter as Router, Route, Link} from "react-router-dom";

import Home from './components/Home'
import Student from './components/Student'
import User from './components/User'

class App extends Component {
    render(){
        return(
        <Router>
            <div>
            <header className="title">
             //后指定Link的to对应去到的组件模块
                <Link to="/">页面主页</Link>
                <Link to="/stu">学生中心</Link>
                <Link to="/user">个人中心</Link>
            </header>
            
            //先Route path componnet引入对应组件模块(只有一个页面要exact排他)
            <Router exact path="/" component={Home}>
            <Router path="/stu/" component={Student}>
            <Router  path="/user/" component={User}>
            </div>
        <Router>
        )
    }
}

export default App;

优化路由的引入方式(推荐)

import React, {Component} from 'react';
import './assets/index.css'
import {BrowserRouter as Router, Route, Link} from "react-router-dom";

import Home from './components/Home'
import Student from './components/Student'
import User from './components/User'

let routes=[
{path="/" component=Home,exact:true},
{path="/stu" component=Student},
{path="/user" component=User}
];

class App extends Component {
    render(){
        return(
        <Router>
            <div>
            <header className="title">
                <Link to="/">页面主页</Link>
                <Link to="/stu">学生中心</Link>
                <Link to="/user">个人中心</Link>
            </header>
            
            {
                router.map((route,key)={
                    if(route.exact){
                        return <Router key={key} exact path={route.path} component={route.component}/>
                    }else{
                        return <Router key={key}  path={route.path} component={route.component}/>
                    }
                })
            }
            
            </div>
        <Router>
        )
    }
}

export default App;

3)二级路由(User.js为案例)

import React, {Component} from 'react';
import {Route, Link} from "react-router-dom";

export default class User extends Component{
    constructor(props){
        super(props);
        this.state = {}
    }

    render() {
        console.log(this.props.routes);
        return (
            <div className="user">
                <div className="content">
                    <div className="left">
                        <Link to="/user/">主面板</Link>
                        <br/>
                        <br/>
                        <Link to="/user/info">用户信息</Link>
                    </div>
                    <div className="right">
                     {/* <Route exact path={`${this.props.match.url}/` component={Main}}/>
                        <Route exact path={`${this.props.match.url}/Info` component={Info}}/> */}
                        {
                            this.props.routes.map((route, key)=>{
                                return  <Route key={key} exact path={route.path} component={route.component} />
                            })
                        }
                    </div>
                </div>
            </div>
        )
    }
}

注意:不要忘记引入 import {Route, Link} from "react-router-dom";

4)封装路由。 新建一个routes文件夹,生成index.js文件

import Home from "./../components/Home";
import Student from "./../components/Student";
import User from "./../components/User";
import Info from './../components/User/Info';
import Main from './../components/User/Main';

let routes={
    {path:"/",component:Home,exact:true},
    {path:"/stu",component:Student},
    //含二级路由
    {
    path:"/user",
    component:User,
    routes:[
    {path:"/user/",component:Main},
    {path:"/user/info",component:Info}
    ]
        
    }
}

export default routes;

在APP.js中引入,并优化App.js代码。

import React, {Component} from 'react';
import './assets/index.css'
import {BrowserRouter as Router, Route, Link} from "react-router-dom";
import routes from './routes/index';

class App extends Component {
    render() {
        return (
            <Router>
                <div>
                    <header className="title">
                        <Link to="/">页面主页</Link>
                        <Link to="/stu">学生中心</Link>
                        <Link to="/user">个人中心</Link>
                    </header>
                    {
                        routes.map((route, key)=>{
                            if(route.exact){
                                return  (
                                    <Route
                                    key={key}
                                    exact
                                    path={route.path}
                                    render={props=>(
                                        <route.component {...props}  routes={route.routes}/>
                                    )}
                                />)
                            }else {
                                return  (
                                    <Route
                                        key={key}
                                        path={route.path}
                                        render={props=>(
                                            <route.component {...props}  routes={route.routes}/>
                                        )}
                                    />)
                            }
                        })
                    }
                </div>
            </Router>
        );
    }
}

export default App;

components/User/Main.jsx

import React, {Component} from 'react';

export default class Main extends Component{
    constructor(props){
        super(props);
        this.state = {}
    }

    render() {
        return (
            <div>
               用于展示用户的主要信息
               <li>姓名</li>
               <li>联系方式</li>
            </div>
        )
    }
}

components/User/Info.jsx

import React, {Component} from 'react';

export default class Info extends Component{
    constructor(props){
        super(props);
        this.state = {}
    }

    render() {
        return (
            <div>
                <li>姓名</li>
                <li>性别</li>
                <li>年龄</li>
                <li>联系方式</li>
                <li>居住地址</li>
                <li>兴趣爱好</li>
                <li>技能证书</li>
            </div>
        )
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容