4赞
516
当前位置:  开发笔记 > 编程语言 > 正文

如何在redux上使用reselect获取ownProps?

如何解决《如何在redux上使用reselect获取ownProps?》经验,为你挑选了1个好方法。

我想创建一个带有memoization的选择器,使用基于某些ownProps的重新选择mapStateToProps.



1> 小智..:

您可以使用react-reduxconnect提供的方法将选择器连接到组件,然后将组件props(ownProps)作为第二个参数传递给选择器.

container.js

import { connect } from 'react-redux';
import { getVisibleTodos } from './selectors';

...

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

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

export default VisibleTodoList;

然后,您可以在选择器中访问这些道具

selectors.js

import { createSelector } from 'reselect';

const getVisibilityFilter = (state, props) =>
  state.todoLists[props.listId].visibilityFilter;

const getTodos = (state, props) =>
  state.todoLists[props.listId].todos;

const getVisibleTodos = createSelector(
  ...
);

export default getVisibleTodos;

但是,如果您有多个要传递道具的组件实例,则无法正确记忆.在这种情况下,选择器props每次都会收到一个不同的参数,因此它总是会重新计算而不是返回一个缓存的值.

要在传递props 保留memoization的同时跨多个组件共享选择器,组件的每个实例都需要其自己的选择器私有副本.

您可以通过创建一个函数来执行此操作,该函数每次调用时都会返回选择器的新副本.

selectors.js

import { createSelector } from 'reselect';

const getVisibilityFilter = (state, props) =>
  state.todoLists[props.listId].visibilityFilter;

const getTodos = (state, props) =>
  state.todoLists[props.listId].todos;

const makeGetVisibleTodos = () => {
  return createSelector(
    ...
  );
}

export default makeGetVisibleTodos;

如果mapStateToProps提供给connect 的参数返回一个函数而不是一个对象,它将用于为mapStateToProps容器的每个实例创建一个单独的函数.

考虑到这一点,您可以创建一个makeMapStateToProps创建新getVisibleTodos选择器的mapStateToProps函数,并返回一个对新选择器具有独占访问权限的函数:

import { connect } from 'react-redux';
import { makeGetVisibleTodos } from './selectors';

...

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

const VisibleTodoList = connect(
  makeMapStateToProps,
)(TodoList);

export default VisibleTodoList;

现在,VisibleTodosList容器的每个实例都将通过mapStateToProps私有getVisibleTodos选择器获得自己的功能.无论容器的渲染顺序如何,Memoization现在都能正常工作.


这是从Reselect文档中修改(blatently复制)


推荐阅读
  • 最近在学习使用安卓的ndk开发遇到了一些问题,在这里记录下,免得再次踩坑,虽然谷歌官方推荐使用CMake编译,ndk即将废弃,但是依旧还是有很多人在使用ndk编译的,两种方式差别主要在于编译方式上,其 ... [详细]
  • 如何解决《在本机ios中侦听事件》经验,为你挑选了2个好方法。 ... [详细]
  • ReactHook讲解Hook的介绍为什么要用Hook?基础HookAPIuseState:定义state变量和更新变量函数useEffectÿ ... [详细]
  • 通过前面的阅读,想必大家对注解都有了一个简单的理解,能够进行简单的应用了。下面我再给大家讲一种注解的使用。其实,千变万化,注解还是那样子,就是通过反射获取注解,然后分析注解,从而实 ... [详细]
  • 如何解决《React,Redux和Immutable》经验,为你挑选了1个好方法。 ... [详细]
  • leetcode: houserobber [打家劫舍] 递归法、动态规划、滚动数组
    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统, 如果两间 ... [详细]
  • 如何解决《如何在离子无线电元件上使用ngModel?》经验,为你挑选了1个好方法。 ... [详细]
  • 构造url:和pyspider一样方便,具体实现用parse一层一层解析url到最终一层之后爬取 #使用带数字的url用列表表达式 start_urls ... [详细]
  • 平滑滚动角度2
    如何解决《平滑滚动角度2》经验,为你挑选了3个好方法。 ... [详细]
  • 开发笔记:一览js模块化:从CommonJS到ES6 ... [详细]
  • 10.rabbion负载均衡和服务调用
    springcloudribbon是基于NetflixRibbon实现的一套客户端(注意是客户端)负载均衡工具LB负载均衡(LoadBalance)是什么简单的说就是将用户的请求平 ... [详细]
  • RocketMQ——事务消息
    事务消息就是事务里参杂着发消息的动作 如果一个事务里牵扯到发消息的操作,那么一旦消息被消费了,想要回滚,这时就变的很难所以在没有commi ... [详细]
  • 【解决】docker启动报错:Runningmodprobext_conntrackfailedwithmessage:`modprobe:ERROR:couldnotinsert'xt_conntrack'2019-5-9昨天给一台新机器装安装docker,但报错了,解决了一整天也没有头绪。今天起了个大早,破天荒的吃了早饭,然后继续解决。终于找到了问题。 ... [详细]
  • Linux查看硬件信息超强命令sar以及可视化工具ksar的用法是怎样的
    这篇文章给大家介绍Linux查看硬件信息超强命令sar以及可视化工具ksar的用法是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大 ... [详细]
  • 如何解决《React:何时使用基于ES6类的组件与功能ES6组件?》经验,为你挑选了3个好方法。 ... [详细]
author-avatar
xn60ljv
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有