javascript - React 数组为什么会这样?
问题描述
我有两个 React 组件,一个在单击按钮时创建一个新数组,然后通过函数将该数组发送到另一个正在映射和输出项目符号列表的组件。但是,第二个组件不是为数组中的每个项目显示一个项目符号,而是将它们混合在一起。
第一个组件功能:
export default class SvcList extends React.Component {
constructor(props) {
super(props)
this.state = {
servicesArr: []
}
}
changeSelectionsArray = (id) => {
this.state.servicesArr.push(id)
// THIS IS THE FUNCTION SENDING THE ARRAY TO SECOND COMPONENT
this.props.reviseServicesArray(this.state.servicesArr)
}
render() {
return(
<div><button id="something" onClick={() => this.changeSelectionsArray(id)}>Click Me</button></div>
)
}
}
这是有效的。console.log 显示了我从组件中获得的输出:
["5bd97355-50d8-4a06-aced-025c8cc587f3", "5bd97403-ae5b-4c90-92cb-130f86154e27"]
所以我通过道具把这个数组带到我的第二个组件中,当我 console.log 道具时,我得到了上面显示的确切数组。这是第二个组件:
export default class SvcDisplay extends React.Component {
constructor(props) {
super(props)
}
render() {
const { servicesArr } = this.props;
const serviceDisplay = servicesArr.map((item, i) => (
<li key={i}>{item}</li>
));
return(
<div>
<ul>{serviceDisplay}</ul>
</div>
)
}
}
输出全部作为一个子弹捣碎在一起,如下所示:
- 5bd97355-50d8-4a06-aced-025c8cc587f35bd97403-ae5b-4c90-92cb-130f86154e27
而不是单个子弹。如果我将此行添加到 map 函数上方的第二个组件渲染函数中,它将完美运行:
常量 servicesArr = ["5bd97355-50d8-4a06-aced-025c8cc587f3", "5bd97403-ae5b-4c90-92cb-130f86154e27"];
为什么会这样????
解决方案
因为 this.state.array.push() 是错误的语法。此外,如果您想使用更新状态,则需要在 setState 之后使用 callBack。
changeSelectionsArray = (id) => {
let { servicesArr } = this.state;
servicesArr.push(id);
this.setState({
servicesArr,
}, () => {
this.props.reviseServicesArray(this.state.servicesArr)
})
}
或者:
changeSelectionsArray = (id) => {
this.setState({
servicesArr: [...this.state.servicesArr, id]
}, () => {
this.props.reviseServicesArray(this.state.servicesArr)
})
}
或者:
...
或者:
...
推荐阅读
- goland - 如何在 GoLand 终端中输入
- java - Maven 缩短执行中的类路径
- r - 选择器输入作为过滤器使用shinyJS禁用所有未禁用按钮
- javascript - 滚动类在页面加载时立即应用,而不是当用户在 iphone 上滚动时
- html - 在存在 Bootstrap 5 链接的情况下,无法将水平规则的边界设置为点缀
- postgresql - Django 模型和 Postgres 权限
- asp.net-core - 基于请求条件的断路器
- java - 有没有办法在不同的进程(Java)之间共享 TCP 状态
- java - 如何实现调用者无法编辑返回对象的getter?
- angular - 如何阻止 Chrome DevTools Sources 选项卡在页面重新加载时打开框架文件