Redux Reselect 记忆是如何工作的?

2024-06-22

我正在尝试整合reselect进入我当前的应用程序,一如既往,首先我开始阅读文档,然后如果需要,再阅读另一个资源。我无法理解文档的一个特殊部分,也找不到可以更清晰地解释的资源。现在我来这里是为了得到一些明确的解释。 所以它在文档中说`

import React from 'react'
import Footer from './Footer'
import AddTodo from '../containers/AddTodo'
import VisibleTodoList from '../containers/VisibleTodoList'

const App = () => (
  <div>
    <VisibleTodoList listId="1" />
    <VisibleTodoList listId="2" />
    <VisibleTodoList listId="3" />
  </div>
)

将 getVisibleTodos 选择器与多个实例一起使用 VisibleTodoList 容器将无法正确记忆:

import { connect } from 'react-redux'
import { toggleTodo } from '../actions'
import TodoList from '../components/TodoList'
import { getVisibleTodos } from '../selectors'

const mapStateToProps = (state, props) => {
  return {
    // WARNING: THE FOLLOWING SELECTOR DOES NOT CORRECTLY MEMOIZE
    todos: getVisibleTodos(state, props)
  }
}

const mapDispatchToProps = (dispatch) => {
  return {
    onTodoClick: (id) => {
      dispatch(toggleTodo(id))
    }
  }
}

const VisibleTodoList = connect(
  mapStateToProps,
  mapDispatchToProps
)(TodoList)

export default VisibleTodoList

使用createSelector创建的选择器的缓存大小为1并且仅 当参数集与其相同时返回缓存的值 前一组参数。如果我们交替渲染<VisibleTodoList listId="1" /> and <VisibleTodoList listId="2" />, 这 共享选择器将交替接收{listId: 1} and {listId: 2}作为它的 props 参数。这将导致参数成为 每次调用都不同,因此选择器将始终重新计算 返回缓存的值。

注意最后一句。如果我们传递不同的值,为什么要返回缓存的值ids 并且它应该返回不同的值取决于ids ?


所以我们让这个选择器获取我们的状态VisibleTodoList成分:

const mapStateToProps = (state, props) => {
  return {
    todos: getVisibleTodos(state, props)
  }
}

如果我们渲染组件:

return (
    <div>
        <VisibleTodoList listId="1" />
    </div>
)

然后,选择器被调用,如下所示:getVisibleTodos(state, { listId: 1 }),选择器将结果(待办事项列表 1 对象)存储(记忆)在内存中。

如果我们使用相同的 props 渲染组件两次:

return (
    <div>
        <VisibleTodoList listId="1" />
        <VisibleTodoList listId="1" />
    </div>
)
  1. 选择器被调用并且结果被记忆

  2. 选择器被第二次调用,它看到{ listId: 1 }与第一次相同的 prop 参数,因此它只返回记忆值。

如果我们使用不同的 props 渲染组件两次:

return (
    <div>
        <VisibleTodoList listId="1" />
        <VisibleTodoList listId="2" />
    </div>
)
  1. 选择器被调用并且结果被记忆

  2. 选择器被第二次调用,它看到{ listId: 2 }与第一次的 props args 不一样{ listId: 1 },因此它会重新计算并在内存中记忆新结果(待办事项列表 2 对象)(覆盖之前的记忆)。

如果我们希望每个组件都有自己的记忆,每个组件实例必须有自己的选择器实例。

例如:

// selector
const makeGetVisibleTodos = () => createSelector(
    // ... get the visible todos
);

// each has their own memoization space:
const foo = makeGetVisibleTodos(); // this is an instance
const bar = makeGetVisibleTodos(); // this is a separate instance

因此将其应用到组件上:

// component
const mapStateToProps = () => {
    const getVisibleTodos = makeGetVisibleTodos(); // this instance get bound to the component instance

    return (state, props) => {
        return {
            todos: getVisibleTodos(state, props)
        }   
    }
}

现在,如果我们使用不同的 props 渲染组件两次:

return (
    <div>
        <VisibleTodoList listId="1" />
        <VisibleTodoList listId="2" />
    </div>
)
  1. with <VisibleTodoList listId="1" />选择器的第一个实例被调用,结果被记忆

  2. with <VisibleTodoList listId="2" />选择器的不同实例被调用并且结果被记忆

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

Redux Reselect 记忆是如何工作的? 的相关文章

随机推荐

  • asp5 IConfigurationRoot 获取 json 数组

    我正在尝试向我的 asp 5 mvc 6 Web 应用程序 rc1 final 库 提供一些额外的配置数据以部署在 Azure 上 此附加数据的一部分由 json 文件中的数据数组组成 我可以将此 json 文件添加到我的配置中 并且在调试
  • 提交未经允许的参数时如何引发异常?

    我找到了这段代码here http edgeapi rubyonrails org classes ActionController Parameters html ActionController Parameters action on
  • FIRMessaging 委托错误

    我尝试添加 FIRMessagingDelegate 但 Xcode 给出错误 Cannot find protocol declaration for FIRMessagingDelegate 我导入了 FirebaseMessaging
  • 如何使用 JavaScript/CSS 制作圆形 ScrollBox?

    我想重新创建圆形滚动框 如下面的 GIF 所示 我不认为如果使用 css 制作圆形滚动框是可能的 那么我想添加padding left给每个孩子ul使滚动框显示为圆形 为了达成这个 向 li 1 添加 0px 的内边距向 li 2 添加 2
  • 致命错误:未捕获错误:无法使用标量作为数组警告

    我有以下代码 final 1 gt 2 id 1 final id 0 3 该代码似乎工作正常 但我收到此警告 警告 不能在第 X 行中将标量值用作数组 符合 final id 0 3 谁能告诉我如何解决这个问题 你需要设置 final i
  • Coq执行分号“;”的区别和句号“.”

    给定一个有效的 Coq 证明 使用 战术上 是否有一个通用公式可以将其转换为有效的等效证明 替代 许多 Coq 证明都使用 或战术排序战术 作为初学者 我想观察各个步骤的执行 所以我想替换 for 但令我惊讶的是 我发现这可能会破坏证明 有
  • 创建无边框表单而不丢失 Windows 命令

    我已将表单更改为无边框表单 我只是更改了BorderStyle财产给bsNone 但现在我的应用程序失去了 Windows 锚点和一些命令 例如 WIN 对齐表单客户端 WIN 最小化表格 WIN 表格右对齐 WIN 表格左对齐 我尝试过设
  • 我应该使用 Node.js 而不是 Rails 来实现实时 Web 应用程序吗?

    我正在构建一个复杂的网络应用程序 该应用程序必须大量处理实时数据并向用户显示该数据 鉴于我更习惯Rails 我想知道转储rails并使用node js来构建应用程序是否有很大的优势 或者是否有一种方法可以在Rails中拥有Node js的实
  • 我什么时候应该中断一个函数?

    将长函数分解为主函数和辅助函数是明智的做法 我知道模块外部只会调用主要函数 但它的长度可能会令人生畏 课本对行数有限制 但我觉得这太死板了 附 我正在用 Python 编程 需要处理传入的消息 该函数返回一个包含消息的元组 但采用 Pyth
  • DOT/graphviz 边缘标签中的下标

    如何使用 Graphviz DOT 的 HTML 功能向边缘标签添加下标字符 像这样 digraph g 1 gt 2 label
  • “iOS 17.0.simruntime”无法打开,因为无法验证开发者

    我刚刚下载了 iOS 17 运行时 但将其复制到目标位置后 会打开此弹出窗口 并且 Xcode 无法按预期使用模拟器 Downloaded from the Apple Developer site 我怎样才能解决这个问题 可以打电话sim
  • 生成唯一的机器 ID

    我需要编写一个函数来生成一个对于运行 Windows 操作系统的给定机器来说唯一的 id 目前 我正在使用 WMI 查询各种硬件参数 并将它们连接在一起并对它们进行哈希处理以得出唯一的 id 我的问题是 我应该使用哪些建议参数 目前 我使用
  • 如何保存Chrome的Coverage工具分析的结果?

    乍一看 它看起来像是非常有用的工具 但是我找不到任何类似的操作Save或类似的选项 有谁知道是否可以保存Chrome的Coverage工具分析的结果 谢谢 正如上面的评论中提到的 以及标记重复 https stackoverflow com
  • 具有不同时间步长的卡尔曼滤波器

    我有一些数据代表从两个不同传感器测量的物体的位置 所以 我需要进行传感器融合 更困难的问题是来自每个传感器的数据基本上是在随机时间到达的 我想使用 pykalman 来融合和平滑数据 pykalman如何处理可变时间戳数据 数据的简化示例如
  • 如何仅列出 Bash 目录中的文件而不列出目录?

    如何列出一个文件夹的所有文件 但不列出其文件夹或子文件 换句话说 我怎样才能只列出文件 Using find find maxdepth 1 type f 使用 maxdepth 1选项确保您只在当前目录中查找 或者 如果您替换 与某个路径
  • 如何限制 celery 中运行的任务数量

    我有一个在 Heroku 上运行的应用程序 我使用 celery 和工作测功机来处理后台工作 我正在运行使用大量内存的任务 这些任务大致在同一时间启动 但我只想同时运行一两个任务 其他任务必须在队列中等待 我怎样才能做到这一点 如果它们同时
  • 有没有可能通过 Android Studio 在 Android 的 Windows 子系统上运行 Android 应用程序?

    如果我们能够在 Android 的 Windows 子系统上调试 Android 应用程序 那就太好了 当然这是可能的 它的工作原理与任何外部设备类似 首先在 Windows 子系统中启用 Android 设置应用程序的开发人员模式 And
  • rand()/srand()函数是如何在C中实现的[重复]

    这个问题在这里已经有答案了 可能的重复 rand 是如何工作的 它有一定的倾向吗 有没有更好用的东西 https stackoverflow com questions 3539398 how does rand work does it
  • 凸包中最大的三角形

    这个问题已经得到解答 但我面临的主要问题是理解答案之一 From https stackoverflow com a 1621913 2673063 https stackoverflow com a 1621913 2673063 下面的
  • Redux Reselect 记忆是如何工作的?

    我正在尝试整合reselect进入我当前的应用程序 一如既往 首先我开始阅读文档 然后如果需要 再阅读另一个资源 我无法理解文档的一个特殊部分 也找不到可以更清晰地解释的资源 现在我来这里是为了得到一些明确的解释 所以它在文档中说 impo