{"id":3086,"date":"2020-09-24T16:25:13","date_gmt":"2020-09-24T08:25:13","guid":{"rendered":"http:\/\/www.yuguoxy.com\/geekhome\/?p=3086"},"modified":"2020-09-24T16:25:13","modified_gmt":"2020-09-24T08:25:13","slug":"vue3-0%e5%85%a8%e5%ae%b6%e6%a1%b6%e6%9c%80%e5%85%a8%e5%85%a5%e9%97%a8%e6%8c%87%e5%8d%97-vue-router4-x%e5%92%8cvuex4-x-34","status":"publish","type":"post","link":"https:\/\/ai.zhousir.top\/?p=3086","title":{"rendered":"Vue3.0\u5168\u5bb6\u6876\u6700\u5168\u5165\u95e8\u6307\u5357 &#8211; vue-router@4.x\u548cvuex@4.x (3\/4)"},"content":{"rendered":"<h1>\u672c\u7cfb\u5217\u6587\u7ae0\u76ee\u5f55<\/h1>\n<ul>\n<li><a href=\"https:\/\/ai.zhousir.top\/archives\/3074\">Vue3.0\u5168\u5bb6\u6876\u6700\u5168\u5165\u95e8\u6307\u5357 &#8211; \u5feb\u901f\u642d\u5efa (1\/4)<\/a><\/li>\n<li><a href=\"https:\/\/ai.zhousir.top\/archives\/3082\">Vue3.0\u5168\u5bb6\u6876\u6700\u5168\u5165\u95e8\u6307\u5357 &#8211; vue3.0\u65b0\u7279\u6027 (2\/4)<\/a><\/li>\n<li><a href=\"https:\/\/ai.zhousir.top\/archives\/3086\">Vue3.0\u5168\u5bb6\u6876\u6700\u5168\u5165\u95e8\u6307\u5357 &#8211; vue-router@4.x\u548cvuex@4.x (3\/4)<\/a><\/li>\n<li><a href=\"https:\/\/juejin.im\/post\/6867123749565497358\">Vue3.0\u5168\u5bb6\u6876\u6700\u5168\u5165\u95e8\u6307\u5357 &#8211;<\/a> <a href=\"https:\/\/juejin.im\/post\/6867123749565497358\">3.x\u8ddf2.x\u7684\u5176\u4ed6\u5dee\u5f02<\/a> <a href=\"https:\/\/juejin.im\/post\/6867123749565497358\">(4\/4)<\/a><\/li>\n<\/ul>\n<h2>\u4e09\u3001<a href=\"mailto:vue-router@4.x\">vue-router@4.x<\/a>\u548c<a href=\"mailto:vuex@4.x\">vuex@4.x<\/a><\/h2>\n<p>vue2.x\u4f7f\u7528\u7684\u662f<code>vue-router@3.x<\/code>\u548c<code>vuex@3.x<\/code>\uff0cvue3.x\u4f7f\u7528\u7684\u662f<code>vue-router@4.x<\/code>\u548c<code>vuex@4.x<\/code>\uff0c<\/p>\n<p>\u8fd9\u91cc\u8981\u907f\u514d\u8ddfvue3.x\u7684\u7248\u672c\u53f7\u6df7\u5408\u4e86\uff0c\u5176\u5b9evue3.x\u4f7f\u7528\u7684<code>router<\/code>\u548c<code>vuex<\/code>\u90fd\u662f4.x\u3002<\/p>\n<p><strong>\u8fd9\u91cc\u4e3a\u4e86\u65b9\u4fbf\u7406\u89e3\uff0c\u7edf\u4e00\u4f7f\u7528<\/strong><code>vue2.x router<\/code><strong>\u3001<\/strong><code>vue3.x router<\/code><strong>\u4ee3\u66ff**<\/strong><a href=\"mailto:vue-router@3.x\">vue-router@3.x<\/a>\u548c<a href=\"mailto:vue-router@4.x\">vue-router@4.x<\/a>\uff0c\u7edf\u4e00\u4f7f\u7528<strong><code>vue2.x vuex<\/code><\/strong>\u3001<strong><code>vue3.x vuex<\/code><\/strong>\u4ee3\u66ff<a href=\"mailto:vuex@3.x\">vuex@3.x<\/a>\u548c<a href=\"mailto:vuex@4.x\">vuex@4.x<\/a>\u3002**<\/p>\n<h3>1\u3001<a href=\"mailto:vue-router@4.x\">vue-router@4.x<\/a><\/h3>\n<h4>\u521b\u5efa\u5b9e\u4f8b<\/h4>\n<pre><code class=\"language-javascript\" lang=\"javascript\">\/\/ vue2.x router\r\nimport Vue from 'vue'\r\nimport Router from 'vue-router'\r\n\r\nconst routes = [\r\n  {\r\n    path: '\/',\r\n    name: 'Home',\r\n    component: Home\r\n  },\r\n  {\r\n    path: '\/about',\r\n    name: 'About',\r\n    \/\/ route level code-splitting\r\n    \/\/ this generates a separate chunk (about.[hash].js) for this route\r\n    \/\/ which is lazy-loaded when the route is visited.\r\n    component: () =&gt; import(\/* webpackChunkName: \"about\" *\/ '..\/views\/About.vue')\r\n  }\r\n]\r\n\r\nVue.use(Router)\r\n\r\nconst router = new Router({\r\n  base: process.env.BASE_URL,\r\n  mode: 'history',\r\n  scrollBehavior: () =&gt; ({ y: 0 }),\r\n  routes\r\n})\r\n\r\nexport default router\r\n\r\n\/\/ vue3.x router\r\nimport { createRouter, createWebHistory } from 'vue-router'\r\nimport Home from '..\/views\/Home.vue'\r\n\r\nconst routes = [\r\n  {\r\n    path: '\/',\r\n    name: 'Home',\r\n    component: Home\r\n  },\r\n  {\r\n    path: '\/about',\r\n    name: 'About',\r\n    \/\/ route level code-splitting\r\n    \/\/ this generates a separate chunk (about.[hash].js) for this route\r\n    \/\/ which is lazy-loaded when the route is visited.\r\n    component: () =&gt; import(\/* webpackChunkName: \"about\" *\/ '..\/views\/About.vue')\r\n  }\r\n]\r\n\r\nconst router = createRouter({\r\n  history: createWebHistory(process.env.BASE_URL),\r\n  routes\r\n})\r\n\r\nexport default router\r\n\r\n<\/code><\/pre>\n<h4>scrollBehavior\u6eda\u52a8\u884c\u4e3a<\/h4>\n<p>vue3.x router\u5f03\u7528\u4e86vue2.x router\u4e2d\u7684 <code>{ selector, x, y, offset }<\/code>\uff0c\u4f7f\u7528<code>{ el, left, top, behavior }<\/code>\u4ee3\u66ff\uff0c\u65b0\u7684api\u8bed\u4e49\u66f4\u63a5\u8fd1\u539f\u751fDOM<\/p>\n<pre><code class=\"language-javascript\" lang=\"javascript\">\/\/ vue2.x router\r\nconst router = new Router({\r\n  base: process.env.BASE_URL,\r\n  mode: 'history',\r\n  scrollBehavior: () =&gt; ({ x: 0, y: 0 }),\r\n  routes\r\n})\r\n\r\n\/\/ vue3.x router\r\nconst router = createRouter({\r\n  history: createWebHistory(process.env.BASE_URL),\r\n  routes,\r\n  scrollBehavior(to, from, savedPosition) {\r\n    \/\/ scroll to id `#app` + 200px, and scroll smoothly (when supported by the browser)\r\n    return {\r\n      el: '#app',\r\n      top: 0,\r\n      left: 0,\r\n      behavior: 'smooth'\r\n    }\r\n  }\r\n})\r\n\r\n<\/code><\/pre>\n<h4>\u8def\u7531\u7ec4\u4ef6\u8df3\u8f6c<\/h4>\n<p>vue2.x\u4f7f\u7528\u8def\u7531\u9009\u9879redirect\u8bbe\u7f6e\u8def\u7531\u81ea\u52a8\u8c03\u6574\uff0cvue3.x\u4e2d\u79fb\u9664\u4e86\u8fd9\u4e2a\u9009\u9879\uff0c\u5c06\u5728\u5b50\u8def\u7531\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u7a7a\u8def\u5f84\u8def\u7531\u6765\u5339\u914d\u8df3\u8f6c<\/p>\n<pre><code class=\"language-javascript\" lang=\"javascript\">\/\/ vue2.x router\r\n[\r\n  {\r\n    path: '\/',\r\n    component: Layout,\r\n    name: 'WebHome',\r\n    meta: { title: '\u5e73\u53f0\u9996\u9875' },\r\n    redirect: '\/dashboard', \/\/ \u8fd9\u91cc\u5199\u8df3\u8f6c\r\n    children: [\r\n      {\r\n        path: 'dashboard',\r\n        name: 'Dashboard',\r\n        meta: { title: '\u5de5\u4f5c\u53f0' },\r\n        component: () =&gt; import('..\/views\/dashboard\/index.vue')\r\n      }\r\n    ]\r\n  }\r\n]\r\n\r\n\/\/ vue3.x router\r\n[\r\n  {\r\n    path: '\/',\r\n    component: Layout,\r\n    name: 'WebHome',\r\n    meta: { title: '\u5e73\u53f0\u9996\u9875' },\r\n    children: [\r\n      { path: '', redirect: 'dashboard' }, \/\/ \u8fd9\u91cc\u5199\u8df3\u8f6c\r\n      {\r\n        path: 'dashboard',\r\n        name: 'Dashboard',\r\n        meta: { title: '\u5de5\u4f5c\u53f0' },\r\n        component: () =&gt; import('..\/views\/dashboard\/index.vue')\r\n      }\r\n    ]\r\n  }\r\n]\r\n<\/code><\/pre>\n<h4>\u6355\u83b7\u6240\u6709\u8def\u7531\uff1a\/:catchAll(.*)<\/h4>\n<p>\u6355\u83b7\u6240\u6709\u8def\u7531 <code>( \/* )<\/code> \u65f6\uff0c\u73b0\u5728\u5fc5\u987b\u4f7f\u7528\u5e26\u6709\u81ea\u5b9a\u4e49\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u53c2\u6570\u8fdb\u884c\u5b9a\u4e49\uff1a<code>\/:catchAll(.*)<\/code><\/p>\n<pre><code class=\"language-javascript\" lang=\"javascript\">\/\/ vue2.x router\r\nconst router = new VueRouter({\r\n  mode: 'history',\r\n  routes: [\r\n    { path: '\/user\/:a*' },\r\n  ]\r\n})\r\n\r\n\/\/ vue3.x router\r\nconst router = createRouter({\r\n  history: createWebHistory(),\r\n  routes: [\r\n    { path: '\/user\/:a:catchAll(.*)', component: component },\r\n  ]\r\n})\r\n\r\n<\/code><\/pre>\n<p>\u5f53\u8def\u7531\u4e3a <code>\/user\/a\/b<\/code> \u65f6\uff0c\u6355\u83b7\u5230\u7684 <code>params<\/code> \u4e3a <code>{\"a\": \"a\", \"catchAll\": \"\/b\"}<\/code><\/p>\n<h4>router.resolve<\/h4>\n<p><code>router.match<\/code> \u4e0e <code>router.resolve<\/code> \u5408\u5e76\u5728\u4e00\u8d77\u4e3a <code>router.resolve<\/code>\uff0c\u4f46\u7b7e\u540d\u7565\u6709\u4e0d\u540c<\/p>\n<pre><code class=\"language-javascript\" lang=\"javascript\">\/\/ vue2.x router\r\n...\r\nresolve ( to: RawLocation, current?: Route, append?: boolean) {\r\n  ...\r\n  return {\r\n    location,\r\n    route,\r\n    href,\r\n    normalizedTo: location,\r\n    resolved: route\r\n  }\r\n}\r\n\r\n\/\/ vue3.x router\r\nfunction resolve(\r\n    rawLocation: Readonly&lt;RouteLocationRaw&gt;,\r\n    currentLocation?: Readonly&lt;RouteLocationNormalizedLoaded&gt;\r\n  ): RouteLocation &amp; { href: string } {\r\n  ...\r\n  let matchedRoute = matcher.resolve(matcherLocation, currentLocation)\r\n  ...\r\n  return {\r\n    fullPath,\r\n    hash,\r\n    query: normalizeQuery(rawLocation.query),\r\n    ...matchedRoute,\r\n    redirectedFrom: undefined,\r\n    href: routerHistory.base + fullPath,\r\n  }\r\n}\r\n\r\n<\/code><\/pre>\n<h4>\u83b7\u53d6\u5f53\u524d\u8def\u7531<\/h4>\n<p>\u5220\u9664 <code>router.getMatchedComponents<\/code>\uff0c\u53ef\u4ee5\u4ece <code>router.currentRoute.value.matched<\/code> \u4e2d\u83b7\u53d6<\/p>\n<blockquote><p>router.getMatchedComponents \u8fd4\u56de\u76ee\u6807\u4f4d\u7f6e\u6216\u662f\u5f53\u524d\u8def\u7531\u5339\u914d\u7684\u7ec4\u4ef6\u6570\u7ec4 (\u662f\u6570\u7ec4\u7684\u5b9a\u4e49\/\u6784\u9020\u7c7b\uff0c\u4e0d\u662f\u5b9e\u4f8b)\u3002\u901a\u5e38\u5728\u670d\u52a1\u7aef\u6e32\u67d3\u7684\u6570\u636e\u9884\u52a0\u8f7d\u65f6\u4f7f\u7528\u3002<\/p><\/blockquote>\n<pre><code class=\"language-javascript\" lang=\"javascript\">[{\r\n  aliasOf: undefined\r\n  beforeEnter: undefined\r\n  children: []\r\n  components: {default: {\u2026}, other: {\u2026}}\r\n  instances: {default: null, other: Proxy}\r\n  leaveGuards: []\r\n  meta: {}\r\n  name: undefined\r\n  path: \"\/\"\r\n  props: \u0192 (to)\r\n  updateGuards: []\r\n}]\r\n\r\n<\/code><\/pre>\n<h4>\u4f7f\u7528<\/h4>\n<p>\u5982\u679c\u4f7f\u7528 &#8220;\uff0c\u5219\u53ef\u80fd\u9700\u8981\u7b49\u5f85 router \u51c6\u5907\u5c31\u7eea\u624d\u80fd\u6302\u8f7d\u5e94\u7528\u7a0b\u5e8f<\/p>\n<pre><code class=\"language-javascript\" lang=\"javascript\">app.use(router)\r\n\/\/ Note: on Server Side, you need to manually push the initial location\r\nrouter.isReady().then(() =&gt; app.mount('#app'))\r\n\r\n<\/code><\/pre>\n<p>\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u6b63\u5e38\u6302\u8f7d\u4e5f\u662f\u53ef\u4ee5\u4f7f\u7528 <code>\u7684\uff0c\u4f46\u662f\u73b0\u5728\u5bfc\u822a\u90fd\u662f\u5f02\u6b65\u7684\uff0c\u5982\u679c\u5728\u8def\u7531\u521d\u59cb\u5316\u65f6\u6709\u8def\u7531\u5b88\u536b\uff0c\u5219\u5728 `resolve` \u4e4b\u524d\u4f1a\u51fa\u73b0\u4e00\u4e2a\u521d\u59cb\u6e32\u67d3\u7684\u8fc7\u6e21\uff0c\u5c31\u50cf\u7ed9<\/code> \u63d0\u4f9b\u4e00\u4e2a <code>appear<\/code> \u4e00\u6837<\/p>\n<h4>\u5728\u670d\u52a1\u7aef\u6e32\u67d3 \uff08SSR\uff09 \u4e2d\uff0c\u9700\u8981\u4f20\u9012\u5408\u9002\u7684 history mode<\/h4>\n<pre><code class=\"language-javascript\" lang=\"javascript\">const history = isServer ? createMemoryHistory() : createWebHistory()\r\nconst router = createRouter({ routes, history })\r\n\/\/ on server only\r\nrouter.push(req.url) \/\/ request url\r\nrouter.isReady().then(() =&gt; {\r\n  \/\/ resolve the request\r\n})\r\n\r\n<\/code><\/pre>\n<h4>push \u6216\u8005 resolve \u4e00\u4e2a\u4e0d\u5b58\u5728\u7684\u547d\u540d\u8def\u7531\u65f6\uff0c\u5c06\u4f1a\u5f15\u53d1\u9519\u8bef\uff0c\u800c\u4e0d\u662f\u5bfc\u822a\u5230\u6839\u8def\u7531 &#8220;\/&#8221; \u5e76\u4e14\u4e0d\u663e\u793a\u4efb\u4f55\u5185\u5bb9<\/h4>\n<p>\u5728 vue2.x router \u4e2d\uff0c\u5f53 push \u4e00\u4e2a\u4e0d\u5b58\u5728\u7684\u547d\u540d\u8def\u7531\u65f6\uff0c\u8def\u7531\u4f1a\u5bfc\u822a\u5230\u6839\u8def\u7531 &#8220;\/&#8221; \u4e0b\uff0c\u5e76\u4e14\u4e0d\u4f1a\u6e32\u67d3\u4efb\u4f55\u5185\u5bb9\u3002\u6d4f\u89c8\u5668\u63a7\u5236\u53f0\u53ea\u4f1a\u6253\u5370\u8b66\u544a\uff0c\u5e76\u4e14 url \u4f1a\u8df3\u8f6c\u5230\u6839\u8def\u7531 \/ \u4e0b\u3002<\/p>\n<pre><code class=\"language-javascript\" lang=\"javascript\">const router = new VueRouter({\r\n  mode: 'history',\r\n  routes: [{ path: '\/', name: 'foo', component: Foo }]\r\n}\r\nthis.$router.push({ name: 'baz' })\r\n\r\n<\/code><\/pre>\n<p>\u5728 vue3.x router \u4e2d\uff0c\u540c\u6837\u505a\u6cd5\u4f1a\u5f15\u53d1\u9519\u8bef\u3002<\/p>\n<pre><code class=\"language-javascript\" lang=\"javascript\">const router = createRouter({\r\n  history: routerHistory(),\r\n  routes: [{ path: '\/', name: 'foo', component: Foo }]\r\n})\r\n...\r\nimport { useRouter } from 'vue-next-router'\r\n...\r\nconst router = userRouter()\r\nrouter.push({ name: 'baz' })) \/\/ \u8fd9\u884c\u4ee3\u7801\u4f1a\u62a5\u9519\r\n\r\n<\/code><\/pre>\n<h4>\u83b7\u53d6\u8def\u7531<\/h4>\n<p>\u7f51\u4e0a\u4e00\u4e9b\u6559\u7a0b\u4f1a\u544a\u8bc9\u4f60\u901a\u8fc7<code>ctx<\/code>\u8bbf\u95ee<code>router<\/code>\u548c<code>store<\/code>\u5bf9\u8c61\uff0c\u4f46\u662f\u5176\u5b9e\u8fd9\u79cd\u65b9\u5f0f\u53ea\u80fd\u5728<code>develement<\/code>\u6a21\u5f0f\u6709\u6548\uff0c\u5728<code>production<\/code>\u73af\u5883\u7f16\u8bd1\u540e\uff0cctx\u5728<code>develement<\/code>\u4e0b\u770b\u5230\u7684\u5c5e\u6027\u90fd\u65e0\u6cd5\u8bbf\u95ee\uff0c\u5bb9\u6613\u8bef\u5bfc\u5927\u5bb6<\/p>\n<p><strong>\u9519\u8bef\u793a\u4f8b:<\/strong><\/p>\n<pre><code class=\"language-javascript\" lang=\"javascript\">import { getCurrentInstance } from 'vue'\r\n\r\nexport default {\r\n  setup () {\r\n    const { ctx } = getCurrentInstance()\r\n    console.log(ctx)\r\n    console.log(ctx.$router.currentRoute.value)\r\n    const userId = computed(() =&gt; ctx.$store.state.app.userId)\r\n    return {\r\n      userId\r\n    }\r\n  }\r\n}\r\n<\/code><\/pre>\n<p><strong>\u6b63\u786e\u4f7f\u7528:<\/strong><\/p>\n<pre><code class=\"language-javascript\" lang=\"javascript\">import { getCurrentInstance } from 'vue'\r\nimport { useRouter, useRoute } from 'vue-router'\r\nimport { useStore } from 'vuex'\r\n\r\nexport default {\r\n  setup () {\r\n    const { ctx } = getCurrentInstance()\r\n    console.log(ctx)\r\n    const router = useRouter()\r\n    const route = useRoute()\r\n    const store = userStore()\r\n    console.log(router, route, store)\r\n    console.log(router.currentRoute.value)\r\n    const userId = computed(() =&gt; store.state.app.userId)\r\n    return {\r\n      userId\r\n    }\r\n  }\r\n}\r\n\r\n<\/code><\/pre>\n<h3>2\u3001<a href=\"mailto:vuex@4.x\">vuex@4.x<\/a><\/h3>\n<p>vuex4.x\u5f88\u5c11breaking change\uff0c\u6574\u4f53\u6539\u52a8\u8f83\u5c11<\/p>\n<h4>\u521b\u5efa\u5b9e\u4f8b<\/h4>\n<pre><code class=\"language-javascript\" lang=\"javascript\">\/\/ vue2.x vuex\r\nimport Vue from 'vue'\r\nimport Vuex from 'vuex'\r\n\r\nVue.use(Vuex)\r\n\r\nexport default new Vuex.Store({\r\n  state: {},\r\n  mutations: {},\r\n  actions: {},\r\n  getters: {},\r\n  modules: {}\r\n}\r\n\r\n\/\/ vue3.x vuex\r\nimport Vuex from 'vuex'\r\n\r\nexport default Vuex.createStore({\r\n  state: {},\r\n  mutations: {},\r\n  actions: {},\r\n  getters: {},\r\n  modules: {}\r\n})\r\n<\/code><\/pre>\n<h4>\u83b7\u53d6store<\/h4>\n<pre><code class=\"language-javascript\" lang=\"javascript\">\/\/ vue3.x vuex\r\nimport { getCurrentInstance } from 'vue'\r\nimport { useRouter, useRoute } from 'vue-router'\r\nimport { useStore } from 'vuex'\r\n\r\nexport default {\r\n  setup () {\r\n    const { ctx } = getCurrentInstance()\r\n    console.log(ctx)\r\n    const router = useRouter()\r\n    const route = useRoute()\r\n    const store = userStore()\r\n    console.log(router, route, store)\r\n    console.log(router.currentRoute.value)\r\n    const userId = computed(() =&gt; store.state.app.userId)\r\n    return {\r\n      userId\r\n    }\r\n  }\r\n}\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u7cfb\u5217\u6587\u7ae0\u76ee\u5f55 Vue3.0\u5168\u5bb6\u6876\u6700\u5168\u5165\u95e8\u6307\u5357 &#8211; \u5feb\u901f\u642d\u5efa (1\/4) Vue3.0\u5168\u5bb6\u6876\u6700\u5168\u5165 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[106,105],"tags":[],"_links":{"self":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/3086"}],"collection":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3086"}],"version-history":[{"count":1,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/3086\/revisions"}],"predecessor-version":[{"id":3087,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/3086\/revisions\/3087"}],"wp:attachment":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3086"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3086"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}