【发布时间】:2021-09-06 01:12:04
【问题描述】:
我正在尝试在 React 中创建简单的手风琴。如果我打开/刷新整个页面,单击按钮时不会触发 onclick 事件。只有在我更改代码和组件重新渲染中的某些内容后,它才能正常工作。控制台中没有错误,老实说,我不知道这里发生了什么。提前致谢
import { useEffect } from "react"
function FAQ () {
const accordionBtn = document.querySelectorAll('.accordionTitle')
const allTexts = document.querySelectorAll('.text')
useEffect(() => {
accordionBtn.forEach(function (el) {
el?.addEventListener('click', toggleAccordion)
})
}, [])
function toggleAccordion (el: Event) {
const targetText = (el?.currentTarget as Element).nextElementSibling?.classList
const target = (el?.currentTarget as Element).classList
if (!(targetText?.contains('show'))) {
accordionBtn.forEach(function (el) {
el.classList.remove('accordionTitleActive')
allTexts.forEach(function (el) {
el.classList.remove('show')
})
})
targetText?.add('show')
target?.add('accordionTitleActive')
}
}
return (
<div>
<ul className='accordion'>
<li>
<h2 className='accordionTitle'>Title1 </h2>
<div className='text show'>
Content1
</div>
</li>
<li>
<h2 className='accordionTitle'>Title2 </h2>
<div className='text'>
Content2
</div>
</li>
<li>
<h2 className='accordionTitle'>Title3 </h2>
<div className='text'>
Content3
</div>
</li>
</ul>
</div>
)
}
export default FAQ
【问题讨论】:
-
您不应该以这种方式将像
querySelectorAll这样的原生 DOM 方法与 React 混合使用。它会干扰 React 更新 DOM 的方式。
标签: javascript html reactjs typescript dom