All quizzesHard
Global State
Preview — 3 of 10 questions
What does createSlice generate?
javascript
import { createSlice } from "@reduxjs/toolkit";
const counterSlice = createSlice({
name: "counter",
initialState: { value: 0, status: "idle" },
reducers: {
increment: (state) => { state.value += 1; }, // Immer — looks like mutation!
decrement: (state) => { state.value -= 1; },
incrementByAmount: (state, action) => { state.value += action.payload; },
},
});
export const { increment, decrement, incrementByAmount } = counterSlice.actions;
export default counterSlice.reducer;Astate.value += 1 directly mutates state — this is a bug
BYou must manually call Object.freeze() on state in RTK reducers
CcreateSlice is a UI component factory, not a state management tool
DcreateSlice uses Immer internally — "mutations" inside reducers are intercepted and produce a new immutable state; it also auto-generates action creators and action type strings
How does RTK Query differ from manual data fetching?
javascript
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
export const usersApi = createApi({
reducerPath: "usersApi",
baseQuery: fetchBaseQuery({ baseUrl: "/api" }),
endpoints: (builder) => ({
getUsers: builder.query({ query: () => "/users" }),
getUserById: builder.query({ query: (id) => `/users/${id}` }),
updateUser: builder.mutation({ query: (user) => ({ url: `/users/${user.id}`, method: "PUT", body: user }) }),
}),
});
export const { useGetUsersQuery, useGetUserByIdQuery, useUpdateUserMutation } = usersApi;ARTK Query is just fetch with extra steps
BRTK Query only works with REST APIs, not GraphQL
CRTK Query requires manual cache invalidation on every mutation
DRTK Query auto-generates hooks, handles caching/deduplication/invalidation, normalizes data fetching patterns, and integrates with Redux DevTools — no manual loading/error state management
What does createSelector optimize?
javascript
import { createSelector } from "reselect";
const selectTodos = state => state.todos;
const selectFilter = state => state.filter;
const selectFilteredTodos = createSelector(
[selectTodos, selectFilter],
(todos, filter) => {
console.log("Computing filtered todos"); // expensive computation
return todos.filter(t => t.status === filter);
}
);AcreateSelector runs the computation on every store change
BcreateSelector is only compatible with Redux, not Zustand
CcreateSelector memoizes: the computation only runs when todos or filter change; if neither changed (same references), returns the cached result
DcreateSelector prevents the component from re-rendering
Sign up free to play
Answer all 10 questions (7 more), see explanations for every answer, and track your score.