【问题标题】:React How to get Component to detect route changeReact 如何让组件检测路由变化
【发布时间】:2017-12-27 21:18:01
【问题描述】:

我有 3 条路线呈现相同的组件<MainContainer/>,我希望根据位置在这些组件内更改状态。

路线:

import React from 'react'
import { browserHistory, HashRouter, Route, Switch } from 'react-router-dom'

import { MainContainer } from '../containers'
import { LoginContainer } from '../containers'

const Routes = () => {
  return (
    <HashRouter history={ browserHistory }>
      <Switch>
        <Route exact={ true } path="/" component={ LoginContainer }/>
        <Route exact={ true } path="/dashboard" component={ MainContainer }/>
        <Route exact={ true } path="/dashboard/services" component={ MainContainer }/>
        <Route exact={ true } path="/dashboard/users" component={ MainContainer }/>
      </Switch>
    </HashRouter>
  );
}

export default Routes

问题是componentDidMount只触发一次,改变路径时不会再次触发:

如何在 React 中使用 hashRouter 来检测路由的状态?

侧边栏

import React from 'react'
import { withRouter } from 'react-router-dom'

class Sidebar extends React.Component {

  constructor(props) {
        super(props);
        this.state = {}
    this.navigate = this.navigate.bind(this);
    }

  navigate(path) {
    this.props.history.push(`/dashboard/${path}`);
  }

  render () {
    return (
      <aside className="sidebar">
        <div>
          <h1>Main</h1>
          <ul>
            <li onClick={ () => this.navigate('services')}>Services</li>
            <li onClick={ () => this.navigate('users')}>Users</li>
          </ul>
        </div>
      </aside>
    )
  }
}

export default withRouter(Sidebar)

主容器

import React, { Component } from 'react'
import { connect } from 'react-redux'
import store from '../../store'
import * as firebase from 'firebase'

// Components
import { Sidebar } from '../../components'
import { Header } from '../../components'

// Containers
import UserListContainer from '../Users/UserListContainer'
import Body from './Body'

// Actions
import { addCurrentUser, searchUser, usersService, servicesService } from '../../actions'

export class Main extends Component {
    constructor(props) {
        super(props);
    }

    componentDidMount() {
        firebase.auth().onAuthStateChanged((user) => {
      this.checkAuth();
    });
    }

    checkAuth() {
        const user = firebase.auth().currentUser;
        this.props.addCurrentUser(user.email);
    }

    render() {
        return (
            <main>
                <Header currentUser={ this.props.currentUser }/>
                <section className="main-body">
                    <Sidebar />
                    <Body service={this.props.service}/>
                </section>
            </main>
        )
    }
}

const mapStateToProps = (state) => {
    return {
        service: state.globalReducer.service,
        currentUser: state.globalReducer.currentUser
    }
}

const mapDispatchToProps = (dispatch) => {
    return {
        searchUser: (user) => { dispatch(searchUser(user)) },
        addCurrentUser: (user) => { dispatch(addCurrentUser(user)) },
        usersService: () => { dispatch(usersService()) },
        servicesService: () => { dispatch(servicesService()) }
    }
}

const MainContainer = Main;
export default connect(mapStateToProps, mapDispatchToProps)(MainContainer)

【问题讨论】:

  • @azium 啊就是这样!!!想发表你的答案吗?

标签: javascript reactjs react-router react-router-dom


【解决方案1】:

如果您想在使用withRouter() 包装的组件中获取当前路径,可以使用withRouter() 提供给组件的location 属性。

props.location.pathname 可能是你感兴趣的地方。

编辑:

好的,所以您的&lt;MainContainer /&gt; 不知道位置。它没有用withRouter() 包裹。你的&lt;Sidebar /&gt; 是,但我看不到你在哪里使用该信息更改路线。

编辑#2:

一旦您的组件具有位置感知能力,您就可以添加 componentWillReceiveProps 生命周期方法,并查看您是否在组件中获取了这些属性。您可以在组件的任何位置使用这些属性。

componentWillReceiveProps( nextProps ) {
    const { location, history, match } = this.props;

    console.log( location );
    console.log( history );
    console.log( match );
}

【讨论】:

  • 是的,我可以在第一次加载 MainContainer 时得到它,但是当我更改路由并且这些路由加载相同的 MainContainer 时,它不会重新初始化
  • @Kyle Richardson,已添加!
  • 您想将componentWillReceiveProps 添加到您的答案中吗?
猜你喜欢
  • 2020-06-11
  • 2019-11-27
  • 2017-02-18
  • 2018-12-29
  • 1970-01-01
  • 2018-01-04
  • 2021-06-16
  • 1970-01-01
  • 2020-07-31
相关资源
最近更新 更多