{"id":32847,"date":"2024-11-01T09:11:57","date_gmt":"2024-11-01T09:11:57","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=32847"},"modified":"2024-11-01T11:21:46","modified_gmt":"2024-11-01T11:21:46","slug":"react-course-to-do-app-upgrade-using-usereducer","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/32847\/","title":{"rendered":"React Course: To Do App Upgrade Using useReducer"},"content":{"rendered":"<p><body><\/p>\n<article>\n<p>React has become an important tool in modern web development. In particular, while there are various methods for state management, <strong>useReducer<\/strong> is a React hook that helps effectively manage more complex state logic. In this tutorial, we will specifically cover how to utilize useReducer using a basic To Do app.<\/p>\n<h2>1. Project Structure<\/h2>\n<p>First, let&#8217;s look at the basic structure of the project. Typically, the structure of a To Do app is organized as follows:<\/p>\n<pre><code>\n\/to-do-app\n|-- \/src\n|   |-- \/components\n|   |   |-- TodoItem.js\n|   |   |-- TodoList.js\n|   |   \u2514-- TodoForm.js\n|   |\n|   |-- App.js\n|   \u2514-- index.js\n|-- package.json\n|-- README.md\n        <\/code><\/pre>\n<p>In the above structure, <code>TodoItem<\/code> represents an individual task, and <code>TodoList<\/code> shows the entire list of tasks. New tasks are added using <code>TodoForm<\/code>.<\/p>\n<h2>2. Introduction to useReducer<\/h2>\n<p>useReducer is useful when dealing with complex state, and it can be used in the following way:<\/p>\n<pre><code>\nconst [state, dispatch] = useReducer(reducer, initialState);\n        <\/code><\/pre>\n<p><strong>state<\/strong>: Represents the current state, and <strong>dispatch<\/strong>: A function for state updates. <strong>reducer<\/strong> is a function that defines how the state should change.<\/p>\n<h2>3. Implementing a Basic To Do App<\/h2>\n<p>First, let&#8217;s implement a basic To Do app. The code below is a simple React app that allows users to add tasks and display the list.<\/p>\n<pre><code>\nimport React, { useState } from 'react';\n\nconst App = () =&gt; {\n    const [todos, setTodos] = useState([]);\n    const [input, setInput] = useState('');\n\n    const addTodo = () =&gt; {\n        if (input.trim() !== '') {\n            setTodos([...todos, { text: input, completed: false }]);\n            setInput('');\n        }\n    };\n\n    const toggleTodo = (index) =&gt; {\n        setTodos(todos.map((todo, i) =&gt; \n            i === index ? { ...todo, completed: !todo.completed } : todo\n        ));\n    };\n\n    return (\n        <div>\n            <h1>My To Do List<\/h1>\n            <input ==\"\" onchange=\"{(e)\" value=\"{input}\"\/> setInput(e.target.value)}\n                placeholder=\"Enter a task\"\n            \/&gt;\n            <button onclick=\"{addTodo}\">Add<\/button>\n            <ul>\n                {todos.map((todo, index) =&gt; (\n                    <li ==\"\" key=\"{index}\" onclick=\"{()\"> toggleTodo(index)} style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}&gt;\n                        {todo.text}\n                    <\/li>\n                ))}\n            <\/ul>\n        <\/div>\n    );\n};\n\nexport default App;\n        <\/code><\/pre>\n<h2>4. Managing State with useReducer<\/h2>\n<p>Now, let&#8217;s improve the above code using useReducer. When it is necessary to manage state in a complex manner, useReducer can be more useful.<\/p>\n<pre><code>\nimport React, { useReducer } from 'react';\n\nconst initialState = { todos: [] };\n\nconst reducer = (state, action) =&gt; {\n    switch (action.type) {\n        case 'ADD_TODO':\n            return { \n                ...state, \n                todos: [...state.todos, { text: action.payload, completed: false }] \n            };\n        case 'TOGGLE_TODO':\n            return {\n                ...state,\n                todos: state.todos.map((todo, index) =&gt;\n                    index === action.payload ? { ...todo, completed: !todo.completed } : todo\n                ),\n            };\n        default:\n            return state;\n    }\n};\n\nconst App = () =&gt; {\n    const [state, dispatch] = useReducer(reducer, initialState);\n    const [input, setInput] = React.useState('');\n\n    const addTodo = () =&gt; {\n        if (input.trim() !== '') {\n            dispatch({ type: 'ADD_TODO', payload: input });\n            setInput('');\n        }\n    };\n\n    return (\n        <div>\n            <h1>My To Do List (useReducer)<\/h1>\n            <input ==\"\" onchange=\"{(e)\" value=\"{input}\"\/> setInput(e.target.value)}\n                placeholder=\"Enter a task\"\n            \/&gt;\n            <button onclick=\"{addTodo}\">Add<\/button>\n            <ul>\n                {state.todos.map((todo, index) =&gt; (\n                    <li ==\"\" key=\"{index}\" onclick=\"{()\"> dispatch({ type: 'TOGGLE_TODO', payload: index })} style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}&gt;\n                        {todo.text}\n                    <\/li>\n                ))}\n            <\/ul>\n        <\/div>\n    );\n};\n\nexport default App;\n        <\/code><\/pre>\n<h2>5. Advantages of useReducer<\/h2>\n<p>Using useReducer has the following advantages:<\/p>\n<ul>\n<li>Complex state logic: It can maintain complex state logic clearly by managing multiple state transitions as independent actions.<\/li>\n<li>Centralized management: When there are multiple state updates, all state changes can be handled by a single reducer function.<\/li>\n<li>Performance improvement: It makes maintaining immutability easier, helping with performance optimization.<\/li>\n<\/ul>\n<h2>6. Component Separation<\/h2>\n<p>Now, let&#8217;s break the App component into smaller components to improve code readability. We will create TodoList and TodoForm components.<\/p>\n<pre><code>\nconst TodoList = ({ todos, toggleTodo }) =&gt; (\n    <ul>\n        {todos.map((todo, index) =&gt; (\n            <li ==\"\" key=\"{index}\" onclick=\"{()\"> toggleTodo(index)} \n                style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}\n            &gt;\n                {todo.text}\n            <\/li>\n        ))}\n    <\/ul>\n);\n\nconst TodoForm = ({ addTodo, input, setInput }) =&gt; (\n    <div>\n        <input ==\"\" onchange=\"{(e)\" value=\"{input}\"\/> setInput(e.target.value)}\n            placeholder=\"Enter a task\"\n        \/&gt;\n        <button onclick=\"{addTodo}\">Add<\/button>\n    <\/div>\n);\n        <\/code><\/pre>\n<h2>7. Final Code<\/h2>\n<pre><code>\nimport React, { useReducer, useState } from 'react';\n\nconst initialState = { todos: [] };\n\nconst reducer = (state, action) =&gt; {\n    switch (action.type) {\n        case 'ADD_TODO':\n            return { \n                ...state, \n                todos: [...state.todos, { text: action.payload, completed: false }] \n            };\n        case 'TOGGLE_TODO':\n            return {\n                ...state,\n                todos: state.todos.map((todo, index) =&gt;\n                    index === action.payload ? { ...todo, completed: !todo.completed } : todo\n                ),\n            };\n        default:\n            return state;\n    }\n};\n\nconst TodoList = ({ todos, toggleTodo }) =&gt; (\n    <ul>\n        {todos.map((todo, index) =&gt; (\n            <li ==\"\" key=\"{index}\" onclick=\"{()\"> toggleTodo(index)} \n                style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}\n            &gt;\n                {todo.text}\n            <\/li>\n        ))}\n    <\/ul>\n);\n\nconst TodoForm = ({ addTodo, input, setInput }) =&gt; (\n    <div>\n        <input ==\"\" onchange=\"{(e)\" value=\"{input}\"\/> setInput(e.target.value)}\n            placeholder=\"Enter a task\"\n        \/&gt;\n        <button onclick=\"{addTodo}\">Add<\/button>\n    <\/div>\n);\n\nconst App = () =&gt; {\n    const [state, dispatch] = useReducer(reducer, initialState);\n    const [input, setInput] = useState('');\n\n    const addTodo = () =&gt; {\n        if (input.trim() !== '') {\n            dispatch({ type: 'ADD_TODO', payload: input });\n            setInput('');\n        }\n    };\n\n    return (\n        <div>\n            <h1>My To Do List (useReducer)<\/h1>\n            <todoform addtodo=\"{addTodo}\" input=\"{input}\" setinput=\"{setInput}\"><\/todoform>\n            <todolist ==\"\" todos=\"{state.todos}\" toggletodo=\"{(index)\"> dispatch({ type: 'TOGGLE_TODO', payload: index })} \/&gt;\n        <\/todolist><\/div>\n    );\n};\n\nexport default App;\n        <\/code><\/pre>\n<h2>8. Conclusion<\/h2>\n<p>In this tutorial, we learned how to apply useReducer through the To Do app. useReducer helps manage complex state logic concisely, enhancing readability and maintainability. Furthermore, we were able to improve the structure of the code by breaking it into several components. This pattern can also be effectively used in more complex applications. In the next session, we will explore global state management using useContext.<\/p>\n<\/article>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>React has become an important tool in modern web development. In particular, while there are various methods for state management, useReducer is a React hook that helps effectively manage more complex state logic. In this tutorial, we will specifically cover how to utilize useReducer using a basic To Do app. 1. Project Structure First, let&#8217;s &hellip; <a href=\"https:\/\/atmokpo.com\/w\/32847\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;React Course: To Do App Upgrade Using useReducer&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[123],"tags":[],"class_list":["post-32847","post","type-post","status-publish","format-standard","hentry","category-react-basics-course"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>React Course: To Do App Upgrade Using useReducer - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/32847\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React Course: To Do App Upgrade Using useReducer - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"React has become an important tool in modern web development. In particular, while there are various methods for state management, useReducer is a React hook that helps effectively manage more complex state logic. In this tutorial, we will specifically cover how to utilize useReducer using a basic To Do app. 1. Project Structure First, let&#8217;s &hellip; \ub354 \ubcf4\uae30 &quot;React Course: To Do App Upgrade Using useReducer&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/32847\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:11:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:21:46+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/32847\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32847\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"React Course: To Do App Upgrade Using useReducer\",\"datePublished\":\"2024-11-01T09:11:57+00:00\",\"dateModified\":\"2024-11-01T11:21:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32847\/\"},\"wordCount\":356,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"React basics course\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/32847\/\",\"url\":\"https:\/\/atmokpo.com\/w\/32847\/\",\"name\":\"React Course: To Do App Upgrade Using useReducer - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:11:57+00:00\",\"dateModified\":\"2024-11-01T11:21:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/32847\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/32847\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/32847\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React Course: To Do App Upgrade Using useReducer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"React Course: To Do App Upgrade Using useReducer - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/atmokpo.com\/w\/32847\/","og_locale":"ko_KR","og_type":"article","og_title":"React Course: To Do App Upgrade Using useReducer - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"React has become an important tool in modern web development. In particular, while there are various methods for state management, useReducer is a React hook that helps effectively manage more complex state logic. In this tutorial, we will specifically cover how to utilize useReducer using a basic To Do app. 1. Project Structure First, let&#8217;s &hellip; \ub354 \ubcf4\uae30 \"React Course: To Do App Upgrade Using useReducer\"","og_url":"https:\/\/atmokpo.com\/w\/32847\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:11:57+00:00","article_modified_time":"2024-11-01T11:21:46+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"4\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/32847\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/32847\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"React Course: To Do App Upgrade Using useReducer","datePublished":"2024-11-01T09:11:57+00:00","dateModified":"2024-11-01T11:21:46+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/32847\/"},"wordCount":356,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["React basics course"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/32847\/","url":"https:\/\/atmokpo.com\/w\/32847\/","name":"React Course: To Do App Upgrade Using useReducer - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:11:57+00:00","dateModified":"2024-11-01T11:21:46+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/32847\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/32847\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/32847\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"React Course: To Do App Upgrade Using useReducer"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32847","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=32847"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32847\/revisions"}],"predecessor-version":[{"id":32848,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/32847\/revisions\/32848"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=32847"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=32847"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=32847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}