Il y a quatre options:
1. Désactiver la règle.
Pourquoi?
C'est la façon la plus simple pour éviter les ESLint erreur.
Pourquoi Pas?
Le pas de l'ombre à la règle contribue à prévenir un très commun de bug lors de l'utilisation d' react-redux
. C'est, en tentant d'invoquer la brute, sans lien d'action (qui n'est pas automatiquement expédié).
En d'autres termes, si vous n'étiez pas à l'aide de déstructuration et de l'accaparement de l'action dès les accessoires, setFilter()
ne serait pas l'envoi de l'action (parce que vous seriez en invoquant l'importés d'action directement, par opposition à l'invocation de la connectés action par le biais d'accessoires via props.setFilter()
qui react-redux
automatiquement à l'ordre du jour pour vous).
Par le nettoyage de la variable ombrage, vous et/ou votre IDE sont plus susceptibles de revenir sur l'erreur.
Comment?
L'ajout d'un eslintConfig
de la propriété de votre package.json
le fichier est une façon de le faire.
"eslintConfig": {
"rules": {
"no-shadow": "off",
}
}
2. Réaffecter la variable lors du passage en connect()
.
Pourquoi?
Vous bénéficier de la sécurité de l'ombre à la règle, et, si vous choisissez d'adhérer à une convention de nommage, il est très explicite.
Pourquoi Pas?
Il introduit standard.
Si vous n'avez pas utiliser une convention de nommage, vous avez maintenant de venir avec des noms de remplacement qu'ils ont encore un sens) pour chaque action. Et les chances sont que les mêmes actions seront nommés différemment à travers des composants, ce qui rend plus difficile de se familiariser avec les actions elles-mêmes.
Si vous devez utiliser une convention de nommage des noms longs et répétitifs.
Comment?
Sans convention de nommage:
import { setFilter } from '../actions/filter';
function FilterButton({ filter }) {
return (
<button onClick={filter}>Click</button>
);
}
export default connect(null, { filter: setFilter })(FilterButton);
Avec la convention de nommage:
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. Ne pas se déstructurent les actions hors des accessoires.
Pourquoi?
En utilisant explicitement la méthode hors des accessoires de l'objet, vous n'avez pas besoin de s'inquiéter à propos de l'ombrage pour commencer.
Pourquoi Pas?
Ajoutant toutes vos actions avec props
/this.props
est répétitif (et incohérent si vous êtes à la déstructuration de tous vos autres non-action des accessoires).
Comment?
import { setFilter } from '../actions/filter';
function FilterButton(props) {
return (
<button onClick={props.setFilter}>Click</button>
);
}
export default connect(null, { setFilter })(FilterButton);
4. Importer l'ensemble du module.
Pourquoi?
C'est concis.
Pourquoi Pas?
D'autres développeurs (ou votre soi futur) peuvent avoir de la difficulté à comprendre ce qu'il se passe. Et selon le guide de style, vous êtes, vous pourriez être de casser la non-générique-les importations de la règle.
Comment?
Si vous êtes simplement de passage dans l'action des créateurs à partir d'un module:
import * as actions from '../actions/filter';
function FilterButton({ setFilter }) {
return (
<button onClick={setFilter}>Click</button>
);
}
export default connect(null, actions)(FilterButton);
Si vous êtes de passage dans plusieurs modules, l'utilisation de l'objet de déstructuration avec le reste de la syntaxe:
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);
Et puisque vous avez mentionné une préférence pour l'ES6 s concise de la syntaxe dans les commentaires, pourrait tout aussi bien jeter dans la flèche de la fonction avec un rendement implicite:
import * as actions from '../actions/filter';
const FilterButton = ({ setFilter }) => <button onClick={setFilter}>Click</button>;
export default connect(null, actions)(FilterButton);
0 votes
Vous pouvez renommer
setFilter
(FilterButton({ setFilter })
aFilterButton({ setFilter })
). C'est logique (en quelque sorte) parce que les fonctions qui sont dansFilterButton
Les accessoires de l'artiste sont en fait l'originalsetFilter
avec ledispatch
qui lui est liée.0 votes
Avant et après le changement de nom, les données sont identiques.
0 votes
Je voulais dire renommer uniquement dans
function FilterButton({ setFilter }) {
y<button onClick={setFilter}>Click</button>
. Pouvez-vous mettre à jour votre question avec le code modifié ?0 votes
Je ne peux pas le renommer dans
function FilterButton({ setFilter })
car il doit correspondre au nom de l'accessoire qui estsetFilter
en fait.3 votes
Ne peut-on pas simplement réaffecter les données en les transmettant à la fonction sur la ligne d'exportation ? Ainsi, il est possible de réaffecter le nom de la fonction à la ligne d'exportation,
export default connect(null, {filter: setFilter})(FilterButton);
et ensuite, au-dessus de cela, justefunction FilterButton ({filter}) {
(ou tout autre nom de variable que vous préférez). De cette façon, vous ne faites pas d'ombre à la variable dans la portée supérieure, ce qui est clair lorsque l'on regarde le code.0 votes
Dans ce cas, je perdrais la syntaxe concise de l'ES6
0 votes
Ce serait génial s'il y avait un plugin eslint forké qui désactivait le no-shadow juste pour ce cas d'utilisation particulier. J'aime bien le principe du no-shadow, mais ce code est bien plus joli que les autres.
0 votes
Un problème similaire (avec des solutions similaires) se pose pour
mapStateToProps
lors de l'utilisation decreateStructuredSelector
de resélectionner avec des noms identiques pour les accessoires et les sélecteurs. Exemple :connect(createStructuredSelector({ filter }), null)(Component)