reactjs - React:点击任何卡片时显示模式
问题描述
我是 React 的新手,并且有几张卡片,单击时应该打开一个模式,但是我不知道<Modal trigger={}>
在我的 Modal 组件中写什么才能从 Card 组件中获取卡片。我如何将模态链接到每张卡片,以便卡片的 onClick 出现模态?
主页.js
class Home extends React.Component {
constructor(props) {
super(props)
this.state = { isEmptyState: true }
}
triggerOpenAlertState = () => {
this.setState({
...this.state,
isEmptyState: false,
isOpenAlertState: true
})
}
render() {
return (
<div>
<i class="star outline icon big" id="favourites"></i>
<GoogleAuth />
<div>
{this.state.isEmptyState && <Cards openAlert={this.triggerOpenAlertState} />}
{this.state.isOpenAlertState && <ModalExample />}
</div>
</div>
)
}
}
模态.js
const ModalExample = () => (
<Modal trigger={}>
<Modal.Header>Sign In</Modal.Header>
<Modal.Content>
<p>
You must Sign In before you can add project ideas to your favourites.
</p>
</Modal.Content>
</Modal>
)
export default ModalExample
Cards.js
const Cards = props => {
return (
<div class="row">
<div class="column"><div onClick={props.openAlert} class="header card">Communication app for tenants/landlords</div></div>
<div class="column"><div onClick={props.openAlert} class="header card">Code Snippet Manager</div></div>
<div class="column"><div onClick={props.openAlert} class="header card">Reservation Management System</div></div>
<div class="column"> <div onClick={props.openAlert} class="header card">Budget Tracker</div></div>
<div class="column"><div onClick={props.openAlert} class="header card">Caesar Cipher</div></div>
<div class="column"><div onClick={props.openAlert} class="header card">Tax Calculator</div></div>
<div class="column"><div onClick={props.openAlert} class="header card">Meme Generator</div></div>
<div class="column"><div onClick={props.openAlert} class="header card">Virtual Interior Design app</div></div>
<div class="column"><div onClick={props.openAlert} class="header card">App for the Elderly</div></div>
</div>
解决方案
好的,所以鉴于您的更新,您应该像这样进行:
在您的 Home.js 中添加一个道具“isOpen”,这将是模态的可见状态,如果您需要将卡片对象添加到您的模态,还将对象名称“card”添加到您的 ModalExample 组件(并且您的状态为空目的 {})。将此道具链接到 isOpenAlertState 和卡片。然后更新您的函数触发打开警报以获取参数并将其保存到状态
triggerOpenAlertState = (card) => {
this.setState({
...this.state, //this is not needed
isEmptyState: false,
isOpenAlertState: true,
card: card;
})
}
...
...render() {
return (
<div>
<i class="star outline icon big" id="favourites"></i>
<GoogleAuth />
<div>
{this.state.isEmptyState && <Cards openAlert={this.triggerOpenAlertState} />}
<ModalExample card={this.state.card} isOpen={this.state.isOpenAlertState}/>
</div>
</div>
)
}
(如果我没记错的话,您不需要在添加组件模式之前进行测试。)
在您的卡片中更新 onclick 操作以将卡片对象提供给该函数:
<div class="column"><div onClick={() => props.openAlert(clickedCardObject)} class="header card">Code Snippet Manager</div></div>
然后在您的 Modal 组件中获取道具 isOpen 和 card 并根据需要将其链接到您的触发器中:
const ModalExample = ({isOpen, card}) => (
<Modal trigger={isOpen}>
// do Something with card values
...
这应该可以链接您的元素。不要忘记关闭模式以将卡片状态设置为 null 并将 isOpenAlertState 设置为 false。
我对您的代码有一些额外的评论/提示,它们通常被称为 js 的“良好实践”。
_首先要增加代码的可读性,您应该使用解构来获取您的变量,即(使用您当前的代码):
render() {
const {isOpenAlertState, isEmptyState} = this.state;
return (
<div>
<i class="star outline icon big" id="favourites"></i>
<GoogleAuth />
<div>
{isEmptyState && <Cards openAlert={this.triggerOpenAlertState} />}
{isOpenAlertState && <ModalExample />}
</div>
</div>
)
}
这可能看起来不多,但是当您在 state/props 中有很多 var 时,它将大大提高代码的可读性。
_ 其次,您应该在道具/onClick 中使用箭头功能。如果你不这样做,你的函数将在渲染时立即被调用,我怀疑这就是你打算做的,即:
Cards.js
... <div class="column"><div onClick={() => props.openAlert()} class="header card">Code Snippet Manager</div></div> ...
主页.js
... {this.state.isEmptyState && <Cards openAlert={() => this.triggerOpenAlertState()} />} ...
最后,当您调用 setState({}) 时,您不需要(但可以)将 ...this.state 放在首位,因为 setState 会在放入新值或替换旧值之前自动获取旧状态!
希望这可以帮助 !:D
推荐阅读
- sql - 如何通过相同的开始查找订单号的排名
- node.js - 如何在一篇休息 api 帖子中发送多个 JSON 对象?
- android - 如何在片段而不是活动中使用 OpenGl 绘制形状
- python - 使用 Python 脚本访问谷歌驱动器上的文件
- java - setValue() 不适用于模型活动
- javascript - 预填充时准备 ng 多选,即使控件获得价值,提交按钮仍然禁用
- discord - Discord.js 斜线命令选项
- javascript - 选择城市时如何更改动态数组列表的背景
- mysql - Mysql-用 RIGHT 函数替换倒数第三个字符而不丢失其余值
- python - 如何在 Spacy v3 中使用 BILUO 模式更新 NER 模型?