javascript - 如何使用状态变量而不在循环内的不同组件之间共享
问题描述
我在一个循环中有两个卡片组件,如下面的代码所示。在卡片中,我有一个文本字段和一个添加按钮。单击添加按钮后,在文本字段中输入的值将填充到卡片内。但是当我这样做时,另一张卡也显示相同的值。这意味着,假设我在第一张卡片的文本字段中输入了一个值,那么第二张卡片中也会显示相同的值。我知道这是因为我在循环内使用相同的状态变量,并且在循环内的其他卡组件之间共享。我无法找到解决方案,因此如果我在卡片组件的文本字段中输入内容,那么它不会反映在循环内的其他组件上。
这是代码:CodeSandbox
代码,我在循环内渲染卡片组件
render() {
const { classes } = this.props;
let apidata = this.state.apidata;
return (
<div>
<br />
<br />
<div className={classes.root}>
<GridList cellHeight={600} cols={2} className={classes.gridList}>
{apidata.map((val,index) => (
<GridListTile className="gridtile" key={val.id}>
<Card className={classes.card} key={val.id} >
<CardHeader
title={val.username}
/>
<Typography className={classes.test}>
<span>{this.state.img_comments}</span>
</Typography>
<TextField
label="Add a comment"
className={classes.textField}
margin="normal"
onChange={(e)=>this.commentHandler(e,index)}
defaultValue=""
/>
<Button
variant="contained"
color="primary"
className={classes.button}
onClick={this.putComment}
>
ADD
</Button>
</Card>
</GridListTile>
))}
</GridList>
</div>
</div>
);
}
解决方案
你可以做这样的事情。您需要更改将评论存储到对象的状态。
this.state = {
date: "",
apidata: [],
favColor: 0,
commentFlag: 0,
count: 0,
id: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
comments: [],
img_comments: {},
hdn_img_comments: []
};
putComment 函数的变化
putComment = (key) => {
// e.preventDefault();
let obj = this.state.img_comments;
obj[key] = this.state.hdn_img_comments;
this.setState({ img_comments: obj });
};
并且您的添加按钮有一些细微的变化
<Button
variant="contained"
color="primary"
className={classes.button}
onClick={() => this.putComment(val.id)}
>
ADD
</Button>
这是代码的链接: Sandbox
推荐阅读
- r - “上次更新时间...”的日期在本地预览版和部署时不同
- android - 来自 json 字符串 loadurl() android 的 webview
- typescript - 要求语句不是导入语句的一部分。eslint@typescript-eslint/no-var-需要从存储中导入打字稿
- haskell - Haskell中的斐波那契冻结电脑?
- c - 检查两个无符号整数之间的差是否最多为 1
- java - 流畅的 try-catch 块
- python - 如何使用单个 python(.py) 脚本运行多个 python 脚本
- bash - 从 bash 返回值到 Ansible 任务
- r - 跨多列匹配行但忽略 Rstudio 中的 NA
- javascript - 使用 rxjs angular 从具有特定属性的对象数组中获取对象数组