【发布时间】:2019-10-07 21:31:15
【问题描述】:
我正在制作一个仪表板组件,它显示 HTML sn-ps 的渲染预览和代码。在仪表板组件内部,我使用.map 映射sn-ps 数组。每个映射的 sn-p 都会有一个删除功能(已经构建)和一个更新功能。
为了使更新功能起作用,每个 sn-p 都有自己的子模态组件。我需要将 sn-p 的 ID 传递给模态组件,在该组件中我可以在更新数据库和状态之前将 ID 与新内容结合起来。
但是,当我将 ID 作为道具传递给模式时,我在某处犯了错误。
.map 在我的 Dashboard.js Dashboard 类组件中使用。
{this.state.snippets.map(snippet => (
<>
<div key={snippet._id} className="holder--pod">
<div className="content">
<div className="content__snippet-preview">
Snippet preview
</div>
<div className="content__body">
<h4>{snippet.name}</h4>
<p>{snippet.details}</p>
<p>{snippet._id}</p> //THIS WORKS
<pre>
<code>{snippet.content}</code>
</pre>
</div>
<div className="content__button">
<button onClick={this.handleDelete(snippet._id)}>
Delete
</button>
<button type="button" onClick={this.showModal}>
Open
</button>
</div>
</div>
</div>
<Modal
sid={snippet._id} //PASS ID HERE
show={this.state.show}
handleClose={this.hideModal}
></Modal>
</>
))}
这会呈现下面的 sn-ps(3 个 sn-p pod,包括它们的数据库 ID)。
import React, { Component } from 'react'
import api from '../api'
export default class Modal extends Component {
constructor(props) {
super(props)
this.state = {
name: '',
details: '',
content: '',
message: null,
}
}
handleInputChange = event => {
this.setState({
[event.target.name]: event.target.value,
})
}
handleClick = id => event => {
event.preventDefault()
console.log(id)
}
render() {
const { sid, show, handleClose } = this.props
console.log(sid)
const showHideClassName = show ? 'modal display-flex' : 'modal display-none'
return (
<div id="Modal" className={showHideClassName}>
<div id="modal-main">
<h4>Edit snippet {sid}</h4>
<form>
Name:{' '}
<input
type="text"
value={this.state.name}
name="name"
onChange={this.handleInputChange}
/>{' '}
<br />
Details:{' '}
<input
type="text"
value={this.state.details}
name="details"
onChange={this.handleInputChange}
/>{' '}
<br />
Content:{' '}
<textarea
value={this.state.content}
name="content"
cols="30"
rows="10"
onChange={this.handleInputChange}
/>{' '}
<br />
<button onClick={this.handleClick(sid)}>TEST ME</button>
</form>
<button onClick={handleClose}>Close</button>
{this.state.message && (
<div className="info">{this.state.message}</div>
)}
</div>
</div>
)
}
}
渲染下方的console.log 实际上粘贴了正确的 3 个 ID 的控制台。
但是,在 Modal.js 返回中调用 ID (sid) 只会显示最后一个 sn-p ID,无论我打开哪个 Modal。将该 ID 推送到我打算将 ID 与更新包组合的 handleClick 函数也是如此。
【问题讨论】:
-
this.showModal 可能将 this.show 设置为 true,因此它会导致所有模式显示,您只能看到最后一个(顶部),但如果您按 F12 并检查元素或使用反应开发工具,你可以看到他们都把 show 属性设置为 true。
-
@HMR 你一针见血。不敢相信我没看到。
-
正如其他人发布的那样; handleDelete 也是可疑的,除非它是一个柯里化函数
handleDelete = (id)=>()=>.... -
@HMR 粘贴您的评论作为答案,以便我给您加分。
标签: javascript arrays reactjs