【发布时间】:2022-01-06 18:40:29
【问题描述】:
我有一个关于基于 React 中的条件进行渲染的问题。我在这里有这个按钮组件,它根据“等级”的 API 列表呈现按钮列表。当您按下按钮时,它会将用户排名更新为新的。问题是它们不能通过相同的过程进行降级,因此每当用户处于某个排名时,他们无法选择低于当前排名值的任何按钮。看起来是这样的:
interface BProps {
data: Array<any>;
buttonAction: any; //action for parent component
rank: string;
rankId: number;
}
interface BState {
data: Array<any>;
rankId: integer;
rank: string;
}
export default class rankButtons extends React.Component<BProps, BState> {
router: any;
constructor(props: BProps) {
super(props)
this.state = {
data: [],
rankId: this.props.rankId,
rank: this.props.rank,
}
this.updateRank = this.updateRank.bind(this);
}
updateRank(element) {
const { id, value } = element.target;
let headers: any = {//calls headers};
var payload = {//payload};
//get facade
assignNewRank(payload, headers).then(()=>{
//call buttonAction function.
this.props.buttonAction(
id, value
)
}).catch((e: any)=>{})
this.pageUpdate()
}
pageUpdate(){
//window.location.reload()
}
getData = () => {
//Make API Call};
let payload: any = {}
getReferenceValues(payload, headers).then((res:any)=>{
this.setState({
data: res.data,
})
}).catch((e: any)=>{})
}
componentDidMount(){
this.getData();
this.setState({rank: this.props.rank}, () => {});
}
render() {
return(
<div>
<h5>User Rankings:</h5>
<div className='buttonContainer'>
{this.state.data.map((rank =>
<li key={rank.key}>
<button id={rank.key} value = {rank.text} onClick={this.updateRank} disabled={rank.key <= this.state.rankId ? true : false}>
{rank.text}
</button>
</li>
))}
</div>
</div>
)
}
}
目前该功能有效,只要按下其中一个按钮,我就可以更新用户排名。但是,我已将按钮设置为禁用:disabled={rank.key <= this.state.rankId ? true : false} 问题在于,除非刷新页面,否则我看不到按钮被禁用。我已经设置好了,当你按下一个按钮时,整个页面都会刷新,这很有效,但感觉很草率。
我知道在反应中,您通常必须更新状态才能重新渲染组件,但我不确定如何以与此处类似的方法执行此操作。简而言之,它可以按照我想要的方式工作,但是我需要在值更改后禁用按钮,而无需刷新页面。
【问题讨论】:
-
嘿,但是你没有更新 updateRank 中的状态,所以 this.pageUpdate 只是用新值更新状态
-
您能详细说明一下吗?我应该传递什么作为要更新的新值?和我设置的禁用条件一样吗?
-
为什么需要状态?将一些信息保留在应用程序内存中,然后在需要时进行更改。我想当用户点击一个按钮时——有些东西必须改变,究竟是什么——只有你知道。但是,我相信它应该模仿您的 assignNewRank 服务器调用
标签: reactjs list button state disable