Hier gibt es vier Möglichkeiten:
1. Deaktivieren Sie die Regel.
Warum?
Dies ist der einfachste Weg, um den ESLint-Fehler zu vermeiden.
Warum nicht?
Die No-Shadow-Regel hilft, einen sehr häufigen Fehler bei der Verwendung zu vermeiden react-redux
. Das heißt, der Versuch, die rohe, nicht verbundene Aktion aufzurufen (die nicht automatisch ausgelöst wird).
Mit anderen Worten, wenn Sie keine Destrukturierung verwenden und die Aktion von Requisiten abrufen setFilter()
würden , würde die Aktion nicht ausgelöst (da Sie die importierte Aktion direkt aufrufen würden, anstatt die verbundene Aktion über Requisiten über aufzurufen props.setFilter()
, die react-redux
automatisch für Sie versendet ).
Wenn Sie die variable Schattierung bereinigen , werden Sie und / oder Ihre IDE den Fehler mit größerer Wahrscheinlichkeit erkennen.
Wie?
Das Hinzufügen einer eslintConfig
Eigenschaft zu Ihrer package.json
Datei ist eine Möglichkeit, dies zu tun .
"eslintConfig": {
"rules": {
"no-shadow": "off",
}
}
2. Weisen Sie die Variable beim Übergeben neu zu connect()
.
Warum?
Sie profitieren von der Sicherheit der No-Shadow-Regel. Wenn Sie sich für die Einhaltung einer Namenskonvention entscheiden, ist diese sehr explizit.
Warum nicht?
Es führt Boilerplate ein.
Wenn Sie keine Namenskonvention verwenden, müssen Sie jetzt für jede Aktion alternative Namen (die immer noch sinnvoll sind) erstellen. Und es besteht die Möglichkeit, dass dieselben Aktionen in verschiedenen Komponenten unterschiedlich benannt werden, was es schwieriger macht, sich mit den Aktionen selbst vertraut zu machen.
Wenn Sie eine Namenskonvention verwenden, werden Namen lang und wiederholen sich.
Wie?
Ohne Namenskonvention:
import { setFilter } from '../actions/filter';
function FilterButton({ filter }) {
return (
<button onClick={filter}>Click</button>
);
}
export default connect(null, { filter: setFilter })(FilterButton);
Mit Namenskonvention:
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. Zerstören Sie keine Aktionen von Requisiten.
Warum?
Wenn Sie die Methode off des Requisitenobjekts explizit verwenden, müssen Sie sich zunächst nicht um das Abschatten kümmern.
Warum nicht?
Das Vorbereiten aller Ihrer Aktionen mit props
/ this.props
wiederholt sich (und ist inkonsistent, wenn Sie alle anderen Requisiten ohne Aktion zerstören).
Wie?
import { setFilter } from '../actions/filter';
function FilterButton(props) {
return (
<button onClick={props.setFilter}>Click</button>
);
}
export default connect(null, { setFilter })(FilterButton);
4. Importieren Sie das gesamte Modul.
Warum?
Es ist prägnant.
Warum nicht?
Andere Entwickler (oder Ihr zukünftiges Selbst) haben möglicherweise Probleme zu verstehen, was los ist. Abhängig von dem Styleguide, dem Sie folgen, verstoßen Sie möglicherweise gegen die No-Wildcard-Import-Regel .
Wie?
Wenn Sie einfach Aktionsersteller aus einem Modul übergeben:
import * as actions from '../actions/filter';
function FilterButton({ setFilter }) {
return (
<button onClick={setFilter}>Click</button>
);
}
export default connect(null, actions)(FilterButton);
Wenn Sie mehrere Module übergeben, verwenden Sie die Objektdestrukturierung mit Restsyntax :
import * as filterActions from '../actions/filter';
import * as otherActions from '../actions/other';
function FilterButton({ setFilter, clearFilter, setOther, clearOther }) {
return (
<button onClick={setFilter}>Click</button>
);
}
export default connect(null, { ...filterActions, ...otherActions })(FilterButton);
Und da Sie in den Kommentaren eine Präferenz für die prägnante Syntax von ES6 erwähnt haben, können Sie auch die Pfeilfunktion mit einer impliziten Rückgabe einfügen:
import * as actions from '../actions/filter';
const FilterButton = ({ setFilter }) => <button onClick={setFilter}>Click</button>;
export default connect(null, actions)(FilterButton);
setFilter
(FilterButton({ setFilter })
inFilterButton({ setFilter })
) umbenennen . Es ist sinnvoll, weil die Funktionen inFilterButton
den Requisiten tatsächlich das Original sind,setFilter
an das diedispatch
Funktion gebunden ist.