FilterButton
props
でno-shadow
ESlintエラーをトリガーする次のコンポーネントがあります。
import { setFilter } from '../actions/filter';
function FilterButton({ setFilter }) {
return (
<button onClick={setFilter}>Click</button>
);
}
export default connect(null, { setFilter })(FilterButton);
mapDispatchToProps
の簡潔な構文とESlintルールの両方を維持しながら、警告を回避するにはどうすればよいですか?
警告を抑制するコメントを追加できることは知っていますが、すべてのコンポーネントに対してそれを行うことは冗長で退屈なように見えます。
ここには4つのオプションがあります。
なぜ?
ESLintエラーを回避する最も簡単な方法です。
なぜそうではないのですか?
影なしの規則は、_react-redux
_を使用する際の非常に一般的なバグを防ぐのに役立ちます。つまり、未接続の未接続アクション(自動的にディスパッチされないアクション)を呼び出そうとします。
言い換えると、あなたがを使用していない場合(-===-)小道具からアクションを取得し、setFilter()
はアクションをディスパッチしません(あなたのため_react-redux
_が自動的にディスパッチするprops.setFilter()
を介してpropsを介して接続されたアクションを呼び出すのではなく、インポートされたアクションを直接呼び出します。
variable shadowing をクリーンアップすることにより、あなたおよび/またはIDEがエラーを検出する可能性が高くなります。
方法は?
eslintConfig
プロパティを_package.json
_ファイルに追加するのは これを行う1つの方法 です。
_"eslintConfig": {
"rules": {
"no-shadow": "off",
}
}
_
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);
_
なぜ?
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);
_
なぜ?
簡潔です。
なぜそうではないのですか?
他の開発者(またはあなたの将来の自己)は、何が起こっているのか理解するのに苦労するかもしれません。そして、あなたがフォローしているスタイルガイドによっては、 no-wildcard-imports rule を破っているかもしれません。
方法は?
1つのモジュールからアクションクリエーターを単に渡す場合:
_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);
_
5番目のオプション:
eslintrc
ルールを介して特定の例外を許可します。module.exports = {
rules: {
'no-shadow': [
'error',
{
allow: ['setFilter'],
},
],
}
}
なぜ?
変数のシャドーイングは望ましくありませんが、特定のケースでは回避できません。
なぜ?
本当にコードベースで変数のシャドーイングを望まない。 ????
オプション番号6。
import { setFilter } from '../actions/filter';
// eslint-disable-next-line no-shadow
function FilterButton({ setFilter }) {
return (
<button onClick={setFilter}>Click</button>
);
}
export default connect(null, { setFilter })(FilterButton);
または
import { setFilter } from '../actions/filter';
/* eslint-disable no-shadow */
function FilterButton({ setFilter }) {
/* es-lint-enable */
return (
<button onClick={setFilter}>Click</button>
);
}
export default connect(null, { setFilter })(FilterButton);
Es-lintルールを一時的に無効にする2番目の方法は、最初の方法とは異なり、複数行のコードに使用できます。より多くの引数を渡し、それらを複数行のコードに分割すると便利です。
なぜ?
これは、いくつかのユースケースに簡単で適切なオプションです(たとえば、チーム/組織は特定のes-lint設定を使用し、これらの設定を変更することは推奨されません)。コードの行でes-lintエラーを無効にしますが、mapDispatchToProps
構文には影響せず、ルールはコードの行の外で完全にアクティブです。
なぜ?
そのような種類のコメントでコードを肥大化させることは望まないか、禁止されています。 es-lintの振る舞いに影響を与えることは望まないか、禁止されています。