为什么.params在this.props.match.params中使用时不工作?



我正在使用一个API的在线教程,我认为它与我使用的路由器有关,而不是教程的HashBrowser路由器。但有人能解释一下为什么这不起作用吗?

App.js


import React, {Component} from 'react'
import { BrowserRouter, Route, Routes} from 'react-router-dom'
import Navbar from './components/Navbar'
import PkmnList from './components/PkmnList'
import PkmnStats from './components/PkmnStats'
class App extends Component{
render(){
return (  
<BrowserRouter>
<div className="w-full h-full bg-platnium">
<Navbar/>

<Routes>
<Route exact path="/" element={<PkmnList/>} />
<Route exact path="/pokemon/:index"  element={<PkmnStats/>} />
</Routes>

</div>
</BrowserRouter>
)

}

}
export default App;

PkmnCard.js


import React, { Component } from 'react'
import loading from './loading.gif'
import {Link} from 'react-router-dom'
export default class PkmnCard extends Component {
state = {
name:'',
url: '',
index:'',

}
componentDidMount () {
const { name , url} = this.props;
const index = url.split('/')[url.split('/').length - 2];
const sprite =`https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${index}.png`;
this.setState({
name,
index,
sprite

})


}
render() {


return (
<Link to={`pokemon/${this.state.index}`}>
<div className='flex flex-col h-64  items-center p-10 rounded-xl  shadow-lg hover:shadow-2xl hover:border-stone-700 bg-white select-none '>
<h3 className=' text-center'>{this.state.name.toLowerCase().split(' ').map(letter => letter.charAt(0).toUpperCase() + letter.substring(1)).join(' ')}</h3>
<h1>{this.state.url}</h1>
{this.state.imageLoading ? (<img src={loading} className="mx-auto w-10 h-10" alt="loading gif"/>) :null}
<img className='mx-auto' style={this.state.tooManyRequests ? {display: "none"} : this.state.imageLoading ? null : {display: "block"}} src={this.state.sprite} alt={this.state.name} onLoad={() => this.setState({imageLoading: false})} onError={ () => this.setState({ tooManyRequests: true})} />
{this.state.tooManyRequests ? (<h6 className='mx-auto bg-red-600'> <span className='text-white'>Too Many Requests </span></h6>) :null }
<h3 className="text-center">-No.{this.state.index}-</h3>

</div>
</Link>
)   
}

}

PkmnStats.js

import React, {Component} from 'react'
import axios from 'axios'
import { useParams } from 'react-router-dom';
export default class PkmnStats extends Component {
state = {
name:'',
index:'',
imageUrl:''
};

async componentDidMount(){

const {index} = this.props.match.params;
const pkmnUrl = `https://pokeapi.co/api/v2/pokemon/${index}/`
//const pkmnSpecies = `https://pokeapi.co/api/v2/pokemon-species/${index}/`
const pkmnResponse = await axios.get(pkmnUrl);
const name = pkmnResponse.data.name;
this.setState({ name });
}
render(){
return (
<div>
<h1>{this.state.name}</h1>
</div>
)
}
}

我读到使用useParams(),但我不能使用一个函数调用,对吗?我困惑和卡住如何解决这个问题。有人能给我指个正确的方向吗?

我在处理类状态时遇到了问题,有时问题来自于类状态的定义以及如何将道具传递给子对象。也许可以尝试在类的顶层添加一个带有super(props)的构造函数。

//State setup
constructor(props) {
super(props)
this.state={
// Your setup
}
}

最新更新