useEffect(() => { setLogo(theme === "dark" ? "white" : "black");}, [theme]);任何包含在effect之内但是在其外部定义的变量,都应该包含在依赖项的数组中 。
除此之外,还应该使用return来清理副作用:
useEffect(() => { function onScroll() { /*...*/ } window.addEventListener("scroll", onScroll); return () => window.removeEventListener("scroll", onScroll);}, []);6. 渲染内容组件的核心就是它的内容,React 组件的内容使用 JSX 语法定义并在浏览器中呈现为 HTML 。所以,推荐将函数组件的 return 语句尽可能靠近文件的顶部 。其他一切都只是细节,它们应该放在文件较下的位置 。
function Article(props: Props) { // 变量声明 // effects // ? 自定义的函数不建议放在 return 部分的前面 function getInitials() { /*...*/ } return /* content */;}export default Article;function Article(props: Props) { // 变量声明 // effects return /* content */; // ? 自定义的函数建议放在 return 部分的后面 function getInitials() { /*...*/ }}export default Article;难道return不应该放在函数的最后吗?其实不然,对于常规函数 , 肯定是要将return放在最后的 。然而,React组件并不是简单的函数 , 它们通常包含具有各种用途的嵌套函数,例如事件处理程序 。最后的return语句以及前面的一堆其他函数,实际上阻碍了代码的阅读,使得很难找到组件渲染的内容:
- 很难搜索该
return语句,因为可能有来自其他嵌套函数的多个return语句; - 在文件末尾滚动查找
return语句并不能很容易找到它,因为返回的 JSX 块可能非常大 。
return的下方 , 那么如果想要使用箭头函数来自定义函数,那就只能使用var来定义,因为let和const不存在变量提升,不能在定义的箭头函数之前使用它 。7. 部分渲染在处理大型 JSX 代码时,将某些内容块提取为单独的函数来渲染组件的一部分是很有帮助的,类似于将大型函数分解为多个较小的函数 。
function Article(props: Props) { // ... return ( <article> <h1>{props.title}</h1> {renderBody()} {renderFooter()} </article> ); function renderBody() { return /* article body JSX */; } function renderFooter() { return /* article footer JSX */; }}export default Article;- 可以给这些拆分出来的函数前面加上
render前缀,以将它们与其他不返回 JSX 的函数区分开; - 可以将这些函数放在
return语句之后,以便将与内容相关的所有内容组合在一起; - 无需向这些函数传递任何参数,因为它们可以访问
props和组件定义的所有变量;
function Article(props: Props) { // ... return ( <article> <h1>{props.title}</h1> <ArticleBody {...props} /> <ArticleFooter {...props} /> </article> );}export default Article;function ArticleBody(props: Props) {}function ArticleFooter(props: Props) {}在这种情况下,就必须手动将子组件所需的局部变量通过
推荐阅读
- JS问题:项目中如何区分使用防抖或节流?
- python是如何进行内存管理的
- 如何提升家庭财运
- 如何看懂珠宝玉石的鉴定证书
- 珍珠保养有诀窍,让你的珠宝更闪亮
- 熬夜后如何逆袭,肌肤焕发光彩?
- 积碳会给汽车造成什么影响?如何清除它?
- 吵架后滚床单,真的会更刺激吗?
- 迷你世界如何制作岩石砖,迷你世界刷岩石塔怎么做
- 如何开通抖音团购功能?开通后对销售有何影响?
