2 回答
TA贡献1827条经验 获得超9个赞
生命周期方法喜欢componentDidMount并render具有标准的角色隔离。通常,前者旨在执行一些 API 调用(如您所拥有的),而后者,render 用于生成标记。componentDidMount无论如何,您应该避免尝试生成标记,而不是像它真的可能那样。
听起来您要做的就是检查从 API 返回的项目是否在 localStorage 中可用,然后className根据其存在有条件地更改该按钮的 。您可以创建一个辅助函数来帮助您实现这一目标。
checkItem = (item) => {
let className;
if(localStorage.getItem(item["Member_ID"]) != null){
className = "btn btn-success"
} else {
className = "btn btn-warning"
}
return className
}
然后,由于您正在映射项目数组,因此我们可以根据您的标记调用此函数。
render() {
const contents = this.state.data.map(item => (
<tr>
<td>{item.Member_Name}</td>
<td>{item.Member_ID}</td>
<td>{item.Member_DOB}</td>
<td>{item.ProgramType}</td>
<td>
<button id={item.Member_ID} type="button" onClick={(e) => this.downloadUser(item.Member_ID,e)}
className={this.checkItem(item)}>Ready for Download</button>
</td>
</tr>
))
return(
....
{contents}
....
)
}
TA贡献1801条经验 获得超16个赞
尝试这个:
componentDidMount{
webApi.get('sai/getofflinemembers?userId=N634806')
.then(event => {
this.setState({
data: event.data
});
})
}
const isExistLocalStorage = value => {
return localStorage.getItem(value) ? true : false;
}
render() {
const { data } = this.state;
return (
data && data.map((item, index) => {
const isExist = isExistLocalStorage(item.Member_ID);
<tr key={index}>
<td>{item.Member_Name}</td>
<td>{item.Member_ID}</td>
<td>{item.Member_DOB}</td>
<td>{item.ProgramType}</td>
<td>
<button
id={item.Member_ID}
type="button"
onClick={(e) => this.downloadUser(item.Member_ID, e)}
className={`btn ${isExist ? "btn-success" : "btn-warning"}`}
> {isExist ? "Ready for Download" : "Not ready"}</button>
</td>
</tr>
})
)
}
添加回答
举报