wie sollte ich bauen onClick Aktion in meinem reagieren Komponente + Redux
Habe ich durch viele tutorials und Fragen auf Stack, aber ich kann nicht finden eine Lösung. Ich bin nur zu lernen, zu Reagieren/redux, zu bauen versuchen OnClick-Aktion. Ich habe den folgenden Fehler "Maximum call stack size exceeded error"
. Ich habe das, weil ich bin rendering eine Funktion, die ändert sich mein Zustand unendlich. Ich versuche mich viel mit meinen <button onClick={DisplayTable(click)}>cool</button>
anders, aber nichts scheint zu funktionieren.
Ich weiß auch, dass meine Aktion und ich denke, meine Reduzierstücke, arbeitet korrekt, da wenn ich die Versendung meiner Aktion durch die Konsole : $r.store.dispatch({type: 'SET_TABLE_DATA'});
mein Zustand ist ordnungsgemäß aktualisiert.
Irgendwelche Tipps ?
hier ist meine Aktion :
export const setTableFilter = (click) => {
return {
type: 'SET_TABLE_DATA',
click : click,
};
};
hier ist meine reducer :
const tableFilter = (state = 0, action) => {
if(action.type === 'SET_TABLE_DATA') {
return state + 1;
}
return state;
}
und hier ist meine Komponente :
const DisplayTable = (click) => {
return (
<div>
<button onClick={DisplayTable(click)}>cool</button>
</div> )
}
function mapStateToProps(state) {
return {
click: state.tableFilter.click
};
};
const mapDispachToProps = (dispatch) => {
return {
DisplayTable: (click) => {dispatch (setTableFilter(click));
},
};
};
const AppTable = connect(mapStateToProps, mapDispachToProps)(DisplayTable);
export default AppTable;
Ich weiß auch, dass ich, sollte ich meine reducer in einer Weise, dass mein Status sollte aktualisiert werden, ohne mutation, aber ich werde halten Sie diese für später auf ! 🙂
Dank.
- Da erwähnten Sie, dass Sie neu sind, die reagieren, Sie finden diese Website nützlich
- Ich habe dies getan, tutorial, vielen Dank. Es mir wirklich helfen, um die Vorstellung von dem, was einen Druckminderer, eine Aktion, und alle... aber wenn ich versuche das Ding zu bauen auf meinem eigenen funktioniert es nicht...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort nicht wirklich erklären warum Ihr code nicht funktioniert, so dass ich dachte, ich würde erweitern auf dass.
Dein problem ist, dass Sie die überschreitung der Funktion " call-stack, besser bekannt als unendliche Rekursion. Der Grund, warum das passiert ist, weil Sie nicht übergeben Sie eine Funktion, um die
onClick
- Attribut der Schaltfläche, sondern aufrufen eine Funktion und übergeben der Rückgabewert statt. Also Folgendes Szenario ist passiert:render()
heißtDisplayTable
Funktion aufgerufen, die löst ein update für den storerender()
wieder aufgerufenDisplayTable
wird wieder aufgerufen...und so weiter.
Was Sie wollen zu tun, sondern ist pass die Funktion der Schaltfläche
onClick
Attribut. Also die Komponente sollte so Aussehen:In das obige code-snippet, ich entfernt Ihre
click
prop, weil es nicht so Aussehen, wie Sie es verwenden (und erhalten den code, den Sie geschrieben, in den OP).Cannot convert undefined or null to object
. Ich denke, das ist, weil meine Requisiten wird ein leeres Objekt ?mapStateToProps
zu definierenclick
prop, existiert nicht an Ihrem Zustand, und du bist immer noch die eineclick
parameter in IhrerDisplayTable
Funktion, wenn Sie nicht den Aufruf mit einem argument.Ein paar Tipps, nicht eine komplette Lösung, denn das würde nicht helfen, lernen Sie:
Ihre Aktion und reducer sind gut. Übergeben Sie das klicken Sie auf Eigenschaft, die nicht in den Druckminderer. Vielleicht werden Sie es auch in der Zukunft, aber für jetzt ist es nutzlos.
Einen Reagieren Komponente Funktion nimmt Requisiten als argument:
mapDispatchToProps
ist in der Regel nicht erforderlich. Benutzen Sie einfach Objekte statt:Können Sie dann den Zugriff auf die Funktion von Requisiten:
Beachten Sie:
onClick
nimmt eine Funktion!Auch der Zustand definiert, in dem reducer hat keine Eigenschaft namens klicken Sie auf, stattdessen ist es eine Nummer (siehe korrigieren mapStateToProps Funktion oben)
connect
kann entweder eine Funktion, die ein Objekt zurückgibt, oder einfach nur ein Objekt, mit jeder Taste angenommen, dass eine Aktion creator. Wenn Sie ein Objekt verwenden, wird es eingehüllt in eine dispatch-Aufruf sowieso. Entweder die Methode ist völlig in Ordnung.connect
war auch nicht nötig, da könnte man stattdessen ein Objekt übergeben, das die Verweise Ihre Aktion Schöpfer. Du bist also noch vorbei Requisiten, um Ihre Komponente, kann der Versand Aktionen, um das Geschäft, Sie tun es anders. Wie ich schon sagte, es gibt wirklich keinen Unterschied zwischen den beiden. Wenn Sie mehr Komfort mit dermapDispatchToProps
- Funktion, gehen Sie nach rechts weiter.<button onClick={() => props.setTableFilter(click)}>cool</button>