从 React 钩子返回 JSX 元素是不好的做法吗? [关闭]

Posted

技术标签:

【中文标题】从 React 钩子返回 JSX 元素是不好的做法吗? [关闭]【英文标题】:Is it bad practice to return a JSX element from a React hook? [closed] 【发布时间】:2021-07-09 19:13:01 【问题描述】:

我为警报框编写了以下钩子:

import MuiAlert from '@material-ui/lab/Alert';
import  Snackbar  from '@material-ui/core';
import React from 'react';

export const useAlert = () => 
    const [open, setOpen] = React.useState(false);
    const [message, setMessage] = React.useState('');

    const openAlert = (message) => 
        setOpen(true);
        setMessage(message);
    ;

    const closeAlert = (event, reason) =>     
        setOpen(false);
    ;

    return 
        openAlert,
        Alert: <Snackbar open=open onClose=closeAlert><MuiAlert onClose=closeAlert> message </MuiAlert></Snackbar>
    ;
;

我将这个钩子集成到其他功能组件中:

import  useAlert  from './useAlert';

const Dashboard = () => 
    const  openAlert, Alert  = useAlert();
    return (
        <div> Alert </div>
    )
;

我知道从 React 钩子返回 功能组件 是不好的做法,因为钩子会在每次渲染时生成组件的新实例。

但是,在这里,我返回的是 JSX 元素而不是组件。这仍然是不好的做法吗?

【问题讨论】:

【参考方案1】:

从自定义钩子返回 JSX 是一种反模式。虽然它有效,但几乎没有理由从自定义钩子返回 JSX。

返回 JSX 的函数可以简单地转换为带有钩子的函数组件。把它写成一个组件会在很多方面帮助你

提供了传递道具以轻松控制行为的灵活性 此外,它更容易记忆功能组件,以防止在没有任何更改的情况下进行额外的渲染。您也可以使用自定义挂钩来执行此操作,但您必须使用 useMemo 它可以更轻松地定义清晰的元素层次结构。

【讨论】:

以上是关于从 React 钩子返回 JSX 元素是不好的做法吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应中从渲染函数返回一个空的jsx元素?

如何从 React 中的方法返回 JSX?

如何在 React 中编写 useComponent 自定义钩子?

在 React 中,如何将 JSX 与返回更多 JSX 的 JS 函数一起返回?

React 最佳实践:JSX 中的逻辑与函数

React Hooks 滚动到元素