zoukankan      html  css  js  c++  java
  • react中withRouter解决props返回为空

    利用 react + antd 框架书写导航栏时,遇到了几个坑,分别是一级菜单和二级菜单在点击的情况下,高亮没有任何问题,但是再点击浏览器返回按钮时,却就乱套了。

    1. 二级菜单中,我们可以通过 props.history 来监听 route ,通过不同的 hash 值赋值给 antd 导航栏相应的 selectdKeys 就能搞定。

    2. 以及菜单可就有点问题了,因为一级菜单所拿到的 props 打印出来就是一个空对象,当给它监听路由变化时,浏览器就会报错,所以这个时候就得用到 withRouter 了,其使用方法为:

    import React, { Component } from 'react'
    import '../css/movie-app.css'
    
    // 导入路由
    import { Route, Link, withRouter } from 'react-router-dom'
    
    import Home from './home'
    import Movie from './movie'
    import About from './about'
    
    import { Layout, Menu } from 'antd'
    const { Header, Content, Footer } = Layout
    
    class MovieApp extends Component {
    
      constructor(props) {
        super(props)
        console.log(props) // 此时这里打印出来就不是空对象了,就可以对路由进行监听
        const hash = props.location.pathname
        this.state = {
          sel: hash.startsWith('/movie') ? '/movie/in_theaters' : hash
        }
    
        props.history.listen(route => {
          const hash = route.pathname
          this.setState({
            sel: hash.startsWith('/movie') ? '/movie/in_theaters' : hash
          })
        })
      }
    
      render() {
        return (
          <Layout className="layout">
            <Header>
              <div className="logo" />
              <Menu
                theme="dark"
                mode="horizontal"
                selectedKeys={[this.state.sel]}
                style={{ display: 'inline-block',  300, lineHeight: '64px' }}
              >
                <Menu.Item key="/">
                  <Link to="/">首页</Link>
                </Menu.Item>
                <Menu.Item key="/movie/in_theaters">
                  <Link to="/movie/in_theaters">电影</Link>
                </Menu.Item>
                <Menu.Item key="/about">
                  <Link to="/about">关于</Link>
                </Menu.Item>
              </Menu>
            </Header>
            <Content style={{ padding: '0 50px' }}>
    
              <Route path="/" exact component={Home}></Route>
              <Route path="/movie" component={Movie}></Route>
              <Route path="/about" component={About}></Route>
    
            </Content>
            <Footer style={{ textAlign: 'center' }}>footer Ant Design ©2018 Created by Ant UED</Footer>
          </Layout>
        )
      }
    }
    
    export default withRouter(MovieApp)

    需要注意的是 withRouter 必须要放在路由标签(<Router></Router>)里边,否则也会报错!!!

    这样写就解决了 props 为空不能监听路由的问题

  • 相关阅读:
    [LeetCode 1029] Two City Scheduling
    POJ 2342 Anniversary party (树形DP入门)
    Nowcoder 106 C.Professional Manager(统计并查集的个数)
    2018 GDCPC 省赛总结
    CF 977 F. Consecutive Subsequence
    Uva 12325 Zombie's Treasure Chest (贪心,分类讨论)
    Poj 2337 Catenyms(有向图DFS求欧拉通路)
    POJ 1236 Network of Schools (强连通分量缩点求度数)
    POJ 1144 Network (求割点)
    POJ 3310 Caterpillar(图的度的判定)
  • 原文地址:https://www.cnblogs.com/xiaoyaoxingchen/p/10993725.html
Copyright © 2011-2022 走看看