Chào mn! Mình đang học đến useEffect() trong reactjs thì vướng phải thắc mắc này. Mong nhận được sự giải đáp từ mọi người.
Mình có 2 Component:
export default function App() {
const [show, setShow] = useState(false)
return (
<React.Fragment>
{show && <Popup />}
<button id="btn" onClick={() => setShow(!show)}>Toggle</button>
</React.Fragment>
)
}
function Popup() {
useEffect(() => {
function f(e) {
console.log(e.target)
}
document.addEventListener('click', f)
return () => {
document.removeEventListener('click', f)
}
}, [])
return (
<React.Fragment>
<h1>Popup!!!</h1>
</React.Fragment>
)
}
Theo suy nghĩ của mình thì lần render App
đầu tiên, do show = false
nên sẽ chỉ hiển thị duy nhất button
.
Tiếp theo đó, khi click vào button
thì show = true
dẫn đến Popup
cũng được render. Sau khi Popup render
thì sẽ chạy useEffect
và gắn sự kiện onClick
cho document
.
Tuy nhiên vấn đề mình đang gặp phải là ngay vào lần click vào button đầu tiên
, khi này Popup
vẫn chưa được render nên sự kiện onClick chưa được gắn
, thì trong console vẫn hiện ra e.target
. Mình đang không hiểu lắm cách code xử lý ở đây. Mong mn giải thích giúp.
Mình có để code ở link: https://codesandbox.io/s/dreamy-christian-1v7eip?file=/src/App.js