如何使用 useReducer([state,dispatch]) 和 useContext 避免无用的重新渲染?

2023-12-25

当使用多个 useReducers 时,每个组件都会使用部分状态重新渲染。

import React, { useContext } from 'react'
import Store from '../store'
import { setName } from "../actions/nameActions"

const Name = () => {
    const { state: { nameReducer: { name } }, dispatch } = useContext(Store)
    const handleInput = ({ target: { value } }) => { dispatch(setName(value)) }
    console.log('useless rerender if other part (not name) of state is changed'); 
    return <div>
        <p>{name}</p>
        <input value={name} onChange={handleInput} />
    </div>
}

export default Name;

如何避免这种无用的重新渲染?


If useState or useReducer状态改变,组件更新,组件本身没有办法阻止这种情况。

应防止在依赖于部分状态的子组件中重新渲染,例如通过使其纯净:

const NameContainer = () => {
    const { state: { nameReducer: { name } }, dispatch } = useContext(Store)
    return <Name name={name} dispatch={dispatch}/>;
}

const Name = React.memo(({ name, dispatch }) => {
    const handleInput = ({ target: { value } }) => { dispatch(setName(value)) }
    return <div>
        <p>{name}</p>
        <input value={name} onChange={handleInput} />
    </div>
});

NameContainer可以重写为 HOC 并起到与 Redux 相同的作用connect,从存储中提取所需的属性并将它们映射到连接的组件道具。

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

如何使用 useReducer([state,dispatch]) 和 useContext 避免无用的重新渲染? 的相关文章

  • 与 webpack 捆绑后,无法读取枚举的未定义属性

    我有一个 React 库 我想使用 Webpack 来构建它 该库是使用 Typescript 编写的 似乎一切正常 但由于某种原因枚举却不起作用 当我将库安装到我的 React 应用程序中时 我发现Cannot read properti
  • React.js 的状态基于其他状态

    我遇到了 React js 的一些问题 并且在调用 setState 时状态没有立即设置 我不确定是否有更好的方法来解决这个问题 或者这是否真的只是 React 的一个缺点 我有两个状态变量 其中一个基于另一个 原始问题的小提琴 http
  • 读取多个文件 cotent 的 React JS

    我正在尝试使用 React js 读取多个文件 但我的代码只读取一个文件 而不会读取其余文件 有什么建议吗 Thanks constructor props super props this state files changedFileI
  • 使用 React Router 路由到另一个组件时 CSS 不会改变

    当我使用以下命令将我的应用程序路由到另一个组件时反应路由器 DOM https www npmjs com package react router dom CSS 不会改变 这是演示代码的简约版本 App js import React
  • 获取自定义域以在 Github Pages 上使用 React

    我已遵循将自定义域定向到 Github 端和 DNS 端的 Github 项目页面的所有指南 该项目的 Github Pages 托管在自定义域之前可以正常工作 但现在要么不起作用 要么只是正常的 Github Pages 工作 但自定义域
  • 如何使 TextInput 只接受最多 2 位小数且最大值?

    这是我在 React Native 中的 TextInput 组件的代码片段 模拟器上的渲染如下所示 我想让输入字段只接受十进制数onChangeText函数 我正在更新状态的值 我有什么想法可以实现这个输入绑定的最大值吗 我要检查里面的值
  • create-react-app 之后 React npm start 不起作用

    我正在学习 React 而且我的英语很差 我已经有两个反应项目 但它们也不起作用 我按照以下步骤操作 npx 创建反应应用程序我的应用程序 cd 我的应用程序 npm 启动 但它不起作用 我尝试清理缓存并再次安装 npm 但没有成功 我该如
  • 将本地图像路径作为两个功能组件之间的 prop 传递

    我正在使用 React Native 开发一个项目 在该项目中我很难理解 props 在功能组件之间的工作原理 我的要求是创建一个可重用的按钮组件 我可以在其中传递项目内资源文件中的图像位置 这样它就会为我创建按钮 由于某种原因 如果我手动
  • iOS 是否有像 Android 一样的应用内更新功能?

    我为 Android 和 iOS 开发了一个移动应用程序 现在每周我们都会发布 2 个更新 大多数时候 Android 和 iOS 用户会停止应用程序的自动更新 但是 如果有重要更新或错误修复或新功能 那么我们必须要求用户更新应用程序以获得
  • 严格模式与 React 18 的工作方式是否不同?

    考虑下面的片段 有了 React 18 count每次渲染时都会在控制台上打印两次 但在 React 17 中它只打印一次 反应 18 示例 function App const count setCount React useState
  • React Typescript:从文件输入获取文件

    我得到的错误是Property files does not exist on type ChangeEvent
  • 生成日期并将新属性添加到对象数组中

    我无法控制数据列表 但我需要将其映射到日期范围数据 数据列表如下所示 只有 from 和 to date from 2017 05 06 00 00 00 date to 2017 05 08 23 59 59 state name San
  • 如何在rails中使用npm包?

    我正在尝试使用王牌编辑 https github com ajaxorg ace在我的 Ruby on Rails 应用程序中 大部分视图由 React 组件组成 我正在使用反应轨道宝石 https github com reactjs r
  • 反应模式 shouldCloseOnOverlayClick 不起作用

    我正在使用反应模式 点击叠加层后模式不会关闭 我为 isOpen 和 onRequestClose 提供了属性 但模式保持打开状态 closeModal gt this setState modalIsOpen false
  • 添加 CSS 来响应创建的元素,例如 data-reactroot

    在我的根div下 react 自动 创建另一个div 有没有办法向该 div 添加一个类 我需要添加 height 100 来防止背景内容在显示覆盖层时在移动设备中滚动 这就是我检查网站上的元素时显示的方式 单击按钮时 我需要将 heigh
  • 具有两组子组件的 React 组件

    我正在创建一个组件 需要接收两组子组件并放置在组件的两个不同部分中 let CreditCardForm icons fields gt div div div div icons div div div fields div let Cr
  • Nextjs 无法在生产环境中的“.next”目录中找到有效的构建

    我正在 docker 中运行我的应用程序 但我的生产构建和启动脚本仅在 docker 环境中失败 虽然node env开发在docker环境下运行良好 这是我的脚本 无法进行生产构建并启动服务器 我正在使用nodemon和babel bui
  • 使用 nginx 在云上部署 django 和 React

    我有一个 digitalocean 服务器 并且已经使用 Gunicorn 和 nginx 部署了 Django 后端服务器 如何在同一台服务器上部署 React 应用程序 您可以构建 React 应用程序并使用 Nginx 提供其静态文件
  • 刷新或直接点击链接时找不到 React.js 页面

    我在此链接上有一个反应项目 https notchy cross 000webhostapp com https notchy cross 000webhostapp com 如果向下滚动 您会看到一个名为 产品类别 的部分 https i
  • ReactTransitionGroup 不适用于 React-redux 连接组件

    我正在开发一个更大的项目 但我创建了这个简短的示例来说明问题 如果我使用Box组件 它的工作原理 它在控制台中输出componentWillEnter and componentWillLeave当我们点击按钮时 如果我使用BoxConta

