Setzen Sie den Status mit Redux-Toolkit auf den Anfangszustand zurück

Lesezeit: 5 Minuten

Zireaels Benutzeravatar
Zireael

Ich muss den aktuellen Zustand auf den Ausgangszustand zurücksetzen. Aber alle meine Versuche waren erfolglos. Wie kann ich das mit dem Redux-Toolkit machen?

const showOnReviewSlice = createSlice({
  name: 'showOnReview',
  initialState: {
    returned: [],
  },
  reducers: {
    reset(state) {
      //here I need to reset state of current slice
    },
  },
});

  • Für zukünftige Leser: Mit redux-toolkit den kompletten Zustand auf den Anfangszustand zurücksetzen.

    – Ajeet Shah

    23. Mai 2020 um 20:04

  • @AjeetShah perfekte Lösung, danke fürs Teilen.

    – Guilherme Samuel

    2. März 2021 um 14:05 Uhr

Benutzeravatar von i9or
i9or

Etwas wie das:

const intialState = {
  returned: []
}

const showOnReviewSlice = createSlice({
    name: 'showOnReview',
    initialState,
    reducers: {
        reset: () => initialState
    }
});

  • ja es funktioniert. Richtig ist auch reset() {return initialState} oder reset:() => initialState

    – Zireael

    25. Dezember 2019 um 9:06 Uhr


  • Ich dachte, einfach einstellen state = initialState würde ausreichen, da wir in anderen Beispielen nur mutieren müssen state. Leider erforderte das Zurücksetzen des Staates einen anderen Ansatz :/

    – Dorklord

    9. Juni 2020 um 8:38

  • Ich muss zugeben, dass sogar das Redux-Toolkit großartig ist, es ist ein bisschen Unveränderlichkeit und dunkle Magie 😀 Übrigens return { ...initialState } funktioniert auch…

    – Baterka

    10. Dezember 2020 um 23:36 Uhr


  • @Dorklord state = initialState funktioniert nicht, weil Sie die Referenz ändern und Redux Toolkit das nicht wissen kann, da es die alte Referenz beibehält. Du musst entweder das Original mutieren state ODER zurückkehren neues Objekt. @nachtigall @fullStackChris

    – Qwertz

    5. Mai 2022 um 23:35 Uhr


  • @Baterka return { ...initialState } ist unnötig und vielleicht kommen Sie vom traditionellen Redux, wo Mutation verboten war. Hier return initialState Und return { ...initialState } sind gleichwertig.

    – Qwertz

    5. Mai 2022 um 23:37 Uhr

Benutzeravatar von Worsttestes
schlimmstes

Das hat bei mir funktioniert (Mitte/Ende 2020). Formatiert mit Ihrem Codekontext als Beispiel.

const initialState = {
  returned: [],
};

const showOnReviewSlice = createSlice({
  name: 'showOnReview',
  initialState,
  reducers: {
    reset: () => initialState,
  },
});

  • Nichts davon hat bei mir funktioniert 🙁 Es heißt nur, dass „initialState“ nicht definiert ist. Ich habe vergessen, den „initialstate“ zu definieren

    – Rakesh Kumar

    26. Dezember 2020 um 5:56


  • Dies ist die besser gestaltete Antwort.

    – Ansjovis86

    23. Mai 2021 um 0:04

Bei der Verwendung mehrerer Slices können alle Slices mit in ihren Ausgangszustand zurückgesetzt werden extraReducers.

Erstellen Sie zunächst eine Aktion, die von allen Slices verwendet werden kann:

export const revertAll = createAction('REVERT_ALL')

Fügen Sie in jede Scheibe eine hinzu initialStateund ein extraReducers Reduzierstück mit dem revertAll Aktion:

const initialState = {};
export const someSlice = createSlice({
  name: 'something',
  initialState,
  extraReducers: (builder) => builder.addCase(revertAll, () => initialState),
  reducers: {}
});

Der Shop kann wie gewohnt erstellt werden:

export const store = configureStore({
  reducer: {
    someReducer: someSlice.reducer,
  }
})

Und in Ihrem Reaktionscode können Sie das aufrufen revertAll Aktion mit dem useDispatch Haken:

