当前位置: 首页 > 面试题库 >

使用mapDispatchToProps避免无阴影的错误

聂奇
2023-03-14
问题内容

我有以下组件会no-shadow在上触发ESlint错误FilterButton props

import { setFilter } from '../actions/filter';


function FilterButton({ setFilter }) {
  return (
    <button onClick={setFilter}>Click</button>
  );
}

export default connect(null, { setFilter })(FilterButton);

如何在保持简洁语法mapDispatchToProps和ESlint规则的同时避免警告?

我知道我可以添加注释以禁止显示警告,但是对每个组件执行此操作似乎都是多余且乏味的。


问题答案:

这里有四个选项:

1.禁用规则。

为什么?

这是避免ESLint错误的最简单方法。

为什么不?

使用no-shadow规则有助于防止使用时出现非常常见的错误react-redux。也就是说,尝试调用未连接的原始动作(不会自动分派)。

换句话说, 如果您没有
使用分解并从道具中获取动作,则setFilter()不会分派动作(因为您将直接调用导入的动作,而不是通过props通过props调用关联的动作props.setFilter(),后者会react- redux自动为您分派)。

通过清除变量阴影,您和/或您的IDE更有可能发现错误。

怎么样?

向文件中添加eslintConfig属性package.json是执行此操作的一种方法。

"eslintConfig": {
    "rules": {
      "no-shadow": "off",
    }
  }

2.在将变量传递到时重新分配变量connect()

为什么?

您将从无阴影规则的安全性中受益,并且,如果您选择遵守命名约定,则这非常明确。

为什么不?

介绍样板。

如果不使用命名约定,则现在必须为每个操作提供备用名称(仍然有意义)。而且,相同的动作在各个组件中的命名方式可能会有所不同,从而使人们更难以熟悉动作本身。

如果确实使用命名约定,则名称会变得很长且重复。

怎么样?

没有命名约定:

import { setFilter } from '../actions/filter';

function FilterButton({ filter }) {
  return (
    <button onClick={filter}>Click</button>
  );
}

export default connect(null, { filter: setFilter })(FilterButton);

使用命名约定:

import { setFilter, clearFilter } from '../actions/filter';

function FilterButton({ setFilterConnect, clearFilterConnect }) {
  return (
    <button onClick={setFilterConnect} onBlur={clearFilterConnect}>Click</button>
  );
}

export default connect(null, {
  setFilterConnect: setFilter,
  clearFilterConnect: clearFilter,
})(FilterButton);

3.不要破坏道具的动作。

为什么?

通过显式使用props对象之外的方法,您无需担心阴影。

为什么不?

props/ 前置所有动作this.props是重复的(如果您要破坏所有其他非动作道具,则不一致)。

怎么样?

import { setFilter } from '../actions/filter';

function FilterButton(props) {
  return (
    <button onClick={props.setFilter}>Click</button>
  );
}

export default connect(null, { setFilter })(FilterButton);

4.导入整个模块。

为什么?

简明扼要。

为什么不?

其他开发人员(或您将来的自己)可能无法理解正在发生的事情。并且,根据您遵循的样式指南,您可能会违反no-wildcard-
imports规则

怎么样?

如果您只是从一个模块传递动作创建者:

import * as actions from '../actions/filter';

function FilterButton({ setFilter }) {
  return (
    <button onClick={setFilter}>Click</button>
  );
}

export default connect(null, actions)(FilterButton);

如果要传入多个模块,请使用具有REST语法的对象分解:

import * as filterActions from '../actions/filter';
import * as otherActions from '../actions/other';

// all exported actions from the two imported files are now available as props
function FilterButton({ setFilter, clearFilter, setOther, clearOther }) {
  return (
    <button onClick={setFilter}>Click</button>
  );
}

export default connect(null, { ...filterActions, ...otherActions })(FilterButton);

并且由于您在注释中提到了对ES6简洁语法的偏爱,因此不妨抛出带有隐式返回的arrow函数:

import * as actions from '../actions/filter';

const FilterButton = ({ setFilter }) => <button onClick={setFilter}>Click</button>;

export default connect(null, actions)(FilterButton);


 类似资料:
  • 阴影 Unity 的灯光可以将 阴影 从一个游戏对象投射到自身的其他部分或是附近的其他游戏对象上。阴影以『扁平』的方式体现游戏对象的尺寸和位置,因此可以为场景添加一定程度的深度和真实感。 场景视图中的游戏对象正在投射阴影 阴影如何工作? 考虑一种最简单的情况,在场景中只有单个光源。光线从光源出发并沿着直线传播,最终可能会碰撞到场景中的游戏对象。一旦光线碰撞到某个游戏对象,光线将无法继续传播和照亮前

  • 让我们看一下使用两种不同的方式去计算单词的个数,第一种方式使用 reduceByKey 另外一种方式使用 groupByKey: val words = Array("one", "two", "two", "three", "three", "three") val wordPairsRDD = sc.parallelize(words).map(word => (word, 1)) val

  • 按照一个又一个教程并尝试了一百万个不同的配置,我仍然无法让我的烧瓶应用程序在mod_wsgi下运行: 我的WSGI脚本 Apache 2 配置: 存在这些应用程序的整个目录都属于我的,并且我得到的错误是403禁止。 我在error.log中得到的信息: [8月14日星期六09:22:57.441200 2021][authz_core:错误][pid 24121:tid 1401669790819

  • 如果设备离线,如何不从阴影中检索数据? 或者如何从AWS物联网阴影中忽略过时的数据?

  • 这是一个关于示例项目的基本问题,因为我仍在学习Java8个特性的最佳实践。 假设我有一个OrderDetail对象,该对象表示OrderDetail的List。同时,包含一个和一个,以及和。 对于本例,我将把从移动到,这两个都是对象,具有属性,这将受到结果的影响。 现在,我需要更新所有

  • null本身不是对象,也不是Objcet的实例 问题: null代表不确定的对象, 是一个很模糊的概念, 容易产生二义性 Map.get(key)若返回value值为null,其代表的含义可能是该键指向的value值是null,亦或者该键在map中并不存在 优点: 从内存消耗和效率方面,null更加廉价 优化: Optional com.google.common.base.Optional Op