【问题标题】:React-router-dom - Link change url but does not renderReact-router-dom - 链接更改 url 但不呈现
【发布时间】:2018-04-23 15:04:18
【问题描述】:

我是 React 新手,我已经创建了一个 <Link> 以从 dy 数据转到下一个或上一个项目(例如,如果我在 user/2 视图中,上一个链接转到 user/1 和下一个链接转到 user/3),url 已正确更改,但组件根本没有呈现,并且数据根本没有重新加载。

我了解到这是由于组件未检测到子组件未更改状态,因此父组件未呈现。

我尝试使用withRouter,但出现错误:You should not use <Route> or withRouter() outside a <Router>,我不明白我在做什么,如果有人有解决方案和一些解释,我将不胜感激: )

App.js:

import React, { Component } from 'react';
import {
  Route,
  Switch,
  withRouter,
} from 'react-router-dom';


import HomePage from './pages/home';
import SinglePage from './pages/single';

class App extends Component {



  render() {


    return (
      <Switch>
        <div>
          <Route exact path="/" component={HomePage} />
          <Route path="/:id" component={SinglePage} />
        </div>
      </Switch>
    );
  }
}

export default withRouter(App);

Single.js:

import React, { Component } from 'react';
import Details from '../components/details'
import Header from '../components/header'
import { ProgressBar } from 'react-materialize';

class SinglePage extends Component {

  constructor(props) {
    super(props);

    this.state = {
      data: { data: null },
    }
  }

    componentDidMount() {
        fetch(`http://localhost:1337/${this.props.match.params.id}`)
      .then((res) => res.json())
      .then((json) => {
        this.setState({
          data: json,
        });
      });
    }

  render() {

    const { data } = this.state;

    return (

      <div>

        <h2> SinglePage </h2>

        {!data ? (
          <ProgressBar />
        ) : (
          <div>
            <Header id={this.props.match.params.id} />
            <Details item={data} />
          </div>
        )}
      </div>
    );
  }

}

export default SinglePage;

Header.js:

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Link, withRouter } from 'react-router-dom';

class Header extends Component {

  static propTypes = {
    item: PropTypes.shape({
      data: PropTypes.string.isRequired,
    }).isRequired,
  }

    render() {
        const prev = parseInt(this.props.id) - 1
        const next = parseInt(this.props.id) + 1

        return (
            <div>
                <Link to="/"> Retour </Link>
                <Link to={`/${prev}`}> Précédent </Link>
                <Link to={`/${next}`}> Suivant </Link>
            </div>
        )
    }
}

export default Header;

【问题讨论】:

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


    【解决方案1】:

    解决方案非常简单。您需要做的就是使用componentWillReceiveProps 并检查参数是否更新,是否再次获取数据

    componentDidMount() {
        this.getData(this.props.match.params.id);  
    }
    
    componentWillReceiveProps(nextProps) {
       if(this.props.match.params.id !== nextProps.match.params.id) {
           this.getData(nextProps.match.params.id);
       }
    }
    
    getData = (param) => {
       fetch(`http://localhost:1337/${params}`)
          .then((res) => res.json())
          .then((json) => {
            this.setState({
              data: json,
            });
          });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-14
      • 2020-05-06
      • 2019-11-23
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      相关资源
      最近更新 更多