react-route4 学习记录

时间:2021-11-27 07:14:55

新建项目

create-react-app react20180413

安装路由

npm install react-router-dom -S

跑通路由

删除全部文件后 重新新建index.js
代码如下
import React from 'react';
import ReactDOM from 'react-dom';
import {
// HashRouter as Router, //容器 带#
BrowserRouter as Router, //容器 推荐用这个
Route //一条路由
} from 'react-router-dom'; function Home () {
return <h1>Home</h1>
}
function User () {
return <h1>User</h1>
} ReactDOM.render(
<Router>
<div>
<Route path='/user' component={User} />
<Route path='/home' component={Home} />
</div>
</Router>,document.querySelector('#root')
); ** 有时候 会报错 A <Router> may have only one child element
** 这个是 说 一个Router 下面只 允许 一个 子组件 所以 <Router> 下面得有一个 <div>包裹起来
可以从外部引入组建 Home User
新建User.js Home.js
例:
import React,{Component} from 'react';
export default class Home extends Component{
render(){
return (
<div>
Home
</div>
)
}
};

子页面还可以嵌套路由

import React,{Component} from 'react';
import {
Route, //一条路由
Link
} from "react-router-dom";
import UserList from './UserList';
import UserAdd from './UserAdd';
import UserDetail from './UserDetail';
export default class User extends Component{
render(){
return (
<div className="row">
<div className="col-sm-2">
<ul className="nav nav-stacked">
<li><Link to="/user/list">用户列表</Link></li>
<li><Link to="/user/add">新增用户</Link></li>
</ul>
</div>
<div className="col-sm-10">
<ul className="nav nav-stacked">
<Route path="/user/list" component={UserList}/>
<Route path="/user/add" component={UserAdd}/>
<Route path="/user/detail/:id" component={UserDetail}/>
</ul>
</div>
</div>
)
}
};

路由传递参数 直接在后面追加 /name

  <Link key={index} to={"/user/detail/" + user.id}><button className="list-group-item">{user.name}</button></Link>

路由参数获取

  在 this.props  是个数组在它里面 有以下参数
history 跳转路径 路径
{
history:action:"PUSH"
block:ƒ block()
createHref:ƒ createHref(location)
go:ƒ go(n)
goBack:ƒ goBack()
goForward:ƒ goForward()
length:50
listen:ƒ listen(listener)
location:{pathname: "/user/detail/1524472305217", search: "", hash: "", state: undefined, key: "xekkjj"}
push:ƒ push(path, state)
}
location 当前路径的信息
{
push:ƒ push(path, state)
replace:ƒ replace(path, state)
__proto__:Object
location:hash:""
key:"xekkjj"
pathname:"/user/detail/1524472305217" //当前路径
search:""
state:undefined
}
match 匹配结果 如果 匹配上就是 对象 匹配不上就是 null
{
isExact:true // 是否是 精确匹配
params:{id: "1524472305217"} //路径参数
path:"/user/detail/:id"
url:"/user/detail/1524472305217"
} let id = this.props.match.params.id;
这样就可以拿到 列表页面传过来的 参数

另外一种渲染方式 匿名组件声明方式

    <Route path="/" render={props => <div>新的渲染方式</div>} />

    相当于

    在 class  之外  定义一个变量
let Hello = (props) = > {
return <div>组建</div>
}
<Route path="/" component={Hello} />

精确匹配 -> exact

   <Route exact path="/" component={Hello} />

Switch 路由 从上往下匹配 若匹配到一个 下面的就不回去匹配了 更不会去渲染了

import React from "react";
import {
// HashRouter as Router, //容器
BrowserRouter as Router, //容器
Route, //一条路由
Link,
} from "react-router-dom"; import "bootstrap/dist/css/bootstrap.css";
import User from "./User";
import Home from "./Home";
import Profile from "./Profile"; export default (
<Router >
<div>
<nav className="navbar navbar-inverse">
<div className="container-fluid">
<div className="navbar-header">
<div className="navbar-brand">
router
</div>
</div>
<ul className="nav navbar-nav">
<li><Link to="/home">首页</Link></li>
<li><Link to="/user">用户管理</Link></li>
<li><Link to="/profile">个人设置</Link></li>
</ul>
</div>
</nav>
<div className="container">
<div className="row">
<div className="col-sm-12">
<Switch>
<Route path="/" render={props => <div>首页</div>}/>
<Route path="/:name" render={props => <div>{props.match.params.name}</div>} />
<Route path="/home" component={Home}/>
<Route path="/user" component={User}/>
<Route path="/profile" component={Profile}/>
</Switch>
</div>
</div>
</div>
</div>
</Router>
)