export function SomeComponent() {
  const dispatch = useDispatch();

  return <span onClick={() => dispatch(revertAll())}>Reset</span>
}

  • Wow! Das ist es, wonach ich gesucht habe!

    – evisotskiy

    28. September 2022 um 10:29 Uhr

  • Dieser Code funktioniert, obwohl wir in allen Reduzierern repetitiven Code hinzufügen müssen. Ich wünschte, es gäbe einen eleganteren Weg, dies ohne Duplizierung des Codes zu erreichen

    – Dattatreya Kugve

    30. September 2022 um 5:37 Uhr

  • Danke! Vorschläge zur Entfernung der Wiederholung sind willkommen

    – Blut

    10. Okt. 2022 um 14:13 Uhr

  • Nur so hat es im Jahr 2023 funktioniert. Danke.

    – Ujith Nimantha

    30. Januar um 7:48 Uhr


  • Danke @Blee. Ich benötige bitte eine Erläuterung, wie der Versand erfolgen soll. Da haben wir den Respekt All on all Slices. Wie kombiniere ich alles vor dem Versand?

    – SwiftDev

    4. März um 17:19 Uhr

Ersetzen state mit initialState direkt getan nicht Arbeit für mich (Mitte 2020). Letztendlich habe ich es geschafft, jede Eigenschaft zu kopieren Object.assign(). Das hat funktioniert:

const showOnReviewSlice = createSlice({
    name: 'showOnReview',
    initialState: {
        returned: []
    },
    reducers: {
        reset(state) {
            Object.assign(state, initialState)
        }
    }
});

Gilberts Benutzeravatar
Gilbert

Wir machen es so, Leute.

Angenommen, Sie möchten beim Abmelden alle Daten löschen.

In Ihrer Datei „store.tsx“:

import { AnyAction, combineReducers, configureStore } from '@reduxjs/toolkit';
import authReducer from './slices/authSlice'
import messageReducer from './slices/messageSlice'



const appReducer = combineReducers({
  auth: authReducer,
  message: messageReducer,
});

const reducerProxy = (state: any, action: AnyAction) => {
  if(action.type === 'logout/LOGOUT') {
    return appReducer(undefined, action);
  }
  return appReducer(state, action);
}

export const store = configureStore({
  reducer: reducerProxy,
});

Dann erstellen Sie einen Thunk wie diesen:

export const logout = createAsyncThunk(
    "auth/logout",
    async function (_payload, thunkAPI) {
        thunkAPI.dispatch({ type: 'logout/LOGOUT' });
        console.log('logged out')
    }
);

Nachdem Sie den Abmelde-Thunk gesendet haben, können Sie auch den Browser aktualisieren, damit er den Benutzer automatisch zur Anmeldeseite umleitet.

function MyReactComponent() {
   const dispatch = useDispatch()

   function myLogoutOnClickHandler() {
      dispatch(logout())
      window.location = window.location;
   }
   ...

}

In meinem Fall wird, wie in der vorherigen Antwort, Mitte 2021 nur der Anfangszustand festgelegt ARBEITE NICHT, auch wenn Sie den Toolkit-Adapter wie folgt verwenden:

reducers: {
        // Other reducers
         state = tasksAdapter.getInitialState({
                status: 'idle',
                error: null,
                current: null
            })
        }
    },


stattdessen sollten Sie verwenden Object.assign()vermute, dass es mit dem internen Verhalten der Immer-Bibliothek zusammenhängt

Benutzeravatar von jjswift
jjswift

Versuche dies. In meinem Fall wollte ich zurückkehren alle Slices auf initialState wenn eine bestimmte Aktion ausgelöst wird.

  • Lassen Sie uns zunächst eine Aktion erstellen:
import { createAction } from '@reduxjs/toolkit';

export const resetPanelsAction = createAction('resetPanelsData');
  • Beim Erstellen unseres Shops speichern wir eine Kopie des initialState in der Middleware:
import { Middleware } from '@reduxjs/toolkit';

export const resetDataMiddleware: Middleware =
    ({ getState }) =>
    (next) => {
        // "Caching" our initial app state
        const initialAppState = getState();

        return (action) => {
            // Let's add the condition that if the action is of 
            // type resetData, then add our cached state to its payload
            if (action.type === 'resetData') {
                const actionWithInitialAppState = {
                    ...action,
                    payload: initialAppState,
                };

                return next(actionWithInitialAppState);
            }

            return next(action);
        };
    };
  • Fast fertig! Jetzt ändern wir unseren Root-Reduzierer ein wenig, indem wir einen Wrapper hinzufügen, der den Aktionstyp überprüft und zurückgibt, wenn er gleich „resetData“ ist combinedReducers mit unserer Ausgangszustanddie in der Nutzlast enthalten sein wird.
import { AnyAction } from 'redux';
import { combineReducers } from '@reduxjs/toolkit';

export const combinedReducers = combineReducers({
    /** Your reducers */
});

export const rootReducer = (
    state: ReturnType<typeof combinedReducers> | undefined,
    action: AnyAction,
) => {
    if (action.type === 'resetPanelsData') {
        return combinedReducers(action.payload, action);
    }

    return combinedReducers(state, action);
};

1453430cookie-checkSetzen Sie den Status mit Redux-Toolkit auf den Anfangszustand zurück

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy