react-router-dom 路由组件需要重新加载页面

虹彩的

调用 history.push('/packages') 时,url 会更新,但除非重新加载页面,否则组件不会挂载(渲染)。如果我调用 createHistory({forceRefresh: true}) 或手动重新加载页面,UI 将正确呈现。如何配置 react-router-dom 以加载组件而不显式重新加载页面或使用 forceRefresh?

索引.jsx

import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter } from 'react-router-dom'
import store from './store'
import {Provider} from 'react-redux'
import App from './App'

ReactDOM.render(
  <Provider store={store}>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </Provider>,
  document.getElementById('app')
);

应用程序.jsx

import React, { Component } from 'react'
import { Switch, Route } from 'react-router-dom'
import PropTypes from 'prop-types'
import { Navbar, PageHeader, Grid, Row, Col } from 'react-bootstrap'
import LoginFormContainer from './components/Login/LoginFormContainer'
import PackageContainer from './components/Package/PackageContainer'

class App extends Component {
  render() {
    return (
      <Grid>
        <Navbar>
          <Navbar.Header>
            <Navbar.Brand><h3>Mythos</h3></Navbar.Brand>
          </Navbar.Header>
        </Navbar>
        <Row className="content">
          <Col xs={12} md={12}>
            <Switch>
              <Route path='/packages' render={() => <PackageContainer />} />
              <Route exact path='/' render={() => <LoginFormContainer />} />
            </Switch>
          </Col>
        </Row>
      </Grid>
    )
  }
}

export default App

登录操作.jsx

import * as types from './actionTypes'
import LoginApi from '../api/loginApi'
import createHistory from 'history/createBrowserHistory'

const history = createHistory()

export function loginUser(user) {
  return function(dispatch) {
    return LoginApi.login(user).then(creds => {
      dispatch(loginUserSuccess(creds));
    }).catch(error => {
      throw(error);
    });
  }
}

export function loginUserSuccess(creds) {
  sessionStorage.setItem('credentials', JSON.stringify(creds.data))
  history.push('/packages')
  return {
    type: types.LOGIN_USER_SUCCESS,
    state: creds.data
  }
}

包容器.jsx

import React, { Component } from 'react'
import {connect} from 'react-redux'
import PropTypes from 'prop-types'
import {loadPackages} from '../../actions/packageActions'
import PackageList from './PackageList'
import ImmutablePropTypes from 'react-immutable-proptypes'
import {Map,fromJS,List} from 'immutable'
import {withRouter} from 'react-router-dom'

class PackageContainer extends Component {
  constructor(props, context) {
    super(props, context);
  }
  componentDidMount() {
    this.props.dispatch(loadPackages());
  }
  render() {
    return (
      <div className="col-lg-12">
        {this.props.results ?
        <PackageList results={this.props.results} /> :
        <h3>No Packages Available</h3>}
      </div>
    );
  }
}

PackageContainer.propTypes = {
  results: ImmutablePropTypes.list.isRequired,
};

const mapStateToProps = (state, ownProps) => {
  return {
    results: !state.getIn(['packages','packages','results']) ? List() : state.getIn(['packages','packages','results'])
  };
}

PackageContainer = withRouter(connect(mapStateToProps)(PackageContainer))

export default PackageContainer
丹尼斯·科苏尔

我假设,您正在创建history对象的新实例BrowserRouter不知道其中发生的更改的问题。

因此,您应该创建历史对象并将其导出到index.jsx和 使用Router而不是BrowserRouter作为history属性传递,这样您就可以在需要时导入它。

例如:

索引.jsx

import { Router } from 'react-router-dom'
import createHistory from 'history/createBrowserHistory'
...

export const history = createHistory()

ReactDOM.render(
  <Provider store={store}>
    <Router history={history}>
      <App />
    </Router>
  </Provider>,
  document.getElementById('app')
);

然后,loginActions您只需像以前一样导入history和使用.push方法。

登录操作.jsx

import * as types from './actionTypes'
import LoginApi from '../api/loginApi'
import { history } from './index'

export function loginUser(user) {
  return function(dispatch) {
    return LoginApi.login(user).then(creds => {
      dispatch(loginUserSuccess(creds));
    }).catch(error => {
      throw(error);
    });
  }
}

export function loginUserSuccess(creds) {
  sessionStorage.setItem('credentials', JSON.stringify(creds.data))
  history.push('/packages')
  return {
    type: types.LOGIN_USER_SUCCESS,
    state: creds.data
  }
}

希望它会有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

React:react-router-dom的Redirect不重新加载页面,而是更改URL

来自分类Dev

React-React Router Dom,hashbang路由解决方案

来自分类Dev

React Router dom无法与Link一起使用,但刷新页面会加载组件

来自分类Dev

如何创建动态路由,以基于react-router-dom中组件的属性命名路由

来自分类Dev

带异步的React-router-dom保护的路由

来自分类Dev

react-router-dom嵌套的路由和重定向

来自分类Dev

React Router Dom嵌套路由,或者如何传递

来自分类Dev

无法使用 switch 语句渲染路由 React router dom 5.0.0

来自分类Dev

如何使用 react-router-dom 创建动态路由?

来自分类Dev

更改网址时,react router dom不更新类组件

来自分类Dev

react-router-dom和Typescript不显示组件

来自分类Dev

react-router-dom 的组件参数未定义值

来自分类Dev

react-router-dom Switch 需要额外的 div 包装器

来自分类Dev

react-router-dom <链接>未更新页面

来自分类Dev

react-router-dom页面不会切换?

来自分类Dev

当我更改页面时,React Router Dom删除值

来自分类Dev

React Router Dom的<Switch>问题

来自分类Dev

react-router-dom如何更新路由组件内的父状态

来自分类Dev

react-router-dom多个布局配置不显示路由指示的组件

来自分类Dev

如何使用react-router-dom添加将渲染组件的路由?

来自分类Dev

React-router-dom v4 路由以及如何在子组件内部显示

来自分类Dev

React-router-dom:在一个路由下渲染两个组件

来自分类Dev

React Router Dom 受保护的路由在刷新页面期间始终重定向到登录

来自分类Dev

使用react-router-dom停止页面中边栏的重新渲染

来自分类Dev

React Router Dom Redirect需要刷新页面才能工作

来自分类Dev

从Cookie异步加载身份验证令牌时,React react-router-dom专用路由不起作用

来自分类Dev

当使用路由渲染道具而不是路由组件道具时,如何访问 react-router-dom 4 中的 url args?

来自分类Dev

从父组件向子路由器组件传递数据的React Router dom没有通过props.match

来自分类Dev

如何使用react-router-dom在react中创建受保护的路由

Related 相关文章

  1. 1

    React:react-router-dom的Redirect不重新加载页面,而是更改URL

  2. 2

    React-React Router Dom,hashbang路由解决方案

  3. 3

    React Router dom无法与Link一起使用,但刷新页面会加载组件

  4. 4

    如何创建动态路由,以基于react-router-dom中组件的属性命名路由

  5. 5

    带异步的React-router-dom保护的路由

  6. 6

    react-router-dom嵌套的路由和重定向

  7. 7

    React Router Dom嵌套路由,或者如何传递

  8. 8

    无法使用 switch 语句渲染路由 React router dom 5.0.0

  9. 9

    如何使用 react-router-dom 创建动态路由?

  10. 10

    更改网址时,react router dom不更新类组件

  11. 11

    react-router-dom和Typescript不显示组件

  12. 12

    react-router-dom 的组件参数未定义值

  13. 13

    react-router-dom Switch 需要额外的 div 包装器

  14. 14

    react-router-dom <链接>未更新页面

  15. 15

    react-router-dom页面不会切换?

  16. 16

    当我更改页面时,React Router Dom删除值

  17. 17

    React Router Dom的<Switch>问题

  18. 18

    react-router-dom如何更新路由组件内的父状态

  19. 19

    react-router-dom多个布局配置不显示路由指示的组件

  20. 20

    如何使用react-router-dom添加将渲染组件的路由?

  21. 21

    React-router-dom v4 路由以及如何在子组件内部显示

  22. 22

    React-router-dom:在一个路由下渲染两个组件

  23. 23

    React Router Dom 受保护的路由在刷新页面期间始终重定向到登录

  24. 24

    使用react-router-dom停止页面中边栏的重新渲染

  25. 25

    React Router Dom Redirect需要刷新页面才能工作

  26. 26

    从Cookie异步加载身份验证令牌时,React react-router-dom专用路由不起作用

  27. 27

    当使用路由渲染道具而不是路由组件道具时,如何访问 react-router-dom 4 中的 url args?

  28. 28

    从父组件向子路由器组件传递数据的React Router dom没有通过props.match

  29. 29

    如何使用react-router-dom在react中创建受保护的路由

热门标签

归档