zoukankan      html  css  js  c++  java
  • react 路由案例

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

    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>
                    }
                </>
            )
        }
    }
    

      

  • 相关阅读:
    Python中所有的关键字
    关于selenium的8种元素定位
    对提示框的操作
    selenium+webservice进行百度登录
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled...报错解决
    Vue中使用echarts
    npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142解决方法
    插入排序
    冒泡排序优化
    roject 'org.springframework.boot:spring-boot-starter-parent:XXX' not found 解决
  • 原文地址:https://www.cnblogs.com/yetiezhu/p/12813194.html
Copyright © 2011-2022 走看看