将组件存储在状态中是个好主意吗?

2024-01-01

将整个 React 组件存储在组件状态或 redux 状态中是一个好习惯吗?是的,它是可选的,因为我们可以在状态中存储字符串并有条件地渲染组件,但在某些情况下,将组件存储在状态中更简单。

例如,

const [ components ]  = useState([
    { id: 1, component: <Login />, title: `Login` },
    { id: 2, component: <Register />, title: `Register` },
])

但组件可能很大,我想知道这是否有什么区别。这是一个不好的做法吗?


我不会推荐它。但并不是因为这些实例会以某种方式给国家增加太多的规模(我认为它们不会)。

我认为最有力的论据是:实例化的组件已经过时了;它们的属性仅具有实例化时分配的值。 这可能会也可能不会导致未来出现问题。它肯定会为您的应用程序中的错误引入额外的 RISC。 通常,所有组件都是在渲染函数运行时创建并参数化的;接收最新的房产价值;对于那些保留在状态中的人来说,情况不会如此。

实例化组件通常不是一个昂贵的操作;并且它并不意味着相应的 DOM 更新,因为 React 使用 diff 机制来决定 DOM 的哪些部分需要更新。

我能想到的所有用例(可以考虑在状态中存储实例化组件)都可以通过更反应惯用的方式来解决:

  • 有条件渲染的元素:

    const [showPrompt, setShowPrompt] = useState(false);
    // ...
    <div>{showPrompt && <ConfirmationPrompt />}</div>;
    

    or

    const MyComponent = ({showPrompt}) => {
    // ...
    <div>
      { showPrompt && <ConfirmationPrompt /> }
    </div>
    
  • 优化创建新反应元素的次数:
    如果您有理由认为您的渲染函数相当繁重并且您想减少它运行的次数,您可以使用useMemo https://reactjs.org/docs/hooks-reference.html#usememo钩子(在渲染函数中记住计算结果)或者您可以将整个组件包装在React.memo() https://reactjs.org/docs/react-api.html#reactmemo所以只有当 props 改变时才会重新渲染。

    const primeNumbers = useMemo(() => calculatePrimeNumbers(limit), [limit]);
    
    const MyComponent = React.memo((props) => {
      /* render using props */
    });
    

我最初的回答是刻薄的。我对其进行了编辑,保留了推理,但删除了无用的部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将组件存储在状态中是个好主意吗? 的相关文章

随机推荐

  • 如何合并数值模型和嵌入序列模型来处理 RNN 中的类别

    我想为我的分类特征构建一个带有嵌入的单层 LSTM 模型 我目前有数字特征和一些分类特征 例如位置 它不能进行单热编码 例如使用pd get dummies 由于计算复杂性 这正是我最初打算做的 让我们想象一个例子 样本数据 data us
  • 检查SQL表是否存在

    以独立于数据库的方式检查 Sql 数据库中是否存在表的最佳方法是什么 我想出了 bool exists const string sqlStatement SELECT COUNT FROM my table try using OdbcC
  • 输入字符串的格式不正确#2

    double temp temp double Convert ToDouble 1234 5678 嘿 伙计们 女士们 我一生都无法弄清楚为什么上面的行不起作用 上面的行给了我一个运行时错误 未处理的类型异常 System FormatE
  • 计算带有 LIMIT 的 MySQL 记录

    当我尝试计算表中的记录数时 即使 SQL 语句有LIMIT进入其中 总体来说它是有效的 但是发生了一些奇怪的事情 代码 sql SELECT COUNT AS count FROM posts ORDER BY post date DESC
  • Angular2(RC-4):无法读取未定义的属性“pathsWithParams”

    在 angular2 RC 4 中使用子路由时出现此错误 无法读取未定义的属性 pathsWithParams 我的路由文件包含 export const routes RouterConfig path component HomeCom
  • Nodemailer 的邮件在 Azure 服务器上不起作用

    我正在尝试使用 Microsoft azure 上的 Express JS 服务器的 Nodemailer 邮件 api 发送邮件 它在本地计算机上取得成功 但在天蓝色服务器 远程 上却没有成功 任何想法 var mail require
  • CRTP——访问不完整类型成员

    相关问题 one https stackoverflow com questions 6006614 c static polymorphism crtp and using typedefs from derived classes tw
  • 如何在(功能)F# 中创建递归数据结构值?

    type 的值如何 type Tree Node of int Tree list 有一个以函数方式生成的引用自身的值吗 对于 Tree 的合适定义 结果值应等于以下 Python 代码中的 x x Tree x tlist x Edit
  • 将光标移动到 UITextField 的开头

    有没有办法让光标位于a的开头UITextField 当我显示带有内容的控件时 光标放置在文本的末尾 我想把它移到开头 UITextField符合UITextInput协议 它提供了让您控制所选范围的方法 这在我的测试中有效 void tex
  • Python:将 3D 椭球(扁形/长形)拟合到 3D 点

    亲爱的 stackoverflow 用户 我面临如下问题 我想在 python 脚本中将 3D 椭球体拟合到 3D 数据点 起始数据是一组 x y 和 z 坐标 笛卡尔坐标 我想要得到的是 3D 数据点凸包的最佳拟合椭球定义方程中的 a 和
  • AngularFire httpsCallable Object(...) 不是一个函数

    我想在我的 Ionic 3 应用程序中调用 httpsCallable 函数 我正在尝试遵循这些文档 https firebase google com docs functions callable https firebase goog
  • 在 Java 中实现双缓冲

    我有一个简单的 Java JFrame 画布 我每半秒左右更新一次屏幕上的内容 并且有闪烁 我想实现双缓冲来消除闪烁 但我对 Java 相当陌生 不熟悉如何做到这一点 我找到了一些例子 但不确定如何将他们的方法应用到我的方法中 以下是我现在
  • 删除 MS Excel 中特定字符左侧的所有文本

    这是一个与excel相关的问题 我想删除字符串中特定字符或多个字符左侧的所有文本 所有字符 例如 假设我的单元格中有一个字符串大家好 欢迎来到 stackoverflow 现在我想删除 堆栈 左侧的所有字符 意味着结果应该是堆栈溢出 仅限堆
  • WindowsBase.dll 中发生了“System.ComponentModel.Win32Exception”类型的第一次机会异常

    我有一个 NET 4 0 WPF 项目 当我打开文件对话框时 选择一些文件并按 确定 按钮 然后我在输出窗口中看到以下错误 WindowsBase dll 中发生了 System ComponentModel Win32Exception
  • Plotly r,按变量划分的线型

    我正在尝试制作一个散点图 其中线条样式由因子变量指定 就像颜色一样 但我无法让它工作 library plotly df lt data frame x rnorm 20 y rnorm 20 col c rep 1 10 rep 2 10
  • 将补充 Unicode 字符映射到 BMP(如果可能)

    我遇到了这样的问题 我的 XML 解析器 VTD XML 似乎无法处理 Unicode 补充字符 如果我在这里已经错了 请更正 看起来 解析器只使用这些字符的低 16 位 我无法切换到我正在处理的项目中的另一个解析器 我正在解析 Medli
  • 图书馆的异常处理策略

    构建 NET 库时 您的异常处理策略是什么 具体来说 您关于处理库调用内的异常并将其暴露给调用代码的政策是什么 例如 您是否会像对待其他函数一样对待库函数 从而让它无法处理的所有异常按原样流出 您会为该库创建自定义异常吗 您会捕获所有异常并
  • Fixtures、Selenium 和 Rails(天哪?)

    Rails 应用程序上的 Selenium 测试使用哪些数据 你从固定装置加载吗 使用现有的开发数据库 使用单独的 非固定装置 数据库 我正在考虑我的选择 我有一个 Rails 应用程序 其中包含一个大型 Selenium 测试套件 该套件
  • 使用 jqueryhammer.js 2 和事件委托长按(按住)

    我最近升级到hammer js 2 我注意到的第一件事就是 按住 已被 按下 取代 我的旧代码在事件委托方面工作得很好 但切换到按下似乎只有当我将其放在特定元素上时才有效 注意 我通过jquery插件使用hammer js 锤子 js 1
  • 将组件存储在状态中是个好主意吗?

    将整个 React 组件存储在组件状态或 redux 状态中是一个好习惯吗 是的 它是可选的 因为我们可以在状态中存储字符串并有条件地渲染组件 但在某些情况下 将组件存储在状态中更简单 例如 const components useStat