6、React路由及UI
SPA与路由
单页Web 应用(single page web application,SPA)
整个应用只有一个完整的页面
点击页面中的链接不会刷新页面, 本身也不会向服务器发请求
当点击路由链接时, 只会做页面的局部更新
数据都需要通过ajax 请求获取, 并在前端异步展现
路由
一个路由就是一个映射关系(key:value),key 为路由路径, value 可能是function/component。
- 前端路由
- 后端路由
react-router基本使用
相关文档:http://react-guide.github.io/react-router-cn/index.html
英文原版:https://reactrouter.com/web/guides/quick-start
安装
1
yarn add react-router-dom
使用
BrowserRouter
组件包裹所有组件1
2
3
4
5
6
7
8
9
10import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom'
import App from './components/app'
ReactDOM.render(
<BrowserRouter><App /></BrowserRouter>
,
document.getElementById('root')
);在根组件中引入相关需要的路由组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42import React, { Component } from 'react'
import { NavLink, Switch, Route, Redirect } from 'react-router-dom'
import About from '../views/about'
import Home from '../views/home'
export default class App extends Component {
render() {
return (
<div>
<div className='row'>
<div className='col-xs-offset-2 col-xs-8'>
<div className='page-header'>
<h2>React Router Demo</h2>
</div>
</div>
</div>
<div className='row'>
<div className='col-xs-2 col-xs-offset-2'>
<div className='list-group'>
<NavLink className='list-group-item' to='/about'>
about
</NavLink>
<NavLink className='list-group-item' to='/home'>
home
</NavLink>
</div>
</div>
<div className='col-xs-6'>
<div className='panel'>
<div className='panel-body'>
<Switch>
<Route path='/about' component={About}></Route>
<Route path='/home' component={Home}></Route>
<Redirect to='/about' />
</Switch>
</div>
</div>
</div>
</div>
</div>
)
}
}
NavLink组件包装优化
思想:重新包装一下NavLink
组件,为其添加自己的属性。
1 | import React, { Component } from 'react' |
使用时导入自己的组件MyNavLink
即可。
嵌套路由
在home组件中嵌套两个路由,home组件需要判断显示哪个路由,因此使用Switch
组件进行包裹。
1 | import React, { Component } from 'react' |
在News或者Message组件中正常定义组件
1 | import React, { Component } from 'react' |
路由组件传参
通过链接传递数据
1 | <Route |
:id
表示在这个位置为收集一个键为id
的对象。
接受参数,在跳转的组件中通过props.parmas
接受参数。
1 | const { id } = this.props.match.params |
两种路由跳转方式
两种方式分别为replace
和push
。前者不会记录在历史记录里而后者会被记录。
1 | // 将ID作为参数传入函数 |
AntDesign库
官方:https://ant.design/index-cn
安装(手机端)
1
yarn add antd-mobile
简单使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import React, { Component } from 'react'
import { Button, Toast } from 'antd-mobile'
import 'antd-mobile/dist/antd-mobile.css'
export default class App extends Component {
handClick() {
Toast.info('666')
}
render() {
return (
<Button type='primary' onClick={this.handClick}>
按钮
</Button>
)
}
}
按需引入
参考:按需加载
安装插件
1
yarn add react-app-rewired babel-plugin-import customize-cra -D
修改
package.json
脚本运行文件1
2
3
4
5"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test --env=jsdom"
}创建
config-overrides.js
文件1
2
3
4const { fixBabelImports, override } = require('customize-cra')
module.exports = override(
fixBabelImports('import', { libraryName: 'antd-mobile', style: 'css' })
);
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小康博客!
评论
TwikooWaline