{"id":1363,"date":"2025-02-08T00:00:00","date_gmt":"2025-02-07T23:00:00","guid":{"rendered":"https:\/\/demo.sidekick.be\/itenium\/reduxjs-toolkit-createslice\/"},"modified":"2025-11-28T13:31:41","modified_gmt":"2025-11-28T12:31:41","slug":"reduxjs-toolkit-createslice","status":"publish","type":"post","link":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/","title":{"rendered":"ReduxJS\/Toolkit: createSlice and configureStore"},"content":{"rendered":"<h1 id=\"createslice\">createSlice<\/h1>\n<pre><code class=\"language-ts\">import { createSlice, PayloadAction } from \"@reduxjs\/toolkit\";\n\nexport const todoSlice = createSlice({\n  \/\/ Action prefix: todos\/addTodo, todos\/removeTodo etc\n  name: \"todos\",\n  initialState: [] as Todo[],\n  reducers: {\n    \/\/ A default reducer:\n    \/\/ The actions are exported from the reducers (below)\n    removeTodo: (state, action: PayloadAction&lt;number&gt;) =&gt; {\n      return state.filter(todo =&gt; todo.id !== action.payload);\n    },\n\n    \/\/ A prepared reducer\n    \/\/ When you need to modify the payload before handling\n    addTodo: {\n      reducer: (state, action: PayloadAction&lt;Todo&gt;) =&gt; {\n        state.push(action.payload);\n      },\n      prepare: (todo: Partial&lt;Todo&gt;) =&gt; {\n        \/\/ The addTodo action takes a Partial&lt;Todo&gt;\n        \/\/ But the reducer handles a complete Todo.\n        const payload = {\n          text: 'Default Text',\n          ...todo,\n        };\n        return { payload };\n      }\n    },\n  },\n\n\n  \/\/ We'll get into more detail in Part 4: createAsyncThunk\n  extraReducers: builder =&gt; {\n    \/\/ This is where we would handle the pending, fulfilled and rejected actions\n    \/\/ from a createAsyncThunk\n\n    \/\/ Handling an action from another slice is also a use case for extraReducers\n    builder.addCase(addCustomer, (state, action: PayloadAction&lt;{name: string}&gt;) =&gt; {\n      state.push({text: `Onboard new customer ${action.payload.name}`});\n    });\n  },\n\n\n  \/\/ We'll get into more detail in Part 6: createSelector\n  selectors: {\n    selectTodo: (state, id: number): Todo | undefined =&gt; {\n      return state.find(x =&gt; x.id === id);\n    },\n  }\n});\n\nexport const { addTodo, removeTodo } = todoSlice.actions;\nexport const { selectTodo } = todoSlice.selectors;\n<\/code><\/pre>\n<h2 id=\"dispatching-an-action\">Dispatching an action<\/h2>\n<p>See <a href=\"\/blog\/javascript\/reduxjs-toolkit-typescript\/\">Part 5: TypeScript<\/a> for how to create the <code>useAppDispatch<\/code> hook.<\/p>\n<pre><code class=\"language-ts\">import { addTodo } from \".\/todoSlice\";\n\nconst TodoAdd = () =&gt; {\n  const dispatch = useAppDispatch();\n  const [todo, setTodo] = useState&lt;Todo&gt;({});\n  return &lt;button onClick={() =&gt; dispatch(addTodo(todo))}&gt;Add&lt;\/button&gt;\n}\n<\/code><\/pre>\n<h1 id=\"configurestore\">configureStore<\/h1>\n<p>Once you\u2019ve defined some slices, time to combine them into your store.<\/p>\n<pre><code class=\"language-ts\">\/\/ Create the store\nimport { configureStore } from \"@reduxjs\/toolkit\";\n\nconst store = configureStore({\n  reducer: {\n    todos: todoSlice.reducer,\n    user: userSlice.reducer,\n  },\n\n  \/\/ DevTools extension is added by default\n  \/\/ Here we disable it for production:\n  devTools: process.env.NODE_ENV !== 'production',\n\n  \/\/ Optionally hydrate the store from somewhere:\n  preloadedState: localStorage.getItem('redux'),\n});\n\n\n\/\/ Bind it to our main &lt;App \/&gt; component\nimport { createRoot } from \"react-dom\/client\";\nimport { Provider } from \"react-redux\";\n\nconst root = createRoot(\n  document.getElementById('root')\n);\nroot.render(\n  &lt;Provider store={store}&gt;\n    &lt;App \/&gt;\n  &lt;\/Provider&gt;\n);\n<\/code><\/pre>\n<p>This will create a store with \u201cRootState\u201d:<\/p>\n<pre><code class=\"language-ts\">type RootState = {\n  todos: ReturnType&lt;typeof todoSlice.getInitialState&gt;;\n  user: ReturnType&lt;typeof userSlice.getInitialState&gt;;\n}\n<\/code><\/pre>\n<p>It really doesn\u2019t get any easier than that. Without overriding anything, this will also setup the must have <a href=\"https:\/\/github.com\/reduxjs\/redux-devtools\">Redux DevTools Extension<\/a> (\u2b50 13k).<\/p>\n<p>This can be overriden\/configured by passing <code>devTools: false | DevToolsOptions<\/code> to <code>configureStore<\/code>.<\/p>\n<h2 id=\"middleware\">Middleware<\/h2>\n<p>The <a href=\"https:\/\/github.com\/reduxjs\/redux-thunk\">redux-thunk<\/a> middleware is added by default, since you are going to be doing some http calls \ud83d\ude0a<\/p>\n<p>During development builds, the following middleware is also <a href=\"https:\/\/redux-toolkit.js.org\/api\/getDefaultMiddleware\">automatically added<\/a><\/p>\n<ul>\n<li><a href=\"https:\/\/redux-toolkit.js.org\/api\/immutabilityMiddleware\">ImmutableStateInvariantMiddleware<\/a>: detects any mutations to state<\/li>\n<li><a href=\"https:\/\/redux-toolkit.js.org\/api\/serializabilityMiddleware\">SerializableStateInvariantMiddleware<\/a>: detects any non-serializable values in state or actions<\/li>\n<li><a href=\"https:\/\/redux-toolkit.js.org\/api\/actionCreatorMiddleware\">ActionCreatorInvariantMiddleware<\/a>: detects if an action creator has been dispatched (an action creator should\u2019ve been called before being dispatched)<\/li>\n<\/ul>\n<pre><code class=\"language-ts\">\/\/ Extend the default middleware\nconfigureStore({\n  middleware: getDefaultMiddleware =&gt; getDefaultMiddleware()\n    .concat(loggingMiddleware, persistMiddleware)\n    .prepend(listenerMiddleware.middleware)\n});\n\n\/\/ Explicitly configure your own middleware\nconfigureStore({\n  middleware: () =&gt; new Tuple(myMiddleware, logger),\n})\n\n\/\/ Enable\/Disable or configure the default middleware\nconfigureStore({\n  middleware: getDefaultMiddleware =&gt; getDefaultMiddleware({\n    \/\/ Always added (unless explicitly passing false!)\n    thunk: boolean | {\n      extraArgument: any\n    },\n\n    \/\/ Only added during development:\n    immutableCheck: boolean | {\n      isImmutable: not object, null or undefined,\n      ignoredPaths: undefined,\n      warnAfter: 32ms,\n    },\n    serializableCheck: boolean | {\n      isSerializable: (value: any) =&gt; boolean,\n      ignoredActions: string[],\n      ignoreState: boolean,\n      ignoreActions: boolean,\n      ...\n    },\n    actionCreatorCheck: boolean | {\n      isActionCreator: (action: unknown) =&gt; action is Function &amp; { type?: unknown }\n    }\n  })\n});\n<\/code><\/pre>\n<h3 id=\"custom-middleware\">Custom Middleware<\/h3>\n<p>Some ready made redux middlewares:<\/p>\n<p><a href=\"https:\/\/github.com\/reduxjs\/redux-thunk\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/reduxjs\/redux-thunk.svg?style=social&amp;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/reduxjs\/redux-thunk\">reduxjs\/redux-thunk<\/a>: Thunk middleware for Redux (included) <a href=\"https:\/\/github.com\/rt2zz\/redux-persist\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/rt2zz\/redux-persist.svg?style=social&amp;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/rt2zz\/redux-persist\">rt2zz\/redux-persist<\/a>: Persist and rehydrate a redux store <a href=\"https:\/\/github.com\/redux-observable\/redux-observable\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/redux-observable\/redux-observable.svg?style=social&amp;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/redux-observable\/redux-observable\">redux-observable\/redux-observable<\/a>: RxJS middleware for action side effects using \u2018Epics\u2019 <a href=\"https:\/\/github.com\/LogRocket\/redux-logger\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/LogRocket\/redux-logger.svg?style=social&amp;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/LogRocket\/redux-logger\">LogRocket\/redux-logger<\/a>: Logger for Redux <a href=\"https:\/\/github.com\/omnidan\/redux-undo\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/omnidan\/redux-undo.svg?style=social&amp;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/omnidan\/redux-undo\">omnidan\/redux-undo<\/a>: \u267b\ufe0f higher order reducer to add undo\/redo <a href=\"https:\/\/github.com\/redux-utilities\/redux-promise\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/redux-utilities\/redux-promise.svg?style=social&amp;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/redux-utilities\/redux-promise\">redux-utilities\/redux-promise<\/a>: Dispatch promises <a href=\"https:\/\/github.com\/agraboso\/redux-api-middleware\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/agraboso\/redux-api-middleware.svg?style=social&amp;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/agraboso\/redux-api-middleware\">agraboso\/redux-api-middleware<\/a>: Redux middleware for calling an API.<\/p>\n<p>Or roll your own:<\/p>\n<pre><code class=\"language-ts\">export const loggingMiddleware = ({dispatch, getState}) =&gt; next =&gt; action =&gt; {\n  console.log('Dispatching', action);\n  const result = next(action);\n  console.log('State after dispatch', getState());\n  return result;\n}\n\n\/\/ redux-promise is basically a simplified version of redux-thunk\nexport const resolvePromiseMiddleware = ({dispatch, getState}) =&gt; next =&gt; action =&gt; {\n  if (action.payload instanceof Promise) {\n    return action.payload.then(result =&gt; dispatch({...action, payload: result}));\n  }\n  return next(action);\n}\n<\/code><\/pre>\n<p>When writing middleware that is only going to do something for specific actions, check out the <a href=\"https:\/\/redux-toolkit.js.org\/api\/matching-utilities\">matching utilities<\/a> provided by the toolkit.<\/p>\n<p>If you need to modify middleware after store creation, you can do so with <a href=\"https:\/\/redux-toolkit.js.org\/api\/createDynamicMiddleware\">createDynamicMiddleware<\/a>.<\/p>\n<p><a href=\"https:\/\/redux-toolkit.js.org\/api\/createListenerMiddleware\">Listener middleware<\/a> is what ReduxJS\/Toolkit currently recommends using instead of using something like <a href=\"https:\/\/github.com\/redux-saga\/redux-saga\"><code>redux-saga<\/code><\/a> or <code>redux-observable<\/code>.<\/p>\n<h2 id=\"enhancers\">Enhancers<\/h2>\n<p>Middleware is added to the store by the <a href=\"https:\/\/redux.js.org\/api\/applymiddleware\"><code>applyMiddleware<\/code><\/a> enhancer. Enhancers are the most powerful extension method available in Redux and it\u2019s unlikely you\u2019re going to be writing any yourself.<\/p>\n<pre><code class=\"language-ts\">const store = configureStore({\n  enhancers: getDefaultEnhancers =&gt; getDefaultEnhancers().concat(...),\n})\n<\/code><\/pre>\n<p>The by default added enhancers are DevTools and <a href=\"https:\/\/redux-toolkit.js.org\/api\/autoBatchEnhancer\">autoBatchEnhancer<\/a>.<\/p>\n<h3 id=\"middleware-vs-enhancers\">Middleware vs Enhancers<\/h3>\n<table class=\"table-code\">\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>Middleware<\/th>\n<th>Store Enhancer<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Intercepts actions?<\/strong><\/td>\n<td>\u2705 Yes<\/td>\n<td>\u274c No<\/td>\n<\/tr>\n<tr>\n<td><strong>Modifies store behavior?<\/strong><\/td>\n<td>\u274c No<\/td>\n<td>\u2705 Yes<\/td>\n<\/tr>\n<tr>\n<td><strong>Used for side effects?<\/strong><\/td>\n<td>\u2705 Yes<\/td>\n<td>\u274c No<\/td>\n<\/tr>\n<tr>\n<td><strong>Applied via?<\/strong><\/td>\n<td><code>middleware<\/code><\/td>\n<td><code>enhancers<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>Example<\/strong><\/td>\n<td>Action logger<\/td>\n<td>DevTools<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h1>Also in this series<\/h1>\n<ul>\n<li>Part 1: <a href=\"\/javascript\/reduxjs-toolkit\/\">ReduxJS\/Toolkit<\/a><\/li>\n<li>Part 2: <a href=\"\/javascript\/reduxjs-toolkit-immer\/\">ReduxJS\/Toolkit: Immer<\/a><\/li>\n<li>This Part: ReduxJS\/Toolkit: createSlice and configureStore<\/li>\n<li>Part 4: <a href=\"\/javascript\/reduxjs-toolkit-createasyncthunk\/\">ReduxJS\/Toolkit: createAsyncThunk<\/a><\/li>\n<li>Part 5: <a href=\"\/javascript\/reduxjs-toolkit-typescript\/\">ReduxJS\/Toolkit: TypeScript<\/a><\/li>\n<li>Part 6: <a href=\"\/javascript\/reduxjs-toolkit-createselector\/\">ReduxJS\/Toolkit: createSelector<\/a><\/li>\n<\/ul>\n<h1>Extras<\/h1>\n<p><b>Stuff that came into being during the making of this post<\/b><\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/itenium-be\/reduxjs-toolkit\">The &#8216;Mythical Zoos&#8217; example code and the talk pptx<\/a><\/li>\n<\/ul>\n<h1> Package Versions <i class=\"fa fa-info-circle\" style=\"float: right; color: cornflowerblue; font-size: 28px\" title=\"Package versions used for this post and in the accompanying code on Github\"><\/i><\/h1>\n<div><a href=\"https:\/\/github.com\/reduxjs\/redux-toolkit\" class=\"github\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/github\/stars\/reduxjs\/redux-toolkit.svg?style=social&#038;label=Star\" \/><\/a><a href=\"https:\/\/github.com\/reduxjs\/redux-toolkit\">reduxjs\/redux-toolkit<\/a>: v2.5.0 <\/div>\n","protected":false},"excerpt":{"rendered":"<p>The legacy Redux <code>createStore<\/code> could make a grown man cry, and probably has. <code>createSlice<\/code> and <code>configureStore<\/code> GREATLY simplifies this process while at the same time also significantly reducing the boilerplate \u2013 you can basically delete all your actions as they are now defined by the reducers!<\/p>\n<ul>\n<li><code>createSlice<\/code>: each top level object of your state is typically a slice<\/li>\n<li><code>configureStore<\/code>: abstracts away the horror that was <code>createStore<\/code><\/li>\n<\/ul>\n","protected":false},"author":1,"featured_media":1967,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[3],"tags":[22,6],"class_list":["post-1363","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-react","tag-tutorial"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ReduxJS\/Toolkit: createSlice and configureStore - Itenium<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ReduxJS\/Toolkit: createSlice and configureStore - Itenium\" \/>\n<meta property=\"og:description\" content=\"The legacy Redux createStore could make a grown man cry, and probably has. createSlice and configureStore GREATLY simplifies this process while at the same time also significantly reducing the boilerplate \u2013 you can basically delete all your actions as they are now defined by the reducers!createSlice: each top level object of your state is typically a sliceconfigureStore: abstracts away the horror that was createStore\" \/>\n<meta property=\"og:url\" content=\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/\" \/>\n<meta property=\"og:site_name\" content=\"Itenium\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-07T23:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-28T12:31:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createStore.png\" \/>\n\t<meta property=\"og:image:width\" content=\"360\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Usdevelop\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Usdevelop\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/\",\"name\":\"ReduxJS\/Toolkit: createSlice and configureStore - Itenium\",\"isPartOf\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createStore.png\",\"datePublished\":\"2025-02-07T23:00:00+00:00\",\"dateModified\":\"2025-11-28T12:31:41+00:00\",\"author\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022\"},\"breadcrumb\":{\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/#primaryimage\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createStore.png\",\"contentUrl\":\"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createStore.png\",\"width\":360,\"height\":300,\"caption\":\"A detailed, blueprint-style illustration of a 1950s 'redux store' under construction. he image has a sepia-toned nostalgic feel, with sketched lines and a vintage Americana aesthetic.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/demo.sidekick.be\/itenium\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ReduxJS\/Toolkit: createSlice and configureStore\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#website\",\"url\":\"https:\/\/demo.sidekick.be\/itenium\/\",\"name\":\"Itenium\",\"description\":\"We build software. We build careers.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/demo.sidekick.be\/itenium\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022\",\"name\":\"Usdevelop\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g\",\"caption\":\"Usdevelop\"},\"sameAs\":[\"https:\/\/demo.sidekick.be\/itenium\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ReduxJS\/Toolkit: createSlice and configureStore - Itenium","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"ReduxJS\/Toolkit: createSlice and configureStore - Itenium","og_description":"The legacy Redux createStore could make a grown man cry, and probably has. createSlice and configureStore GREATLY simplifies this process while at the same time also significantly reducing the boilerplate \u2013 you can basically delete all your actions as they are now defined by the reducers!createSlice: each top level object of your state is typically a sliceconfigureStore: abstracts away the horror that was createStore","og_url":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/","og_site_name":"Itenium","article_published_time":"2025-02-07T23:00:00+00:00","article_modified_time":"2025-11-28T12:31:41+00:00","og_image":[{"width":360,"height":300,"url":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createStore.png","type":"image\/png"}],"author":"Usdevelop","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Usdevelop","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/","url":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/","name":"ReduxJS\/Toolkit: createSlice and configureStore - Itenium","isPartOf":{"@id":"https:\/\/demo.sidekick.be\/itenium\/#website"},"primaryImageOfPage":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/#primaryimage"},"image":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/#primaryimage"},"thumbnailUrl":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createStore.png","datePublished":"2025-02-07T23:00:00+00:00","dateModified":"2025-11-28T12:31:41+00:00","author":{"@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022"},"breadcrumb":{"@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/#primaryimage","url":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createStore.png","contentUrl":"https:\/\/demo.sidekick.be\/itenium\/wp-content\/uploads\/2025\/11\/reduxjs-toolkit-createStore.png","width":360,"height":300,"caption":"A detailed, blueprint-style illustration of a 1950s 'redux store' under construction. he image has a sepia-toned nostalgic feel, with sketched lines and a vintage Americana aesthetic."},{"@type":"BreadcrumbList","@id":"https:\/\/demo.sidekick.be\/itenium\/blog\/javascript\/reduxjs-toolkit-createslice\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/demo.sidekick.be\/itenium\/"},{"@type":"ListItem","position":2,"name":"ReduxJS\/Toolkit: createSlice and configureStore"}]},{"@type":"WebSite","@id":"https:\/\/demo.sidekick.be\/itenium\/#website","url":"https:\/\/demo.sidekick.be\/itenium\/","name":"Itenium","description":"We build software. We build careers.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/demo.sidekick.be\/itenium\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/6ab401ce01e858184ee4a8667fe0f022","name":"Usdevelop","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/demo.sidekick.be\/itenium\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cc8cf9b9e9d5bbe7e8d247907cc9ac8457bbfa2854b52eaddf6529adfe88ceab?s=96&d=mm&r=g","caption":"Usdevelop"},"sameAs":["https:\/\/demo.sidekick.be\/itenium"]}]}},"_links":{"self":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1363","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/comments?post=1363"}],"version-history":[{"count":2,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1363\/revisions"}],"predecessor-version":[{"id":2148,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/posts\/1363\/revisions\/2148"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/media\/1967"}],"wp:attachment":[{"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/media?parent=1363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/categories?post=1363"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demo.sidekick.be\/itenium\/wp-json\/wp\/v2\/tags?post=1363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}