【发布时间】:2021-10-08 21:34:05
【问题描述】:
第一次制作 React 网站(使用 Gatsby)。
我想要发生什么
在我的索引页面上,当鼠标悬停在 Term 组件上时,我正在尝试使 Note 组件出现。
发生了什么
当我将onMouseEnter 和onMouseLeave 直接添加到Term 组件时,Note 永远不会出现。但是,如果我使用原生 html 元素(下面的示例代码中的 span)而不是 <Term/>,则会出现 Note。
跟箭头功能有关系吗?
- 将
() => setShowNoteB(true)替换为console.log("in TermB")(有点)可行。 - 但使用
onMouseEnter={setShowNoteB(true)}会导致无限循环错误。
这与我如何组成组件有关吗?还是 useState 钩子的限制?
我在这里所做的似乎相当简单/直截了当,但我还是新手,所以也许有一些我不知道的规则。
示例代码
索引页
//index.js
import * as React from 'react';
import { useState } from 'react';
import Term from '../components/term';
import Note from '../components/note';
const IndexPage = () => {
const [showNoteA, setShowNoteA] = useState(false);
const [showNoteB, setShowNoteB] = useState(false);
return (
<>
<h1
>
<span
onMouseEnter={() => setShowNoteA(true)}
onMouseLeave={() => setShowNoteA(false)}
> TermA* </span>
{" "} doesn't behave like {" "}
<Term word="TermB" symbol="†"
onMouseEnter={() => setShowNoteB(true)}
onMouseLeave={() => setShowNoteB(false)}
/>
</h1>
{showNoteA ? <Note> <p>This is a note for TermA.</p> </Note> : null}
{showNoteB ? <Note> <p>This is a note for TermB.</p> </Note> : null}
</>
);
};
export default IndexPage
术语组件
// term.js
import React from 'react';
const Term = ({ word, symbol }) => {
return (
<div>
<span>{word}</span>
<span>{symbol}</span>
</div>
);
};
export default Term;
笔记组件
// note.js
import * as React from 'react';
const Note = ({ children })=> {
return (
<div>
{children}
</div>
)
};
export default Note;
【问题讨论】:
-
您将这些道具传递给您的术语组件,但您没有使用它们。在运行时,
被一个没有分配悬停事件的 替换。要使其按预期工作,您的 Term 组件需要如下所示:codesandbox.io/s/angry-glitter-gqf99?file=/src/App.js啊。这就说得通了。谢谢。如果您将此作为答案发布,我会接受。
标签: javascript reactjs use-state mouseenter