实现 登录 和 退出

  1. 自己新建一个 组建 去写判断的规则
  2. 当通过函数来定义组件的时候参数是属性对象
  3. 当一个组件不需要状态的时候可以用函数来声明
当用户访问个人设置的时候,先判断此用户是否登录.如果已经登录则可以直接显示个人设置页面.如果此用户未登录,那么则跳转到登录页面进行登录,如果登录成功则自动跳转回登录前的页面
  • 代码如下
/*
* 结构赋值
* props = {path:"/profile",component:Profile}
* ...rest 其余运算符
* rest = {path:"/profile"}
*/
import React from 'react';
import {Redirect,Route} from 'react-router-dom'; //Redirect 重定向 export default function ({component:Component,...rest}) {
// ...rest 展开
return <Route {...rest} render={ (props) =>
sessionStorage.getItem('login')?<Component />:<Redirect to={{
//跳到哪里
pathname:'/login',
// 记录从哪里调过来的,后面取的时候会从这里取
state:{from:props.location.pathname}
}} />
} />
}
跳到login页面
import React from 'react';
export default function (props) {
return <div className="jumbotron">
<div className="container">
<h1>Hello!</h1>
<p>你还没登录,请登录!</p>
<p><button className="btn btn-primary btn-lg"
onClick={ () => {
sessionStorage.setItem('login','true');
props.history.push(props.location.state.from);
}}
>登录</button></p>
</div>
</div>
}
  • 点击按钮后 跳到 之前重定向前的页面 props.history.push(props.location.state.from);

route -> children 不管当前路径是否匹配的上,都会渲染对应的组件

import React from "react";
import {Route,Link} from "react-router-dom";
export default function ({to,label}) {
return (
//不管匹配不匹配都会去return 出东西
<Route path={to} children={({match}) => {
console.log(match)
//若匹配则 给一个选中的类名
return <li className={match?'active':''}><Link to={to} >{label}</Link></li>
}}/> )
}

route -> Prompt 路径跳转的 时候进行的提示

  • <Prompt when = {this.state.blockimg} message = { () => { return 你确定要离开本页面; }} />
  • Prompt 有两个参数 第一个 when 什么时候提示 传入bool类型
  •                第二个 message  提示什么内容
    
import React,{Component} from 'react';
import {Prompt} from "react-router-dom";
export default class UserAdd extends Component{
constructor (props) {
super(props);
this.state = {
blockimg : false, //是否组织跳转 默认不阻止
}
}
//点击提交按钮时
handleSubmit = () =>{
let name = this.name.value;
console.log(name);
// 从缓存中获取用户列表的字符串 null 字符串
let userStr = localStorage.getItem('users');
let users = userStr?JSON.parse(userStr):[];
//添加字符串对象
users.push({id:Date.now(),name});
//存到缓存
localStorage.setItem('users',JSON.stringify(users));
//把离开本页面的提示关掉
this.setState({
blockimg:false
},()=>{
//跳转到用户列表
this.props.history.push('/user/list');
});
}
//input 改变的时候
handleChange = (event) => {
let value = event.target.value;
this.setState({
blockimg:value&&value.length>1?true:false
});
}
render(){
return (
<div>
<Prompt
when = {this.state.blockimg}
message = { (location) => {
return `你确定要离开本页面${location.pathname}`;
}}
/>
<form onSubmit={this.handleSubmit}>
<div className="input-group">
<input type="text" className="form-control" placeholder="请输入用户姓名" onChange={this.handleChange} ref={ref=>this.name=ref} />
<span className="input-group-btn">
<button className="btn btn-primary" type="submit">添加</button>
</span>
</div>
</form>
</div>
)
}
};

404 页面

import React from 'react';
export default (props) => {
return <div className="jumbotron">
<div className="container">
<h1>抱歉!</h1>
<p>没找到您访问的页面!</p>
<p><button className="btn btn-primary btn-lg"
onClick={ () => {
props.history.push('/');
}}
>点击跳回首页</button></p>
</div>
</div>
}
  • 在 app页面引用
    <Route component={Notfound}/>

