javascript - 一次只显示一个答案
问题描述
我的页面上有一个问题列表,单击问题会显示答案。我想一次只显示一个答案,所以当用户点击一个问题时,页面只显示该问题的答案并隐藏其余答案。
数据文件
const Data = [
{
q:'How many team numbers can I invite',
a:'Probably 5 is possible '
},
{
q:'How do I reset my password',
a:'Click “Forgot password” from the login page or “Change password” from your profile page.A reset link will be emailed to you.'
},
{
q:'Can I cancel my subscription?',
a:'Yes! Send us a message and we’ll process your request no questions asked.'
},
{
q:'Do you provide additional support?',
a:'Chat and email support is available 24/7. Phone lines are open during normal business hours.'
}
]
这是 app.js 文件
<div className="body">
<div className="card">
<div className="picWrapper">
<img className="women" src={pic1} alt="" />
<img className="box" src={pic2} alt="" />
<img className="shadow" src={pic3} alt="" />
</div>
<div className="content">
<h1>FAQ</h1>
{Data.map((faq,i) => (<Question key={"faq_" + i} question={faq.q} answer={faq.a} />))}
</div>
</div>
</div>
)
问题部分-----------
const [open,setOpen] = useState(false)
const handleClick = () =>{
setOpen(!open)
}
return (
<div className="container">
<div className="text">
<p className="question"
style={{ fontWeight: open ? '700' : '400'}} onClick={handleClick}>{props.question}?</p>
<p className="answer"
style={{ display: open ? 'block' : 'none',color: open ? 'hsl(237, 12%, 33%)' : 'hsl(240, 6%, 50%)'}}> {props.answer}</p>
</div>
<img className="arrow" src={arrow} alt="" onClick={handleClick} style={{transform: open ? 'scaleY(-1)':'scaleY(1)',transition:'all 0.3s ease-in-out'}} />
</div>
)
我需要一种可以帮助我实现这种方法的方法,因为现在当我打开所有问题时,它就会脱离 div
netlify 链接 https://amazing-wright-0ca5db.netlify.app/
解决方案
您需要从问题组件中删除您的状态并将其提升。(把它放在你的主应用程序中)
因此,在您的主应用程序中有一个当前问题打开状态:
const [openQuestion, setOpenQuestion] = useState(1);
然后在您的问题组件上,检查 currentOpenQuestion 是否等于索引。如果是,它应该打开,如果不是,它应该关闭。然后在此处添加一个 onClick 并在单击时将状态更改为当前未解决问题的组件中。
{Data.map((faq, i) => (
<Question
onClick={(id) => setOpenQuestion(id)}
key={"faq_" + i}
id={i}
open={openQuestion === i}
question={faq.q}
answer={faq.a}
/>
))}
const Question = ({ question, answer, open, onClick, id }) => {
return (
<div className="container">
<div className="text">
<p
className="question"
style={{ fontWeight: open ? "700" : "400" }}
onClick={() => onClick(id)}
>
{question}?
</p>
<p
className="answer"
style={{
display: open ? "block" : "none",
color: open ? "hsl(237, 12%, 33%)" : "hsl(240, 6%, 50%)"
}}
>
{" "}
{answer}
</p>
</div>
<img
className="arrow"
src="https://www.google.com/url?sa=i&url=https%3A%2F%2Fthenounproject.com%2Fterm%2Fright-arrow%2F&psig=AOvVaw1tuHEwUUcX4nlUkFuhtuhb&ust=1612026978926000&source=images&cd=vfe&ved=2ahUKEwimuuzM0sHuAhWIh54KHQ6RBasQjRx6BAgAEAc"
alt=""
style={{
transform: open ? "scaleY(-1)" : "scaleY(1)",
transition: "all 0.3s ease-in-out"
}}
/>
</div>
);
};
export default Question;
快速而肮脏的代码示例:https ://codesandbox.io/s/awesome-cherry-syk9t?file=/src/question.js:42-1081
推荐阅读
- http - 如何覆盖 GoLang 中的组合结构方法
- javascript - 对象未在鼠标悬停时更新谷歌地图的视图
- lua - 我在 Roblox Lua 脚本中遇到问题。我想编写脚本,以便在死亡时保存库存。有小费吗?
- c# - 从未使用过 Resharper 方法
- python - HTTP POST使用套接字 - python
- reactjs - 在哪里存储 Auth0 域和客户端 ID?
- java - 以编程方式将 PEM 证书导入 Java KeyStore
- git - 为什么 Gitolite 在克隆时给出“无效的仓库名称”?
- perl - 为什么不能 Net::SSH::Expect 登录?
- api - 如何从 Jenkins API 设置“更改”和“开始于”?