我有一个基于 url 的 react 组件,它应该导入一些数据,然后将其显示在另一个子组件中。当页面第一次加载时,它加载初始数据作为componentDidMount(). 至于进一步的 url 更改,它们在componentDidUpdate()
导出默认类 Info extends React.Component{ 中处理
constructor(props){
super(props);
this.state={
element:null
}
}
componentDidMount(){
switch(this.props.match.params.id){
case 'legende': import('../data/legends.json').then((data)=>{
this.setState({
element:(<InfoDisplay data={data.content} />)
})
});break;
case 'istorie': import('../data/history.json').then((data) => {
this.setState({
element: (<InfoDisplay data={data.content} />)
})
}); break;
}
}
componentDidUpdate(prevProps){
if (this.props.match.params.id !== prevProps.match.params.id)
switch (this.props.match.params.id) {
case 'legende': import('../data/legends.json').then((data) => {
this.setState({
element: (<InfoDisplay data={data.content} />)
})
});
break;
case 'istorie': import('../data/history.json').then((data) => {
this.setState({
element: (<InfoDisplay data={data.content} />)
})
}); break;
default: break;
}
}
render(){
return (
<div style={{backgroundImage:`url(${background})`,height:'100vh',overflowX:'hidden',backgroundSize:'cover'}}>
<Navbar/>
{this.state.element}
</div>
)
}
}
我的问题是,尽管在 switch 语句中更新了状态,但组件不会重新渲染。我不知道我的方法有什么问题。有谁能帮帮我吗?谢谢!
编辑:这是代码shouldComponentUpdate()而不是componentDidUpdate:
import React from 'react'
import * as background from '../assets/img/background_main.png';
import Navbar from './Navbar'
import InfoDisplay from './InfoDisplay';
export default class Info extends React.Component {
constructor(props) {
super(props);
this.state = {
element: null
}
}
componentDidMount() {
switch (this.props.match.params.id) {
case 'legende': import('../data/legends.json').then((data) => {
this.setState({
element: (<InfoDisplay data={data.content} />)
})
}); break;
case 'istorie': import('../data/history.json').then((data) => {
this.setState({
element: (<InfoDisplay data={data.content} />)
})
}); break;
}
}
shouldComponentUpdate(nextProps,nextState) {
if (this.props.match.params.id !== nextProps.match.params.id && nextProps) {
switch (nextProps.match.params.id) {
case 'legende': import('../data/legends.json').then((data) => {
this.setState({
element: (<InfoDisplay data={data.content} />)
})
}); return true;
case 'istorie': import('../data/history.json').then((data) => {
this.setState({
element: (<InfoDisplay data={data.content} />)
})
});return true;
default: return false;
}
}
return true;
}
render() {
return (
<div style={{ backgroundImage: `url(${background})`, height: '100vh', overflowX: 'hidden', backgroundSize: 'cover' }}>
<Navbar />
{this.state.element}
</div>
)
}
}