首先,先做底部的导航在页面写入

import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter, Switch, Route } from 'react-router-dom'
import Home from './pages/home'
import TabBar from '@@/TabBar' //引入组件
import './index.less'

const Cart = () => <h1>Cart</h1>
const User = () => <h1>User</h1>
const All = () => <h1>All</h1>

ReactDOM.render(
  <BrowserRouter>
    <Switch> 
      <Route path="/cart" component={Cart} />
      <Route path="/user" component={User} />
      <Route path="/All" component={All} />
      <Route path="/" component={Home} />
    </Switch>
    <TabBar />    //我把这个东西封装成一个组件了。放在了components里了
  </BrowserRouter>,
  document.getElementById('root')
)

  

然后在封装的TabBar写入

import React from 'react'
import { Icon } from 'antd'
import { NavLink } from 'react-router-dom'
import './styles.less'

const IconFont = Icon.createFromIconfontCN({    //使用了antd的icon 我用的阿里的图标库
  scriptUrl: '//at.alicdn.com/t/font_249460_ozbfr66yg1k.js', //这个路径是你自己的图标库里的路径
})

export default class Home extends React.Component {
  render () {
    return (
      <div className="common-tabbar">
        <ul>
          <li>
            <NavLink to="/home/detail">    //达到默认样式,这边就不需要用exact
              <IconFont type="icon-restore" className="icon" />
              首页
            </NavLink>
          </li>
          <li>
            <NavLink to="/all" exact>    //exact 精确匹配
              <IconFont type="icon-add" className="icon" /> 
              全部分类
            </NavLink>
          </li>
          <li>
            <NavLink to="/cart" exact>
              <IconFont type="icon-all" className="icon" />
              购物车
            </NavLink>
          </li>
          <li>
            <NavLink to="/user" exact>
              <IconFont type="icon-Category" className="icon" /> 
              个人中心
            </NavLink>
          </li>
        </ul>
      </div>
    )
  }
}

  

然后再首页的文件里写入

import React, { Component } from 'react'
import Axios from 'axios'
import {
  Route,
  NavLink,
  Switch,
  Redirect
} from "react-router-dom";
import Detail from '@/pages/detail'    //引入右边板块的页面
import './styles.less'

export default class All extends Component {

  state = {
    data: []
  }

  componentDidMount() {
    Axios.get('http://vueshop.glbuys.com/api/home/category/menu?token=1ec949a15fb709370f').then(res => {   //这里是我自己的一个接口的数据
      this.setState({
        data: res.data.data
      })
    })
  }

  render() {
    return (
      <div className='page-home'>
        <ul className="page-side">
          {
            this.state.data.map(item => {
              return (
                <li key={item.cid}>
                  <NavLink to={`/home/detail/${item.cid}`} >{item.title}</NavLink>
                </li>
              )
            })
          }
        </ul>

        <div className="page-main">
          <Switch>
            {/* 这边使用动态路由方式进行传参 */}
            <Route path='/home/detail/:id' component={Detail}></Route>
            <Redirect to='/home/detail/492' exact/>    //让他重定向到第一个页面的第一条数据
          </Switch>
        </div>
      </div>
    )
  }
}

  

详情页面写入, 因为自己的接口么。 不可能有那么多数据, 所以render时候进行了判断,解决报错问题。

import React, { Component } from 'react'
import Axios from 'axios'
import './styles.less'
export default class Detail extends Component {

    state = {
        data: []
    }

    componentDidMount(){
        Axios.get(`http://vueshop.glbuys.com/api/home/category/show?cid=${this.props.match.params.id}&token=1ec949a15fb709370f`).then(res=>{
            if( res.data.code == 200 ){
                this.setState({
                    data: res.data.data
                })
            } 
           
        })
    }

    componentWillReceiveProps(nextProps){
        Axios.get(`http://vueshop.glbuys.com/api/home/category/show?cid=${nextProps.match.params.id}&token=1ec949a15fb709370f`).then(res=>{
            if( res.data.code == 200 ){
                this.setState({
                    data: res.data.data
                })
            }
        })
    }

    render() {
        const { data = [] } = this.state //这里定义一个默认值, 如果data这个数据为undefined时候就会走默认值
        return (
            <>
                {   //这里再运用了一个三目,是因为后台给的数据有错误, 给了一个null, null不会走默认值,所以使用三目
                   data!== null && data ? data.map( item=>{
                        return(
                            <div className='main' key={item.cid}>
                                <h1>{item.title}</h1>
                                <div className='list'>
                                {
                                    item.goods!== null && item.goods ? item.goods.map( v =>{
                                        return(
                                            <dl key={v.gid}>
                                                <dt><p><img src={v.image} /></p></dt>
                                                <dd>{v.title}</dd>
                                            </dl>
                                        )
                                    }) :<div>没有数据</div>
                                }
                                </div>
                            </div>
                        )
                    })  : <div>没有数据</div>
                }
            </>
        )
    }
}

  

posted on 2020-05-01 12:58  姓叶,名铁柱  阅读(212)  评论(0编辑  收藏  举报