react-route4 学习记录的更多相关文章

  1. React Native学习记录

    1.端口问题 在调试的时候,监听的是8081端口.如果被占用,会报错,并且在reload的时候导致app直接崩掉. 2.插件网站收集 https://nativebase.io/ https://js ...

  2. ES6学习记录

    前言 由于要学习React Native ,所以得用到ES6,故为运用React Native做一个铺垫 学习记录 一.变量 1.let let 与 var 作用相同,用于定义变量,但是作用域不同.不 ...

  3. iOS、swift、React Native学习常用的社区、论坛

    <!----iOS> <!----Swift>*IOS开发常用社区:http://code4app.com/ *IOS开发常用社区:http://www.cocoachina. ...

  4. React Ntive 学习手记

    React使今年来比较热门的前端库,之所以说是库呢,因为React.js是应用于MVC中的V层, 它并不是一个完整的MVC框架,所以,我也不知称之为框架了. 不过这并不影响React的火热. 混合应用 ...

  5. react native 学习一&lpar;环境搭配和常见错误的解决&rpar;

    react native 学习一(环境搭配) 首页,按照http://reactnative.cn/docs/0.30/getting-started.html#content上的介绍,下载安装pyt ...

  6. 前端学习记录之Javascript-DOM

    简介 为了快捷方便,在工作和项目中,一直都是使用的框架,比如jqeruy,vuejs,react等.然后在长时间使用框架后,往往有一个后遗症,就是对于原生的Javascript基本上已经不知道怎么写了 ...

  7. 【优质】React的学习资源

    React的学习资源 github 地址: https://github.com/LeuisKen/react-collection https://github.com/reactnativecn/ ...

  8. React Native 学习笔记--进阶(二)--动画

    React Native 进阶(二)–动画 动画 流畅.有意义的动画对于移动应用用户体验来说是非常必要的.我们可以联合使用两个互补的系统:用于全局的布局动画LayoutAnimation,和用于创建更 ...

  9. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  10. Java 静态内部类与非静态内部类 学习记录&period;

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

随机推荐

  1. C&plus;&plus; 引用

    本文主要记录了C++中的引用特性,总结了一下代码示例和错误. 简单的引用 引用是C++的特性,指针是C语言的特性.上面代码结果如下: 20 20 100 20 true 引用和被引用的对象是占用同一个 ...

  2. c语言基础:各种数据类型的输出占位符

    c语言中的输出操作相对java来说是比较麻烦的,每种数据类型的输出都有各自的占位符: 下面是各种数据类型的输出占位符: short/int : %d ; printf("这个整数是:%d&q ...

  3. 目前项目wordpress插件记录

    Restrict User Content WordPress 后台只显示当前登录用户的文章.页面和媒体 Client Dash 可以根据不同的角色生成不同的后台的菜单

  4. caffe源码阅读&lpar;1&rpar;-数据流Blob

    Blob是Caffe中层之间数据流通的单位,各个layer之间的数据通过Blob传递.在看Blob源码之前,先看一下CPU和GPU内存之间的数据同步类SyncedMemory:使用GPU运算时,数据要 ...

  5. Java控制台版推箱子

    import java.util.Scanner; public class b { public static void main(String[] args) { Scanner input = ...

  6. 安卓的sqlite增删改

    基于安卓的sqlite增删改,笔记学习: 1.使用LinearLayout 布局生成,增删改的页面如图 代码布局如下: <LinearLayout xmlns:android="htt ...

  7. sed 删除换行符

    sed 删除换行符 sed ':label;N;s/\n/:/;b label' filename sed ':label;N;s/\n/:/;t label' filename 上面的两条命令可以实 ...

  8. codeforces 746C 模拟

    C. Tram time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  9. vue 保留两位小数 不能直接用toFixed&lpar;2&rpar; &quest;

    用vue做项目的时候多多少少都会遇到这个问题 刚开始我是用toFixed()这个方法来写的  效果是有的 但是控制台一直是红红的围绕着我 突然想到 vue和jquery混搭 的 问题 于是乎 看了一下 ...

  10. tf&period;nn&period;conv2d 和 tf&period;nn&period;max&lowbar;pool 中 padding 分别为 &&num;39&semi;VALID&&num;39&semi; 和 &&num;39&semi;SAME&&num;39&semi; 的直觉上的经验和测试代码

    这个地方一开始是迷糊的,写代码做比较分析,总结出直觉上的经验. 某人若想看精准的解释,移步这个网址(http://blog.csdn.net/fireflychh/article/details/73 ...