路由:根据访问的网址url的不同,代码能展示出不同的内容。
React 中的前端路由:根据访问的网址url的不同,React会展示出不同的组件。
React中默认是没有路由的,需要自己来安装一下。
安装路由模块:npm install react-router-dom --save
引入BrowserRouter、Route和Link组件:import { BrowserRouter,Route,Link } from 'react-router-dom';
BrowserRouter:定义一个路由,包含一条条的路由Route,只允许包含一个路由标签,如果有多个,要将多个路由标签放到一个标签中包起来(一般使用div)
Route:路由项。path属性(路径)、component属性(要显示的组件,需要使用import引入该组件)
Link:用于路由跳转(比如点击button页中的button按钮,跳转到list路径中)。需要引入Link标签模块,将想产生跳转的组件包到Link标签中,通过to属性指定跳转到的路径。
例子:进入list路径显示List组件,进入button路径显示Button组件。
思考:如果想在页面跳转时,传递一些参数应该怎么做呢?
1⃣️在路径中带参数:/list?a=123
list页面如何获取到参数?
在render函数中的this.props.loaction.search中可以看到参数:?a=123
但是这种方法需要自己手动提取出具体的参数值。
2⃣️在路径中带参数:/list/123
这样不能直接获取到参数值,需要配置一下路由项中的path属性:路径修改为/list/:id
可以在render函数中通过this.props.match.params.id来获取到参数值。
代码:
index.js
import React, { Component } from 'react';
import ReactDom from 'react-dom';
import { BrowserRouter, Route } from 'react-router-dom';
import NewList from './newList';
import NewButton from './newButton';
import 'antd/dist/antd.css';
class Entry extends Component {
render() {
return (
<BrowserRouter>
<div>
<Route path='/list/:id' component={NewList}/>
<Route path='/button' component={NewButton}/>
</div>
</BrowserRouter>
)
}
}
ReactDom.render(<Entry />, document.getElementById('root'));
newButton.js
import React, { Component } from 'react';
import { Button } from 'antd';
import { Link } from 'react-router-dom';
class NewButton extends Component {
render() {
return (
<Link to='/list/123'>
<Button type='primary'>按钮</Button>
</Link>
)
}
}
export default NewButton;
newList.js
import React, { Component } from 'react';
import { List } from 'antd';
const data = [
'Racing car sprays burning fuel into crowd.',
'Japanese princess to wed commoner.',
'Australian walks 100km after outback crash.',
'Man charged over missing wedding girl.',
'Los Angeles battles huge wildfires.',
];
class NewList extends Component {
render() {
console.log(this.props.match.params.id);
return (
<List
style={{
marginLeft: 20,
marginTop: 20,
marginRight: 20
}}
header={<div>Header</div>}
footer={<div>Footer</div>}
bordered
dataSource={data}
renderItem={item => (<List.Item>{item}</List.Item>)}
/>
)
}
}
export default NewList;