参考
https://www.bilibili.com/video/BV17b411V7WG?from=search&seid=3866280229006180398
主要的代码
1.入口js
/*
入口JS
*/
import React from 'react'
import ReactDOM from 'react-dom'
import {HashRouter, Switch, Route} from 'react-router-dom'
import {Provider} from 'react-redux'
import store from './redux/store'
import Rigister from './containers/register/register'
import Login from './containers/login/login'
import Main from './containers/main/main'
import './assets/css/index.less'
// import './test/socketio_test'
ReactDOM.render((
<Provider store={store}>
<HashRouter>
<Switch>
<Route path="/register" component={Rigister}/>
<Route path="/login" component={Login}/>
<Route component={Main}></Route> 默认路由
</Switch>
</HashRouter>
</Provider>
), document.getElementById('root'))
组件部分
2.用户头像组件
/*
选择用户头像的UI组件
*/
import React, {Component} from 'react'
import {List, Grid} from 'antd-mobile'
import PropTypes from 'prop-types'
export default class HeaderSelector extends Component {
static propTypes = {
setHeader: PropTypes.func.isRequired
}
state = {
icon: null //图片对象, 默认没有值
}
constructor(props) {
super(props)
// 准备需要显示的列表数据
this.headerList = []
for (let i = 0; i < 20; i++) {
this.headerList.push({
text: '头像'+(i+1),
icon: require(`../../assets/images/头像${i+1}.png`) // 不能使用import
})
}
}
handleClick = ({text, icon}) => {
// 更新当前组件状态
this.setState({icon})
// 调用函数更新父组件状态
this.props.setHeader(text)
}
render () {
// 头部界面
const {icon} = this.state
const listHeader = !icon ? '请选择头像' : (
<div>
已选择头像:<img src={icon}/>
</div>
)
return (
<List renderHeader={() => listHeader}>
<Grid data={this.headerList}
columnNum={5}
onClick={this.handleClick}/>
</List>
)
}
}
3.logo组件
import React from 'react'
import logo from './logo.png'
import './logo.less'
export default function Logo() {
return (
<div className="logo-container">
<img src={logo} alt="logo" className='logo-img'/>
</div>
)
}
.logo-container {
text-align: center;
.logo-img {
width: 240px;
height: 240px;
}
}
4.底部导航组件
import React, {Component} from 'react'
import {TabBar} from 'antd-mobile'
import PropTypes from 'prop-types'
import {withRouter} from 'react-router-dom'
const Item = TabBar.Item
// 希望在非路由组件中使用路由库的api?
// withRoute()
class NavFooter extends Component {
static propTypes = {
navList: PropTypes.array.isRequired,
unReadCount: PropTypes.number.isRequired
}
render () {
let {navList, unReadCount} = this.props
// 过滤掉hide为true的nav
navList = navList.filter(nav => !nav.hide)
const path = this.props.location.pathname // 请求的path
return (
<TabBar>
{
navList.map((nav) => (
<Item key={nav.path}
badge={nav.path==='/message' ? unReadCount : 0}
title={nav.text}
icon={{uri: require(`./images/${nav.icon}.png`)}}
selectedIcon={{uri: require(`./images/${nav.icon}-selected.png`)}}
selected={path===nav.path}
onPress={() => this.props.history.replace(nav.path)}/>
))
}
</TabBar>
)
}
}
// 向外暴露withRouter()包装产生的组件
// 内部会向组件中传入一些路由组件特有的属性: history/location/math
export default withRouter(NavFooter)
5.页面找不到组件
/*
提示找不到页面的UI路由组件
*/
import React from "react"
import {Button} from "antd-mobile"
class NotFound extends React.Component {
render() {
return (
<div>
<div>
<h2>抱歉,找不到该页面!</h2>
<Button
type="primary"
onClick={() => this.props.history.replace("/")}
>
回到首页
</Button>
</div>
</div>
)
}
}
export default NotFound
6.用户列表组件
/*
显示指定用户列表的UI组件
*/
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import {WingBlank, WhiteSpace, Card} from 'antd-mobile'
import {withRouter} from 'react-router-dom'
import QueueAnim from 'rc-queue-anim'
const Header = Card.Header
const Body = Card.Body
class UserList extends Component {
static propTypes = {
userList: PropTypes.array.isRequired
}
render () {
const {userList} = this.props
return (
<WingBlank style={{marginBottom:50, marginTop:50}}>
<QueueAnim type='scale'>
{
userList.map(user => (
<div key={user._id}>
<WhiteSpace/>
<Card onClick={() => this.props.history.push(`/chat/${user._id}`)}>
<Header
thumb={require(`../../assets/images/${user.header}.png`)}
extra={user.username}
/>
<Body>
<div>职位: {user.post}</div>
{user.company ? <div>公司: {user.company}</div> : null}
{user.salary ? <div>月薪: {user.salary}</div> : null}
<div>描述: {user.info}</div>
</Body>
</Card>
</div>
))
}
</QueueAnim>
</WingBlank>
)
}
}
export default withRouter(UserList)