gpt4 book ai didi

javascript - ReactJS为什么会出现这种状态变化不渲染的情况?我究竟做错了什么?

转载 作者:行者123 更新时间:2023-11-27 22:35:47 24 4
gpt4 key购买 nike

import React from 'react';
import ReactDOM from 'react-dom';
import axios from 'axios';

var mode=['recent', 'alltime'];

var Button = React.createClass({
render(){
return <input type={this.props.type} onClick= {this.props.onClick} text={this.props.val}/>;
}
});

class Header extends React.Component {
constructor(){
super()
}

render(){
return <h2>Free Code Camp Leader board</h2>
}
}

class Leader extends React.Component{
constructor(props){
super(props)
this.state = {
users: [],
val: props.m,
}
}

componentDidMount() {
var th =this;
this.serverRequest = axios.get("https://fcctop100.herokuapp.com/api/fccusers/top/"+this.state.val).then(function(result){
console.log(result.data);
var leaders = result.data;
this.setState({
users: leaders
});
}.bind(this));
}

componentWillUnmount() {
this.serverRequest.abort();
}

render(){
return (
<div className='container'>

<div className="tbl">
<table className="table">
<thead>
<tr>
<th>Name</th>
<th>Recent </th>
<th>Alltime</th>
</tr>
</thead>
<tbody>
{this.state.users.map(function(data, index){
return (<tr key={index}><td><img src={data.img} className="img img-thumbnail" width="50"/>{data.username}</td>
<td id='recent'>{data.recent}</td>
<td id='alltime'>{data.alltime}</td></tr>)
})}
</tbody>
</table>
</div>
</div>
)
}
}


class App extends React.Component{
constructor(){
super(),
this.state={val: mode[0]},
this.update= this.update.bind(this),
this.unmount=this.unmount.bind(this)
}

unmount(){
ReactDOM.unmountComponentAtNode(document.getElementById('board'))
}

update(){
this.unmount();
this.setState({val: this.state.val ===mode[0]? mode[1] : mode[0]});
}

render(){
return (
<div>
<div className='header'>
<Header />
<button onClick={this.update} >{this.state.val==mode[0]? mode[1] : mode[0]}</button>
</div>
<div id="board">
{this.state.val === mode[0]? <Leader m= {this.state.val} /> : this.state.val ===
mode[1] ? <Leader m= {this.state.val} /> : null}
</div>
</div>
);
}
}

export default App;

有问题的部分位于 App extends React.Component 类下。我正在尝试使用更新方法中的状态更改重新渲染领导组件。它会更改状态,但不会更改传递给 Leader 进行重新渲染的属性。

最佳答案

在初始渲染后,您没有在 Leader 中使用 Prop m 执行任何操作。所以,它正在重新渲染,但它的状态没有改变。请记住,构造函数仅在初始渲染之前调用一次。因此,如果您希望 Leader 在初始渲染后响应 prop 更改并相应地更新其状态,则需要使用 component lifecycle methods 之一.

我建议添加 componentWillReceiveProps lifecycle method到您的 Leader 组件。这应该可以做到:

componentWillReceiveProps(nextProps) {
this.setState({ val: nextProps.m });
}

测试组件内部发生的情况的任何简单方法就是添加一个 console.log(this.props, this.state); 作为组件 render< 的第一行.

关于javascript - ReactJS为什么会出现这种状态变化不渲染的情况?我究竟做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39108080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com