随机推荐

  • redis-py 退出时不关闭线程

    我正在使用 redis py 2 10 6 和 redis 4 0 11 我的应用程序使用 redis 作为数据库和 pubsub 当我关闭时 我经常会遇到挂起或崩溃的情况 后者通常会抱怨处理 pubsub 回调时发生的错误文件描述符或文件
  • Access 中的多个 LEFT JOIN

    我有以下查询 适用于 MySQL DELETE test1 test2 test3 test4 FROM test1 LEFT JOIN test2 ON test2 qid test1 id LEFT JOIN test3 ON test
  • PHP中如何检查IP地址是否在两个IP范围内?

    我有一个 IP 地址 并且还获得了另外两个 IP 地址 它们一起创建了一个 IP 范围 我想检查第一个IP地址是否在这个范围内 我怎样才能在 PHP 中找到它 With ip2long http php net manual en func
  • 自定义单选ListView

    我想制作一个自定义列表视图 在一行中具有两个 TextView 和一个单选按钮 在列表项上单击单选按钮状态应为切换 我不能在这里使用简单适配器 我已经问过这个问题了单选ListView自定义Row Layout https stackove
  • Android 工具栏仅在 AppBarLayout 折叠时显示标题和副标题

    我有 AppBarLayout CollapsingToolbarLayout 和工具栏的活动 从代码中设置标题和副标题 最初我希望工具栏隐藏并在应用栏布局折叠时显示 使用我的代码 它可以工作 工具栏最初隐藏 但它始终显示工具栏标题和副标题
  • 合并 MongoDB 聚合中的数组字段

    使用 MongoDB 聚合框架时是否可以合并数组字段 这是我试图解决的一个摘要问题 用于聚合的示例输入文档 Category 1 Messages Msg1 Msg2 Value 1 Category 1 Messages Value 10
  • 使用 UNC 路径的 Windows 8 StorageFile.GetFileFromPathAsync

    有没有人曾经设法使用 Windows 8 应用程序将文件从 unc 目录复制到本地目录 根据这里的官方文档 http msdn microsoft com en us library windows apps hh967755 aspx 可
  • 如何在 C# 中解密由 PHP 中的 mcrypt 加密的加密 MCRYPT_RIJNDAEL_256 值?

    我正在尝试从 Linux 端管理的数据库表中读取 Base64 编码的值 在那里面 表中有一个名为first name 的列 在 Linux 端 我可以通过在 PHP 中使用以下命令轻松解密 data mcrypt decrypt MCRY
  • C++11 - 编译时多态解决方案

    假设我正在编写一个跨平台库 我必须以不同平台有不同行为的方式组织代码 并且这种行为 或定义 是在编译时根据我的库所在的平台选择的正在编译中 在 C 中执行此操作的 通常 方法是用大量的内容污染代码 ifdef当编写方法或类时 方法的问题在于
  • UTF16 十六进制转文本

    我有 UTF 16 十六进制表示形式 例如 0633064406270645 它是阿拉伯语中的 S 我想将其转换为其等效文本 在 PostgreSQL 中有直接的方法可以做到这一点吗 我可以像下面这样转换 UTF 代码点 不幸的是 似乎不支
  • F# 类型提供程序构建非常非常慢

    我正在使用类型提供程序 特别是 sql 实体框架类型提供程序 我正在针对一个包含大量对象的数据库编写测试 并且它是远程的 因此连接有点慢 每次我构建项目都会花费很多时间 需要几分钟才能完成构建 我缺少什么为什么编译器不缓存类型信息 附 使用
  • lxml.etree、element.text 不返回元素的整个文本

    我通过 xpath 废弃了一些 html 然后将其转换为 etree 与此类似的东西 td text1 a link a text2 td 但是当我调用 element text 时 我只得到 text1 它必须在那里 当我在 FireBu
  • laravel 从模型生成数据库

    我正在使用 Laravel 的现有项目 并且该现有项目已经有模型 这里是一个示例
  • DVTCoreSimulatorAdditionsErrorDomain Xcode 10GM

    当我将Xcode更新到Version 10 GM时 构建成功 但模拟器无法工作 有错误 操作无法完成 DVTCoreSimulatorAdditionsErrorDomain 错误 0 run xcrun simctl erase all在
  • 如何在mysql中为不同的字符长度添加前导零?

    您好 我对不同的表有一个查询 并且所有表都有不同的长度 这需要前导零ID 是否可以使用一个查询向任何表添加前导零 假设第一个查询是insert to tbl1 field1 CHAR 3 001 那么下一个查询是insert to tbl2
  • 在 Python 中读取和切片二进制数据文件的最快方法

    我有一个处理脚本 旨在提取 uint16 类型的二进制数据文件 并一次以 6400 块为单位进行各种处理 该代码最初是用 Matlab 编写的 但由于分析代码是用 Python 编写的 因此我们希望通过在 Python 中完成所有操作来简化
  • 在 Python 中将可变长度字符串拆分为变量的最佳方法是什么?

    假设我有一个由可变长度的逗号分隔的整数字符串 分割字符串并将整数存储到变量中的最佳方法是什么 目前 我有以下内容 input sys argv 1 mylist int x for x in input split if len mylis
  • 如何在应用程序设置中存储 int[] 数组

    我正在使用 C Express 2008 创建一个简单的 Windows 窗体应用程序 我是一位经验丰富的 C 开发人员 但我对 C 和 NET 几乎是全新的 我目前正在使用设置设计器和代码存储一些简单的应用程序设置 如下所示 Store
  • Django-Tastypie:如何访问 Bundle 中的 (Http)request 对象?

    我需要访问资源脱水中的 HttpRequest 对象 方法 在文档中 它表明bundle request是一个有效的属性 它是 在 resources html 页面中 当我尝试将其添加到我的代码中时 我得到一个 错误声称 Bundle 对
  • 如何使用 useReducer([state,dispatch]) 和 useContext 避免无用的重新渲染?

    当使用多个 useReducers 时 每个组件都会使用部分状态重新渲染 import React useContext from react import Store from store import setName from acti