{"id":1969,"date":"2025-10-04T18:56:22","date_gmt":"2025-10-04T10:56:22","guid":{"rendered":"https:\/\/womeifei.cn\/?p=1969"},"modified":"2025-10-11T17:55:48","modified_gmt":"2025-10-11T09:55:48","slug":"tanstack-query-react%e8%af%b7%e6%b1%82%e5%ba%93","status":"publish","type":"post","link":"https:\/\/womeifei.cn\/index.php\/2025\/10\/04\/tanstack-query-react%e8%af%b7%e6%b1%82%e5%ba%93\/","title":{"rendered":"TanStack Query &#8212; React\u8bf7\u6c42\u5e93"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>TanStack Query\u7684\u6838\u5fc3\u4f5c\u7528\uff1a\u200b<\/strong>\u200b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u200b<strong>\u8ba9\u524d\u7aef\u5e94\u7528\u7684\u6570\u636e\u83b7\u53d6\u3001\u7f13\u5b58\u548c\u540c\u6b65\u53d8\u5f97\u6781\u5176\u7b80\u5355<\/strong>\uff0c\u540c\u65f6\u4fdd\u6301\u9ad8\u6027\u80fd\u548c\u4e00\u81f4\u6027<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u81ea\u52a8\u7ba1\u7406 \u200b<strong>\u670d\u52a1\u5668\u72b6\u6001\uff08Server State\uff09\u200b<\/strong>\uff0c\u5904\u7406 \u200b<strong>\u6570\u636e\u83b7\u53d6\u3001\u7f13\u5b58\u3001\u66f4\u65b0\u3001\u540c\u6b65\u548c\u9519\u8bef\u5904\u7406<\/strong>\uff0c\u8ba9\u4f60\u53ea\u9700\u5173\u5fc3 \u200b<strong>\u200b\u201c\u8981\u4ec0\u4e48\u6570\u636e\u201d\u200b<\/strong>\u200b \u548c \u200b<strong>\u200b\u201c\u5982\u4f55\u4fee\u6539\u6570\u636e\u201d\u200b<\/strong>\uff0c\u800c\u4e0d\u7528\u624b\u52a8\u5199\u590d\u6742\u7684\u72b6\u6001\u903b\u8f91<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Without TanStack Query<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>import { useEffect, useState } from \"react\";\n\nconst WithoutTanstackQuery = () => {\n    const &#91;id, setId] = useState(1);\n    const &#91;data, setData] = useState(null);\n    const &#91;isLoading, setIsLoading] = useState(true);\n    const &#91;error, setError] = useState(null);\n\n    useEffect(() => {\n\n        let rc = false\n        const handleFetch = async () => {\n            setIsLoading(true);\n            setError(null);\n\n            try {\n                const res = await fetch(\n                    `https:\/\/jsonplaceholder.typicode.com\/todos\/${id}`\n                );\n                if (rc) return;\n                if (!res.ok) throw new Error(`Error fetching data: ${res.statusText}`);\n\n                const result = await res.json();\n                setData(result);\n            } catch (e: any) {\n                setError(e.message);\n            } finally {\n                setIsLoading(false);\n            }\n        };\n\n        handleFetch();\n\n        return () => {\n            rc = true\n        }\n    }, &#91;id]);\n\n    return (\n        &lt;div>\n            {isLoading &amp;&amp; &lt;h1>Loading...&lt;\/h1>}\n            {error &amp;&amp; &lt;h1>{error}&lt;\/h1>}\n            {data &amp;&amp; &lt;h1>{JSON.stringify(data)}&lt;\/h1>}\n            &lt;button\n                className=\"bg-black  text-white p-&#91;3rem] rounded-2xl\"\n                onClick={() => setId((prevId) => prevId + 1)}\n            >\n                Next\n            &lt;\/button>\n        &lt;\/div>\n    );\n};\n\nexport default WithoutTanstackQuery;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">With TanStack Query<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>main.tsx<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { createRoot } from 'react-dom\/client'\nimport '.\/index.css'\nimport App from '.\/App.tsx'\nimport { QueryClientProvider, QueryClient } from '@tanstack\/react-query'\n\n\nimport { ReactQueryDevtools } from '@tanstack\/react-query-devtools'\n\nconst queryClient = new QueryClient()\n\ncreateRoot(document.getElementById('root')!).render(\n  &lt;QueryClientProvider client={queryClient}>\n    &lt;App \/>\n    &lt;ReactQueryDevtools initialIsOpen={false}>&lt;\/ReactQueryDevtools>\n  &lt;\/QueryClientProvider>\n)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>WithTanStackQuery.tsx<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nimport { useQuery } from \"@tanstack\/react-query\"\nimport axios from \"axios\"\n\nconst fetchData = async () => {\n    const response = await axios.get(\n        \"https:\/\/jsonplaceholder.typicode.com\/todos\"\n    )\n    return response.data\n}\n\n\nconst WithTanStackQuery = () => {\n    const { data, error, isLoading } = useQuery({\n        queryKey: &#91;'todo'],\n        queryFn: fetchData\n    })\n    if (isLoading) {\n        return &lt;h1>Loading...&lt;\/h1>\n    }\n    if (error) {\n        return &lt;p>An Error Occurerd! :{error.message}&lt;\/p>\n    }\n    return (\n        &lt;div>\n            &lt;h1>Data&lt;\/h1>\n            &lt;pre>{JSON.stringify(data, null, 2)}&lt;\/pre>\n        &lt;\/div>\n    )\n}\n\nexport default WithTanStackQuery\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Deduplication<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5728\u540c\u4e00\u4e2a\u65f6\u95f4\u70b9\uff0c\u5bf9\u5b8c\u5168\u76f8\u540c\u7684\u591a\u4e2a\u6570\u636e\u8bf7\u6c42\uff0cTanStack Query \u4f1a\u81ea\u52a8\u5c06\u5b83\u4eec\u5408\u5e76\u4e3a\u5355\u4e2a\u7f51\u7edc\u8bf7\u6c42<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { useQuery } from \"@tanstack\/react-query\"\n\n\nconst getRandomNumber = async () => {\n    return Promise.resolve(Math.random())\n}\n\nconst Deduplication = () => {\n    const { data } = useQuery({ queryKey: &#91;'randomNumber'], queryFn: getRandomNumber })\n    return (\n        &lt;div>\n            RandomNumber is : {data}\n        &lt;\/div>\n    )\n}\n\nexport default Deduplication\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>App.tsx<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function App() {\n  return (\n    &lt;>\n      &lt;div className=\"\">\n        &lt;Deduplication>&lt;\/Deduplication>\n        &lt;Deduplication>&lt;\/Deduplication>\n        &lt;Deduplication>&lt;\/Deduplication>\n      &lt;\/div>\n\n    &lt;\/>\n  )\n}\n\nexport default App<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u4f1a\u83b7\u53d6\u76f8\u540c\u7684\u968f\u673a\u6570!<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">StaleTime<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>import { useQuery } from \"@tanstack\/react-query\"\nimport axios from \"axios\"\nconst fetchData = async () => {\n    const response = await axios.get(\n        \"https:\/\/jsonplaceholder.typicode.com\/todos\"\n    )\n    return response.data\n}\n\nconst StaleTime = () => {\n    const { data, error, isLoading } = useQuery({\n        queryKey: &#91;'todo'],\n        queryFn: fetchData,\n        staleTime: 5000\n    })\n    if (isLoading) {\n        return &lt;h1>Loading...&lt;\/h1>\n    }\n    if (error) {\n        return &lt;p>An Error Occurerd! :{error.message}&lt;\/p>\n    }\n    return (\n        &lt;div>\n            &lt;h1>Data&lt;\/h1>\n            &lt;pre>{JSON.stringify(data, null, 2)}&lt;\/pre>\n        &lt;\/div>\n    )\n}\n\nexport default StaleTime<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/womeifei.cn\/wp-content\/uploads\/2025\/10\/image-1024x81.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"81\" data-original=\"https:\/\/womeifei.cn\/wp-content\/uploads\/2025\/10\/image-1024x81.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1972\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e94\u79d2\u540e<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/womeifei.cn\/wp-content\/uploads\/2025\/10\/image-1-1024x94.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"94\" data-original=\"https:\/\/womeifei.cn\/wp-content\/uploads\/2025\/10\/image-1-1024x94.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1973\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">RefetchInterval<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u81ea\u52a8\u6309\u8bbe\u5b9a\u7684\u65f6\u95f4\u95f4\u9694\uff08\u6beb\u79d2\uff09\u91cd\u65b0\u6267\u884c\u67e5\u8be2\uff0c\u4fdd\u6301\u6570\u636e\u6700\u65b0<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { useState, useEffect } from \"react\";\nimport { useQuery } from \"@tanstack\/react-query\";\n\nconst fetchTodo = async (id: number) => {\n    const response = await fetch(\n        `https:\/\/jsonplaceholder.typicode.com\/todos\/${id}`\n    );\n\n    if (!response.ok) throw new Error(\"Network response was not ok\");\n    return response.json();\n};\n\nconst RefetchInterval = () => {\n    const &#91;currentId, setCurrentId] = useState(1);\n\n    const { data, error, isLoading } = useQuery({\n        queryKey: &#91;\"todo\", currentId],\n        queryFn: () => fetchTodo(currentId),\n        refetchInterval: 5000,\n    });\n\n    useEffect(() => {\n        const interval = setInterval(() => {\n            setCurrentId((prevId) => (prevId &lt; 200 ? prevId + 1 : 1));\n        }, 5000);\n\n        return () => clearInterval(interval);\n    }, &#91;]);\n\n    if (isLoading) return &lt;div>Loading...&lt;\/div>;\n    if (error) return &lt;div>An error occurred: {error.message}&lt;\/div>;\n\n    return (\n        &lt;div>\n            &lt;h1>Todo&lt;\/h1>\n            &lt;pre>{JSON.stringify(data, null, 2)}&lt;\/pre>\n            &lt;button\n                onClick={() =>\n                    setCurrentId((prevId) => (prevId &lt; 200 ? prevId + 1 : 1))\n                }\n            >\n                Next Todo\n            &lt;\/button>\n        &lt;\/div>\n    );\n};\n\nexport default RefetchInterval;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">MutatingData<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">TanStack Query \u4e2d\u7684 <code>useMutation<\/code>\u662f\u4e13\u95e8\u7528\u4e8e\u5904\u7406\u6570\u636e\u53d8\u66f4\u64cd\u4f5c\uff08\u5982\u521b\u5efa\u3001\u66f4\u65b0\u3001\u5220\u9664\uff09\u7684\u6838\u5fc3 Hook<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0e <code>useQuery<\/code>\u4e0d\u540c\uff0c\u5b83\u4e0d\u6d89\u53ca\u7f13\u5b58\u7ba1\u7406\uff0c\u800c\u662f\u4e13\u6ce8\u4e8e\u5904\u7406\u526f\u4f5c\u7528\u64cd\u4f5c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { useState } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack\/react-query\";\n\ninterface Todo {\n    id?: number;\n    title: string;\n    completed: boolean;\n}\n\nconst postTodo = async (newTodo: Todo): Promise&lt;Todo> => {\n    const response = await fetch(\"https:\/\/jsonplaceholder.typicode.com\/todos\", {\n        method: \"POST\",\n        headers: {\n            \"Content-Type\": \"application\/json\",\n        },\n        body: JSON.stringify(newTodo),\n    });\n\n    if (!response.ok) throw new Error(\"Network response was not ok\");\n    return response.json();\n};\n\nconst MutateData = () => {\n    const queryClient = useQueryClient();\n    const &#91;title, setTitle] = useState(\"\");\n\n    const { mutate, error, status } = useMutation&lt;Todo, Error, Todo>({\n        mutationFn: postTodo,\n        onSuccess: () => {\n            \/\/ \u2705 \u6b63\u786e\u7528\u6cd5\uff1a\u4f20\u9012 { queryKey: &#91;...] }\n            queryClient.invalidateQueries({ queryKey: &#91;\"todos\"] });\n        },\n        onError: (error) => {\n            console.error(\"Error posting todo:\", error);\n        },\n    });\n\n    const handleSubmit = (e: React.FormEvent&lt;HTMLFormElement>) => {\n        e.preventDefault();\n        if (title.trim() === \"\") return;\n\n        mutate({ title, completed: false });\n        setTitle(\"\");\n    };\n\n    return (\n        &lt;div>\n            &lt;h1>Create New Todo&lt;\/h1>\n            &lt;form onSubmit={handleSubmit}>\n                &lt;input\n                    type=\"text\"\n                    value={title}\n                    onChange={(e) => setTitle(e.target.value)}\n                    placeholder=\"Enter todo title\"\n                \/>\n                &lt;button type=\"submit\" disabled={status === \"pending\"}>\n                    {status === \"pending\" ? \"Adding...\" : \"Add Todo\"}\n                &lt;\/button>\n                {error &amp;&amp; &lt;div>An error occurred: {error.message}&lt;\/div>}\n                {status === \"success\" &amp;&amp; &lt;div>Todo added successfully!&lt;\/div>}\n            &lt;\/form>\n        &lt;\/div>\n    );\n};\n\nexport default MutateData;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e3a\u4ec0\u4e48\u9700\u8981\u00a0<code>invalidateQueries<\/code>\uff1f\u200b<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5047\u8bbe\u4f60\u7684\u5e94\u7528\u6709\u4e00\u4e2a <code>useQuery([\"todos\"], fetchTodos)<\/code>\uff0c\u7528\u4e8e\u83b7\u53d6\u6240\u6709\u5f85\u529e\u4e8b\u9879<\/li>\n\n\n\n<li>\u5f53\u4f60\u65b0\u589e\u4e00\u4e2a Todo\uff08<code>POST<\/code>\u8bf7\u6c42\uff09\u540e\uff0c\u200b<strong>\u540e\u7aef\u6570\u636e\u5df2\u7ecf\u53d8\u5316\uff0c\u4f46\u524d\u7aef\u7f13\u5b58\u4ecd\u7136\u662f\u65e7\u6570\u636e<\/strong><\/li>\n\n\n\n<li>\u5982\u679c\u4e0d\u624b\u52a8\u66f4\u65b0\u7f13\u5b58\uff0c\u7528\u6237\u770b\u5230\u7684\u5217\u8868 \u200b<strong>\u4e0d\u4f1a\u7acb\u5373\u5305\u542b\u65b0\u589e\u7684 Todo<\/strong>\u200b\uff08\u9664\u975e\u624b\u52a8\u5237\u65b0\u9875\u9762\uff09<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">FetchFromMutipleEndpoints<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>import { useState } from \"react\";\nimport { useQueries } from \"@tanstack\/react-query\";\n\nconst fetchTodos = async () => {\n    const response = await fetch(\"https:\/\/jsonplaceholder.typicode.com\/todos\");\n    if (!response.ok) throw new Error(\"Network response was not ok\");\n    return response.json();\n};\n\nconst fetchPosts = async () => {\n    const response = await fetch(\"https:\/\/jsonplaceholder.typicode.com\/posts\");\n    if (!response.ok) throw new Error(\"Network response was not ok\");\n    return response.json();\n};\n\nconst FetchFromMultipleEndpoints = () => {\n    const &#91;currentTodoId, setCurrentTodoId] = useState(1);\n    const &#91;currentPostId, setCurrentPostId] = useState(1);\n\n    \/\/ Using useQueries to fetch from multiple endpoints\n    const results = useQueries({\n        queries: &#91;\n            {\n                queryKey: &#91;\"todos\"],\n                queryFn: fetchTodos,\n            },\n            {\n                queryKey: &#91;\"posts\"],\n                queryFn: fetchPosts,\n            },\n        ],\n    });\n\n    console.log(results)\n    const &#91;todosQuery, postsQuery] = results;\n\n    if (todosQuery.isLoading || postsQuery.isLoading)\n        return &lt;div>Loading...&lt;\/div>;\n\n    if (todosQuery.error || postsQuery.error)\n        return (\n            &lt;div>\n                An error occurred:\n                {todosQuery.error?.message || postsQuery.error?.message}\n            &lt;\/div>\n        );\n\n    const todosData = todosQuery.data;\n    const postsData = postsQuery.data;\n\n    \/\/ Handle button clicks to fetch specific todos and posts\n    const handleNextTodoClick = () => {\n        setCurrentTodoId((prevId) => Math.min(prevId + 1, todosData.length));\n    };\n\n    const handleNextPostClick = () => {\n        setCurrentPostId((prevId) => Math.min(prevId + 1, postsData.length));\n    };\n\n    return (\n        &lt;div>\n            &lt;h1>Todos&lt;\/h1>\n            &lt;pre>\n                {JSON.stringify(\n                    todosData.find((todo: any) => todo.id === currentTodoId),\n                    null,\n                    2\n                )}\n            &lt;\/pre>\n            &lt;button onClick={handleNextTodoClick}>Next Todo&lt;\/button>\n\n            &lt;h1>Posts&lt;\/h1>\n            &lt;pre>\n                {JSON.stringify(\n                    postsData.find((post: any) => post.id === currentPostId),\n                    null,\n                    2\n                )}\n            &lt;\/pre>\n            &lt;button onClick={handleNextPostClick}>Next Post&lt;\/button>\n        &lt;\/div>\n    );\n};\n\nexport default FetchFromMultipleEndpoints;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Pagination<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>import { useState } from \"react\";\nimport { useQuery } from \"@tanstack\/react-query\";\n\nconst fetchTodos = async (page = 1, limit = 10) => {\n    const response = await fetch(\n        `https:\/\/jsonplaceholder.typicode.com\/todos?_page=${page}&amp;_limit=${limit}`\n    );\n    if (!response.ok) throw new Error(\"Network response was not ok\");\n    return response.json();\n};\n\nconst Pagination = () => {\n    const &#91;currentPage, setCurrentPage] = useState(1);\n    const pageSize = 10;\n\n    const { data, error, isLoading } = useQuery({\n        queryKey: &#91;\"todos\", currentPage],\n        queryFn: () => fetchTodos(currentPage, pageSize),\n    });\n\n    if (isLoading) return &lt;div>Loading...&lt;\/div>;\n    if (error) return &lt;div>An error occurred: {error.message}&lt;\/div>;\n\n    const handleNextPage = () => {\n        setCurrentPage((prevPage) => prevPage + 1);\n    };\n\n    const handlePreviousPage = () => {\n        setCurrentPage((prevPage) => Math.max(prevPage - 1, 1));\n    };\n\n    return (\n        &lt;div>\n            &lt;h1>Todos&lt;\/h1>\n            &lt;pre>{JSON.stringify(data, null, 2)}&lt;\/pre>\n            &lt;div>\n                &lt;button onClick={handlePreviousPage} disabled={currentPage === 1}>\n                    Previous Page\n                &lt;\/button>\n                &lt;button onClick={handleNextPage}>Next Page&lt;\/button>\n            &lt;\/div>\n        &lt;\/div>\n    );\n};\n\nexport default Pagination;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TanStack Query\u7684\u6838\u5fc3\u4f5c\u7528\uff1a\u200b\u200b \u200b\u8ba9\u524d\u7aef\u5e94\u7528\u7684\u6570\u636e\u83b7\u53d6\u3001\u7f13\u5b58\u548c\u540c\u6b65\u53d8\u5f97\u6781\u5176\u7b80\u5355\uff0c\u540c\u65f6\u4fdd\u6301\u9ad8\u6027\u80fd\u548c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[47,1],"tags":[],"class_list":["post-1969","post","type-post","status-publish","format-standard","hentry","category-react","category-1"],"_links":{"self":[{"href":"https:\/\/womeifei.cn\/index.php\/wp-json\/wp\/v2\/posts\/1969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/womeifei.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/womeifei.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/womeifei.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/womeifei.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1969"}],"version-history":[{"count":3,"href":"https:\/\/womeifei.cn\/index.php\/wp-json\/wp\/v2\/posts\/1969\/revisions"}],"predecessor-version":[{"id":1976,"href":"https:\/\/womeifei.cn\/index.php\/wp-json\/wp\/v2\/posts\/1969\/revisions\/1976"}],"wp:attachment":[{"href":"https:\/\/womeifei.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/womeifei.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1969"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/womeifei.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}