【发布时间】:2020-10-20 13:23:19
【问题描述】:
我的问题类似于this one,我知道我需要在导航栏链接中添加一个 id,并在 componentDidMount 上添加一个事件侦听器(使用 handleScroll 函数),这对我来说已经很清楚了。
我会事先道歉,因为我可能会问一些愚蠢的问题或我应该已经知道的问题。
问题是,即使我对 vanilla JS 有经验,但我对 react 和 gatsby 还是很陌生,所以我不确定将 componentDidMount 放在gatsby starter I am using 的确切位置。
这个启动器是一个单页应用程序,所有部分都加载在索引(主页)中。例如,其中一个部分名为 About,我想在其中添加 componentDidMount。我已将 about.tsx 文件隐藏到 components 目录,但我不确定将 componentDidMount 放在哪里。
about.tsx 内容:
/** @jsx jsx */
import { jsx } from "theme-ui"
import Divider from "../elements/divider"
import Inner from "../elements/inner"
import Content from "../elements/content"
import SVG from "./svg"
import { UpDown, UpDownWide } from "../styles/animations"
// @ts-ignore
import AboutMDX from "../sections/about"
const About = ({ offset, factor = .99 }: { offset: number; factor?: number }) => (
<div>
<Divider
bg="divider"
clipPath="polygon(0 16%, 100% 4%, 100% 82%, 0 94%)"
speed={0.2}
offset={offset}
factor={factor}
/>
<Divider speed={0.1} offset={offset} factor={factor}>
<UpDown>
<SVG icon="box" hiddenMobile width={6} color="icon_blue" left="50%" top="75%" />
<SVG icon="upDown" hiddenMobile width={8} color="icon_darkest" left="70%" top="20%" />
<SVG icon="triangle" width={8} stroke color="icon_darkest" left="25%" top="5%" />
<SVG icon="upDown" hiddenMobile width={24} color="icon_orange" left="80%" top="80%" />
</UpDown>
<UpDownWide>
<SVG icon="arrowUp" hiddenMobile width={16} color="icon_purple" left="5%" top="80%" />
<SVG icon="triangle" width={12} stroke color="icon_brightest" left="95%" top="50%" />
<SVG icon="circle" hiddenMobile width={6} color="icon_brightest" left="85%" top="15%" />
<SVG icon="upDown" hiddenMobile width={8} color="icon_darkest" left="45%" top="10%" />
</UpDownWide>
<SVG icon="circle" hiddenMobile width={6} color="icon_brightest" left="4%" top="20%" />
<SVG icon="circle" width={12} color="icon_darkest" left="70%" top="60%" />
<SVG icon="box" width={6} color="icon_orange" left="10%" top="10%" />
<SVG icon="box" width={12} color="icon_darkest" left="20%" top="30%" />
<SVG icon="hexa" width={8} stroke color="icon_darkest" left="80%" top="70%" />
</Divider>
<Content speed={0.4} offset={offset} factor={factor}>
<Inner>
<AboutMDX/>
</Inner>
</Content>
</div>
)
export default About
如果有人能指出我如何将 componentDidMount 添加到此 about 部分,我将不胜感激?提前致谢。
编辑:据我所知,这是一个无状态功能组件(对吗?),因此不支持生命周期方法。但我不知道如何将此组件转换为有状态组件或如何将其包装在有状态容器中。
【问题讨论】:
-
功能组件可以使用状态并使用 Hooks 管理更改效果。 reactjs.org/docs/hooks-intro.html
-
现在我很困惑,我认为功能组件(又名无状态组件)不支持状态和效果。并且认为类组件(又名有状态组件)确实如此。无论如何,我不知道如何将这个无状态组件转换为有状态组件,所以我可以使用 componentDidMount。
-
他们引入 Hooks 是因为它改善了开发人员的体验,而且函数组件通常比基于类/原型的组件性能更好。