{"id":34194,"date":"2024-11-25T14:28:49","date_gmt":"2024-11-25T06:28:49","guid":{"rendered":"https:\/\/fwq.ai\/blog\/34194\/"},"modified":"2024-11-25T14:28:49","modified_gmt":"2024-11-25T06:28:49","slug":"%e5%88%a9%e7%94%a8taro-vue3%e5%a6%82%e4%bd%95%e5%bc%80%e5%8f%91%e5%b0%8f%e7%a8%8b%e5%ba%8f%ef%bc%9f%ef%bc%88%e5%ae%9e%e8%b7%b5%ef%bc%89","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/34194\/","title":{"rendered":"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09"},"content":{"rendered":"<p>\u5982\u4f55\u4f7f\u7528 taro3 + vue3 \u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\u4e0b\u9762\u672c\u7bc7\u6587\u7ae0\u7ed9\u5927\u5bb6\u4ecb\u7ecd\u4e00\u4e0b\u4f7f\u7528 taro3 + vue3 \u5f00\u53d1\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7684\u65b9\u6cd5\uff0c\u5e0c\u671b\u5bf9\u5927\u5bb6\u6709\u6240\u5e2e\u52a9\uff01<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/000\/024\/61df8e16504b4952.jpg\" class=\"aligncenter\" title=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe\" alt=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe\" \/><\/p>\n<p>\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u662f\u4ee5\u5fae\u4fe1\u4e3a\u8fd0\u884c\u73af\u5883\u7684\u4e00\u79cd\u5e94\u7528\uff0c\u5176\u5b9e\u8d28\u662f Hybrid \u6280\u672f\u7684\u5e94\u7528\uff0cHybrid App \u5373\u6df7\u5408\u6a21\u5f0f\u79fb\u52a8\u5e94\u7528\uff0c\u56e0\u6b64\u4e0e H5 \u7c7b\u4f3c\uff0c\u4f46\u53c8\u6bd4 H5 \u62e5\u6709\u5f88\u591a\u539f\u751f\u7684\u80fd\u529b\uff0c\u4f8b\u5982\u8c03\u7528\u4f4d\u7f6e\u4fe1\u606f\u548c\u6444\u50cf\u5934\u7b49\u3002<\/p>\n<p>\u5c0f\u7a0b\u5e8f\u7684\u5f00\u53d1\u65b9\u5f0f\u4e0e H5 \u5341\u5206\u76f8\u4f3c\uff0c\u7528\u7684\u4e5f\u662f &nbsp;JavaScript\u3001HTML\u3001CSS&nbsp; \u8bed\u8a00\u3002<\/p>\n<p>\u56e0\u6b64\uff0c\u5c0f\u7a0b\u5e8f\u5f00\u53d1\u53ef\u4ee5\u8bf4\u662f\u4e00\u540d\u524d\u7aef\u5de5\u7a0b\u5e08\u5fc5\u987b\u8981\u638c\u63e1\u7684\u6280\u80fd\u3002<\/p>\n<p><span>\u7acb\u5373\u5b66\u4e60<\/span>\u201c\u201d\uff1b<\/p>\n<p>\u539f\u751f\u5c0f\u7a0b\u5e8f\u5f00\u53d1\u6709\u4e00\u5b9a\u7684\u5b66\u4e60\u6210\u672c\uff0c\u73b0\u5982\u4eca\u5e02\u9762\u4e0a\u6709\u5f88\u591a\u5f00\u53d1\u5c0f\u7a0b\u5e8f\u7684\u7b2c\u4e09\u65b9\u591a\u7aef\u6846\u67b6\uff0c\u5982\u679c\u4e0d\u662f\u8ffd\u6c42\u6781\u81f4\u6027\u80fd\u548c\u7a33\u5b9a\uff0c\u8fd8\u662f\u4e0d\u8981\u7528\u539f\u751f\u5c0f\u7a0b\u5e8f\u5f00\u53d1\u4e86\uff0c\u5f00\u53d1\u6548\u7387\u592a\u4f4e\u3002<\/p>\n<p>\u7b2c\u4e09\u65b9\u591a\u7aef\u6846\u67b6\u4e2d\uff0ctaro \u548c uni-app \u7684\u4f7f\u7528\u5ea6\u662f\u6700\u5e7f\u7684\uff0c\u4e00\u822c\u6765\u8bf4\uff0c\u505a\u6280\u672f\u9009\u578b\u65f6\uff0c\u56e2\u961f\u7528 react\uff0c\u5c31\u7528 taro\uff0c\u56e2\u961f\u7528 vue\uff0c\u5c31\u7528 uni-app\uff0c\u4e24\u8005\u4e4b\u95f4\u6ca1\u6709\u4ec0\u4e48\u4f18\u52a3\u4e4b\u5206\uff0c\u90fd\u633a\u597d\u7528\u7684\u3002<\/p>\n<p>\u4f46\u5f88\u591a\u5f00\u53d1\u8005\u53ef\u80fd\u4e0d\u77e5\u9053\uff0ctaro3.0 \u4ee5\u4e0a\u7248\u672c\u662f\u652f\u6301\u4f7f\u7528 vue \u7684\uff0c\u672c\u7bc7\u6587\u7ae0\u5c31\u6765\u4ecb\u7ecd\u4e00\u4e0b\u5982\u4f55\u4f7f\u7528 Taro3 + Vue3 \u5f00\u53d1\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u3002<\/p>\n<p>\u6211\u6839\u636e\u7f51\u4e0a\u7684\u8d44\u6599\u5b8c\u6210\u4e86\u672c\u9879\u76ee\u7684\u642d\u5efa\u4e4b\u540e\uff0c\u7528\u672c\u9879\u76ee\u5f00\u53d1\u8fc7\u4e00\u4e2a\u5c0f\u7a0b\u5e8f\uff0c\u90a3\u79cd\u5f00\u53d1\u4f53\u9a8c\u771f\u7684\u662f\u8d85\u8d8a\u4e86\u6211\u4ee5\u5f80\u5f00\u53d1\u8fc7\u7684\u6240\u6709\u9879\u76ee\uff0c\u975e\u5e38\u4e1d\u6ed1\uff08\u53ef\u80fd\u662f\u6211\u7b2c\u4e00\u6b21\u5199 vue3 \u7684 script setup \u5427\uff0c\u7528\u8d77\u6765\u786e\u5b9e\u5f88\u8212\u670d\uff09\u3002<\/p>\n<p>\u53ef\u76f4\u63a5\u8bbf\u95ee\u672c\u9879\u76ee  clone \u4f7f\u7528\u3002<\/p>\n<h2>\u76ee\u6807\u529f\u80fd<\/h2>\n<ul>\n<li>\u96c6\u6210 vue3\uff0c\u4f7f\u7528 script setup \u8bed\u6cd5\u5f00\u53d1<\/li>\n<li>\u96c6\u6210 Typescript<\/li>\n<li>\u4ee3\u7801\u68c0\u67e5\u548c\u683c\u5f0f\u4f18\u5316<\/li>\n<li>\u5168\u5c40\u72b6\u6001\u7ba1\u7406<\/li>\n<li>\u5c0f\u7a0b\u5e8f\u5206\u5305\u914d\u7f6e<\/li>\n<li>\u6837\u5f0f\u5c01\u88c5\uff0c\u517c\u5bb9\u5218\u6d77\u513f\u5c4f\u7b49\u6837\u5f0f\u95ee\u9898<\/li>\n<li>http \u65b9\u6cd5\u5c01\u88c5<\/li>\n<\/ul>\n<h2>\u4e3b\u8981\u6280\u672f\u6808<\/h2>\n<ul>\n<li>Taro3<\/li>\n<li>Vue3<\/li>\n<li>TypeScript<\/li>\n<li>NutUi<\/li>\n<li>Pinia<\/li>\n<\/ul>\n<p>vue3 \u521a\u53d1\u5e03\u65f6\uff0c\u7531\u4e8e\u6ca1\u6709\u5408\u9002\u7684 ui \u6846\u67b6\u652f\u6301\uff0c\u6211\u5b66\u4e60 vue3 \u7684\u70ed\u60c5\u76f4\u63a5\u88ab\u529d\u9000\u4e86\u3002\u76f4\u5230\u73b0\u5728\uff0c\u7c7b\u4f3c\u4e8e\u3001\u3001 \u7b49\u4f18\u79c0\u6846\u67b6\u9646\u7eed\u652f\u6301 vue3\uff0c\u5e76\u4e14\u8bb8\u591a vue3 \u9879\u76ee\u88ab\u7528\u5230\u4e86\u751f\u4ea7\u73af\u5883\u4e2d\uff0c\u624d\u53d1\u73b0\u5927\u5bb6\u662f\u628a vue3 \u771f\u7684\u7528\u8d77\u6765\u4e86\u3002<\/p>\n<p>\u6bd4\u5982\u6211\u4eec\u516c\u53f8\u9694\u58c1\u9879\u76ee\u7ec4\uff0c\u91cd\u6784\u9879\u76ee\u5c31\u7528\u4e86 vue3\uff0c\u8fd9\u65f6\u6211\u624d\u53d1\u73b0\u81ea\u5df1\u5b66\u4e60 vue3 \u6709\u70b9\u665a\u4e86\uff08tips:\u524d\u7aef\u771f\u7684\u592a\u5377\u4e86\uff09<\/p>\n<p> \u662f\u4eac\u4e1c\u98ce\u683c\u7684\u79fb\u52a8\u7aef\u7ec4\u4ef6\u5e93\uff0c\u5b83\u652f\u6301\u4f7f\u7528 Vue \u8bed\u8a00\u6765\u7f16\u5199\u53ef\u4ee5\u5728 H5\uff0c\u5c0f\u7a0b\u5e8f\u5e73\u53f0\u4e0a\u7684\u5e94\u7528\uff0c\u5e2e\u52a9\u7814\u53d1\u4eba\u5458\u63d0\u5347\u5f00\u53d1\u6548\u7387\uff0c\u6539\u5584\u5f00\u53d1\u4f53\u9a8c\u3002<\/p>\n<p>\u6211\u662f\u4ece  \u77e5\u9053 NutUI \u7684\uff0ctaro \u5b98\u65b9\u63a8\u8350\u4f7f\u7528 NutUI \u5f00\u53d1\uff0c\u4ed6\u4eec\u4f3c\u4e4e\u4e5f\u90fd\u662f\u6765\u81ea\u4eac\u4e1c\u540c\u4e00\u4e2a\u5f00\u53d1\u56e2\u961f\uff0c\u6211\u62b1\u7740\u8bd5\u4e00\u8bd5\u7684\u5fc3\u6001\u4e0a\u624b\u4f7f\u7528\uff0c\u4f7f\u7528\u4f53\u9a8c\u8fd8\u4e0d\u9519\u3002<\/p>\n<p> \u662f\u4e00\u4e2a\u7528\u4e8e Vue \u7684\u72b6\u6001\u7ba1\u7406\u5e93\uff0c\u7c7b\u4f3c Vuex, \u662f Vue \u7684\u53e6\u4e00\u79cd\u72b6\u6001\u7ba1\u7406\u65b9\u6848\uff0c\u652f\u6301 Vue2 \u548c Vue3\u3002<\/p>\n<p>\u6211\u7b2c\u4e00\u6b21\u63a5\u89e6\u524d\u7aef\u72b6\u6001\u7ba1\u7406\u5de5\u5177\uff0c\u662f\u521a\u5b9e\u4e60\u65f6\u516c\u53f8\u7684\u4e00\u4e2a\u540e\u53f0\u7ba1\u7406\u7cfb\u7edf\uff0c\u7528\u7684 dva\uff0c\u90a3\u53ef\u53eb\u4e00\u4e2a\u6298\u78e8\u554a\uff0c\u5dee\u70b9\u76f4\u63a5\u628a\u6211\u529d\u9000\u3002\u540e\u9762\u6162\u6162\u719f\u6089\u4e86\u4e00\u4e9b\uff0c\u4f46\u662f\u4e0d\u7ba1\u7528 redux\uff0c\u8fd8\u662f vuex\uff0c\u8fd8\u662f\u89c9\u5f97\u5199\u7740\u9ebb\u70e6\u3002<\/p>\n<p>\u8fd9\u6b21\u5c1d\u8bd5\u4f7f\u7528 Pinia\uff0c\u7528\u8d77\u6765\u786e\u5b9e\u5f88\u8212\u670d\uff0c\u7b26\u5408\u76f4\u89c9\uff0c\u6613\u4e8e\u5b66\u4e60 \uff0c\u6709\u70b9\u7c7b\u4f3c\u4e8e \uff0c\u4f46\u6ca1\u6709 recoil \u90a3\u4e48\u591a\u7684\u6982\u5ff5\u548c API\uff0c\u4e3b\u4f53\u975e\u5e38\u7cbe\u7b80\uff0c\u6781\u6613\u4e0a\u624b\u3002<\/p>\n<h2>vscode \u9700\u5b89\u88c5\u63d2\u4ef6<\/h2>\n<ul>\n<li>Eslint<\/li>\n<li>Prettier<\/li>\n<li>Volar<\/li>\n<\/ul>\n<p>\u4e0evetur\u76f8\u540c\uff0cvolar\u662f\u4e00\u4e2a\u9488\u5bf9 vue \u7684 vscode \u63d2\u4ef6\uff0c\u4e0d\u8fc7\u4e0e vetur \u4e0d\u540c\u7684\u662f\uff0cvolar \u63d0\u4f9b\u4e86\u66f4\u4e3a\u5f3a\u5927\u7684\u529f\u80fd\u3002<\/p>\n<\/p>\n<h2>\u642d\u5efa\u9879\u76ee\u67b6\u6784<\/h2>\n<h3>\u521d\u59cb\u5316\u9879\u76ee<\/h3>\n<p>\u521d\u59cb\u5316\u9879\u76ee\u4e4b\u524d\uff0c\u9700\u5b89\u88c5 taro\uff0c\u8bf7\u53c2\u8003 \uff0c\u5b8c\u6210 taro \u5b89\u88c5<\/p>\n<p>\u4f7f\u7528\u547d\u4ee4\u521b\u5efa\u6a21\u677f\u9879\u76ee\uff1a<\/p>\n<pre>taro&nbsp;init&nbsp;myApp<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/image\/713\/413\/643\/1642039320184785.png\" class=\"aligncenter\" title=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe1\" alt=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe1\" \/><\/p>\n<p>\u5b89\u88c5 cli \u7528\u6765\u6267\u884c\u6784\u5efa\u7b49\u64cd\u4f5c\uff0c\u4e4b\u540e\u542f\u52a8\u9879\u76ee\uff0c\u4f1a\u751f\u6210\u4e00\u4e2a dist \u76ee\u5f55<\/p>\n<pre>yarn&nbsp;add&nbsp;@tarojs\/cli\nyarn&nbsp;dev:weapp<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<blockquote><p>\n  \u6253\u5f00\u5fae\u4fe1\u5f00\u53d1\u5de5\u5177 \u5de5\u7a0b\u76ee\u5f55\u9700\u8981\u6307\u5411\u6784\u5efa\u51fa\u6765\u7684 dist \u6587\u4ef6\n<\/p><\/blockquote>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/image\/939\/125\/843\/1642039334383976.png\" class=\"aligncenter\" title=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe2\" alt=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe2\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/image\/209\/393\/295\/1642039338767003.png\" class=\"aligncenter\" title=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe3\" alt=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe3\" \/><\/p>\n<p>Hello world \u51fa\u73b0\uff0c\u9879\u76ee\u6210\u529f\u8dd1\u8d77\u6765\u4e86\uff01<\/p>\n<h3>\u8bbe\u7f6e\u4ee3\u7801\u89c4\u8303<\/h3>\n<ul>\n<li>\u4ee3\u7801\u89c4\u8303 ESlint<\/li>\n<li>\u4ee3\u7801\u683c\u5f0f\u5316 Prettier<\/li>\n<li>\u63d0\u4ea4\u524d\u68c0\u67e5 husky<\/li>\n<\/ul>\n<p>\u4e2a\u4eba\u8ba4\u4e3a\uff0ceslint + prettier \u8db3\u4ee5\u5e94\u4ed8\u5927\u90e8\u5206\u524d\u7aef\u4ee3\u7801\u89c4\u8303\u95ee\u9898\u4e86\uff0c\u4e14\u914d\u7f6e\u8d77\u6765\u5f88\u7b80\u5355\uff0c\u6709\u7279\u6b8a\u9700\u6c42\u4e5f\u53ef\u7ee7\u7eed\u914d\u7f6e\u3002<\/p>\n<p>\u5b89\u88c5\u4f9d\u8d56<\/p>\n<pre>yarn&nbsp;add&nbsp;@vue\/eslint-config-prettier&nbsp;@vue\/eslint-config-typescript&nbsp;eslint-plugin-prettier&nbsp;vue-tsc&nbsp;husky&nbsp;-D<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u8bbe\u7f6e\u4ee3\u7801\u89c4\u8303\u548c\u683c\u5f0f\u5316\u89c4\u5219<\/p>\n<p>.eslintrc.js<\/p>\n<pre>module.exports&nbsp;=&nbsp;{\n&nbsp;&nbsp;root:&nbsp;true,\n\n&nbsp;&nbsp;env:&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;node:&nbsp;true,\n&nbsp;&nbsp;&nbsp;&nbsp;'vue\/setup-compiler-macros':&nbsp;true\n&nbsp;&nbsp;},\n\n&nbsp;&nbsp;extends:&nbsp;['plugin:vue\/vue3-essential',&nbsp;'eslint:recommended',&nbsp;'@vue\/prettier',&nbsp;'@vue\/typescript'],\n\n&nbsp;&nbsp;parserOptions:&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;parser:&nbsp;'@typescript-eslint\/parser'\n&nbsp;&nbsp;},\n\n&nbsp;&nbsp;rules:&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;'prettier\/prettier':&nbsp;[\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'error',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;singleQuote:&nbsp;true,\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;semi:&nbsp;false,\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trailingComma:&nbsp;'none',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrowParens:&nbsp;'avoid',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printWidth:&nbsp;100\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;],\n&nbsp;&nbsp;&nbsp;&nbsp;'no-console':&nbsp;process.env.NODE_ENV&nbsp;===&nbsp;'production'&nbsp;?&nbsp;'warn'&nbsp;:&nbsp;'off',\n&nbsp;&nbsp;&nbsp;&nbsp;'no-debugger':&nbsp;process.env.NODE_ENV&nbsp;===&nbsp;'production'&nbsp;?&nbsp;'warn'&nbsp;:&nbsp;'off'\n&nbsp;&nbsp;}\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>.prettierrc<\/p>\n<pre>{\n&nbsp;&nbsp;\"tabWidth\":&nbsp;2,\n&nbsp;&nbsp;\"singleQuote\":&nbsp;true,\n&nbsp;&nbsp;\"semi\":&nbsp;false,\n&nbsp;&nbsp;\"trailingComma\":&nbsp;\"none\",\n&nbsp;&nbsp;\"arrowParens\":&nbsp;\"avoid\",\n&nbsp;&nbsp;\"endOfLine\":&nbsp;\"auto\",\n&nbsp;&nbsp;\"printWidth\":&nbsp;100\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u5728 package.json \u4e2d script \u6dfb\u52a0 Ts \u68c0\u67e5\u547d\u4ee4\u548c Eslint \u68c0\u67e5\u547d\u4ee4<\/p>\n<pre>\"scripts\":{\n&nbsp;&nbsp;\"tsc\":&nbsp;\"vue-tsc&nbsp;--noEmit&nbsp;--skipLibCheck\",\n&nbsp;&nbsp;\"lint\":&nbsp;\"eslint&nbsp;--ext&nbsp;.vue&nbsp;--ext&nbsp;.js&nbsp;--ext&nbsp;.ts&nbsp;src\/\"\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u6dfb\u52a0  \u89e6\u53d1 Git \u94a9\u5b50\uff0c\u4ee3\u7801\u63d0\u4ea4\u524d\u68c0\u67e5<\/p>\n<pre>npx&nbsp;husky&nbsp;install<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u7f16\u8f91 pre-commit \u6267\u884c Eslint \u68c0\u67e5\u548c Ts \u68c0\u67e5<\/p>\n<pre>#!\/bin\/sh\n.&nbsp;\"$(dirname&nbsp;\"$0\")\/_\/husky.sh\"\n\necho&nbsp;\"---eslint&nbsp;start---\"\nnpm&nbsp;run&nbsp;lint\necho&nbsp;\"---eslint&nbsp;end---\"\n\necho&nbsp;\"---ts&nbsp;lint&nbsp;start---\"\nnpm&nbsp;run&nbsp;tsc\necho&nbsp;\"---ts&nbsp;lint&nbsp;end---\"<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u81f3\u6b64\uff0c\u9879\u76ee\u7684\u4ee3\u7801\u89c4\u8303\u548c\u683c\u5f0f\u89c4\u8303\u914d\u7f6e\u5b8c\u6bd5\uff0c\u591a\u4eba\u534f\u4f5c\u4e5f\u4e0d\u662f\u95ee\u9898\u4e86\u3002<\/p>\n<h3>\u5f15\u5165 NutUI<\/h3>\n<pre>yarn&nbsp;add&nbsp;@nutui\/nutui-taro<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u5728&nbsp;.babelrc&nbsp;\u6216&nbsp;babel.config.js&nbsp;\u4e2d\u6dfb\u52a0\u914d\u7f6e\uff1a<\/p>\n<pre>module.exports&nbsp;=&nbsp;{\n&nbsp;&nbsp;\/\/&nbsp;...\n&nbsp;&nbsp;plugins:&nbsp;[\n&nbsp;&nbsp;&nbsp;&nbsp;[\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'import',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libraryName:&nbsp;'@nutui\/nutui',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libraryDirectory:&nbsp;'dist\/packages\/_es',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;camel2DashComponentName:&nbsp;false\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'nutui3-vue'\n&nbsp;&nbsp;&nbsp;&nbsp;],\n&nbsp;&nbsp;&nbsp;&nbsp;[\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'import',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libraryName:&nbsp;'@nutui\/nutui-taro',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libraryDirectory:&nbsp;'dist\/packages\/_es',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;camel2DashComponentName:&nbsp;false\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'nutui3-taro'\n&nbsp;&nbsp;&nbsp;&nbsp;]\n&nbsp;&nbsp;]\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u6309\u9700\u5f15\u5165\uff0c\u5b89\u88c5\u63d2\u4ef6 babel-plugin-import<\/p>\n<pre>yarn&nbsp;add&nbsp;babel-plugin-import&nbsp;-D<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u6837\u5f0f\u5904\u7406 \u56e0\u4e3a nutui \u7684\u8bbe\u8ba1\u7a3f\u662f 375 \u7684 \u6240\u4ee5\u5c06\u6846\u67b6\u7684\u8bbe\u8ba1\u5c3a\u5bf8\u8c03\u6574\u4e3a 375<\/p>\n<p>\u9879\u76ee\u914d\u7f6e\u6587\u4ef6 config\/index.js \u4e2d\u914d\u7f6e:<\/p>\n<pre>designWidth:&nbsp;375<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>app.ts<\/p>\n<pre>import&nbsp;{&nbsp;createApp&nbsp;}&nbsp;from&nbsp;'vue'\nimport&nbsp;{&nbsp;Button&nbsp;}&nbsp;from&nbsp;'@nutui\/nutui-taro'\n\nconst&nbsp;app&nbsp;=&nbsp;createApp()\n\napp.use(Button)<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>index.vue \u4e2d\uff0cnut-button \u7ec4\u4ef6\u76f4\u63a5\u5728 template \u4e2d\u5199\uff0c\u4e0d\u7528\u518d\u5f15\u5165<\/p>\n<pre>&lt;template&gt;\n&nbsp;&nbsp;&lt;view&gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;text&gt;{{&nbsp;msg&nbsp;}}&lt;\/text&gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;nut-button&gt;\u4e3b\u8981\u6309\u94ae&lt;\/nut-button&gt;\n&nbsp;&nbsp;&lt;\/view&gt;&lt;\/template&gt;<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/image\/907\/561\/512\/1642039347587878.png\" class=\"aligncenter\" title=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe4\" alt=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe4\" \/><\/p>\n<p>\u8bf4\u5b9e\u8bdd\uff0c\u914d\u7f6e\u8d77\u6765\u8fd8\u662f\u6709\u70b9\u9ebb\u70e6\uff0c\u4e0d\u8fc7\u6309\u7167\u5b98\u7f51\u6587\u6863\u8bf4\u660e\u6765\u914d\u4e5f\u6ca1\u6709\u8e29\u5751\uff0c\u8fd8\u884c\u3002<\/p>\n<h3>\u5c0f\u7a0b\u5e8f\u5206\u5305\u914d\u7f6e<\/h3>\n<p>\u5c0f\u7a0b\u5e8f\u4e3b\u5305\u8d85\u8fc7 2M\uff0c\u5c31\u65e0\u6cd5\u771f\u673a\u9884\u89c8\u4e86\uff0c\u4e3a\u4e86\u63d0\u524d\u505a\u597d\u51c6\u5907\u5728\u4e00\u5f00\u59cb\u5c31\u8fdb\u884c\u5206\u5305\u5904\u7406\u3002\u6bd4\u5982\u4e0b\u9762\u8fd9\u4e2a\u5c0f\u7a0b\u5e8f\u7684\u914d\u7f6e\uff0c\u5206\u4e86\u56db\u4e2a\u5305\u3002<\/p>\n<p>app.config.ts<\/p>\n<pre>pages:&nbsp;['pages\/create\/index',&nbsp;'pages\/find\/index',&nbsp;'pages\/my\/index'],\nsubpackages:&nbsp;[\n{\n&nbsp;&nbsp;root:&nbsp;'pages\/featureA',\n&nbsp;&nbsp;pages:&nbsp;['index\/index']\n},\n{\n&nbsp;&nbsp;root:&nbsp;'pagesSub\/search',\n&nbsp;&nbsp;pages:&nbsp;['index']\n},\n{\n&nbsp;&nbsp;root:&nbsp;'pagesSub\/my',\n&nbsp;&nbsp;pages:&nbsp;['detail\/index',&nbsp;'about\/index']\n},\n{\n&nbsp;&nbsp;root:&nbsp;'pagesSub\/book',\n&nbsp;&nbsp;pages:&nbsp;['detail\/index',&nbsp;'person\/list\/index',&nbsp;'person\/detail\/index']\n}\n],<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u53ef\u4ee5\u5728\u5c0f\u7a0b\u5e8f\u5f00\u53d1\u5de5\u5177\u7f16\u8f91\u5668\u91cc\u7684\u4ee3\u7801\u4f9d\u8d56\u5206\u6790\uff0c\u67e5\u770b\u4e3b\u5305\u548c\u5206\u5305\u7684\u5927\u5c0f<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/image\/210\/501\/509\/1642039353927092.png\" class=\"aligncenter\" title=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe5\" alt=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe5\" \/><\/p>\n<h3>\u4f7f\u7528 script setup \u8bed\u6cd5\u5c01\u88c5\u5c0f\u7a0b\u5e8f\u9875\u9762\u751f\u547d\u5468\u671f\u65b9\u6cd5<\/h3>\n<p>hooks\/life.ts<\/p>\n<pre>import&nbsp;{&nbsp;getCurrentInstance&nbsp;}&nbsp;from&nbsp;'@tarojs\/taro'\nimport&nbsp;{&nbsp;onMounted&nbsp;}&nbsp;from&nbsp;'vue'\n\nconst&nbsp;Current&nbsp;=&nbsp;getCurrentInstance()\n\nexport&nbsp;function&nbsp;useDidShow(callback)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;onMounted(callback)&nbsp;Current?.page?.onShow&nbsp;&amp;amp;&amp;amp;&nbsp;(Current.page.onShow&nbsp;=&nbsp;callback)\n}\nexport&nbsp;function&nbsp;usePullDownRefresh(callback)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;Current?.page?.onPullDownRefresh&nbsp;&amp;amp;&amp;amp;&nbsp;(Current.page.onPullDownRefresh&nbsp;=&nbsp;callback)\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u4f7f\u7528<\/p>\n<pre>import&nbsp;{&nbsp;useDidShow&nbsp;}&nbsp;from&nbsp;'@\/hooks\/life'\n\nuseDidShow(()&nbsp;=&amp;gt;&nbsp;{\n&nbsp;&nbsp;\/\/&nbsp;console.log('onShow')\n})<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<h3>\u5b89\u88c5  \u8fdb\u884c\u72b6\u6001\u7ba1\u7406<\/h3>\n<pre>yarn&nbsp;add&nbsp;pinia\nyarn&nbsp;add&nbsp;taro-plugin-pinia<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u9879\u76ee\u914d\u7f6e\u6587\u4ef6 config\/index.js \u4e2d\u914d\u7f6e:<\/p>\n<pre>plugins:&nbsp;['taro-plugin-pinia']<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u4ee5\u7ba1\u7406\u7528\u6237\u4fe1\u606f\u548c\u7528\u6237\u767b\u5f55\u72b6\u6001\u4e3a\u4f8b\uff0c\u5b9e\u73b0\u4e00\u4e2a\u7528\u6237\u767b\u5f55\u529f\u80fd<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/image\/404\/712\/523\/1642039360155751.png\" class=\"aligncenter\" title=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe6\" alt=\"\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u63d2\u56fe6\" \/><\/p>\n<p>\u9700\u8981\u5904\u7406\u7684\u6587\u4ef6\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<p>stores\/auth.ts<\/p>\n<pre>import&nbsp;{&nbsp;defineStore&nbsp;}&nbsp;from&nbsp;'pinia'\n\ninterface&nbsp;UserInfoProp&nbsp;{\n&nbsp;&nbsp;nickName:&nbsp;string\n&nbsp;&nbsp;avatarUrl:&nbsp;string\n}\n\nconst&nbsp;useAuth&nbsp;=&nbsp;defineStore({\n&nbsp;&nbsp;id:&nbsp;'authInfo',\n&nbsp;&nbsp;state:&nbsp;()&nbsp;=&amp;gt;&nbsp;({\n&nbsp;&nbsp;&nbsp;&nbsp;userInfo:&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nickName:&nbsp;'',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avatarUrl:&nbsp;''\n&nbsp;&nbsp;&nbsp;&nbsp;},\n&nbsp;&nbsp;&nbsp;&nbsp;isLogin:&nbsp;false\n&nbsp;&nbsp;}),\n&nbsp;&nbsp;actions:&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;login()&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.isLogin&nbsp;=&nbsp;true\n&nbsp;&nbsp;&nbsp;&nbsp;},\n&nbsp;&nbsp;&nbsp;&nbsp;logout()&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.isLogin&nbsp;=&nbsp;false\n&nbsp;&nbsp;&nbsp;&nbsp;},\n&nbsp;&nbsp;&nbsp;&nbsp;setUserInfo(userInfo:&nbsp;UserInfoProp)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.userInfo&nbsp;=&nbsp;userInfo\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;}\n})\nexport&nbsp;{&nbsp;useAuth&nbsp;}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>stores\/index.ts<\/p>\n<pre>import&nbsp;{&nbsp;createPinia&nbsp;}&nbsp;from&nbsp;'pinia'\nimport&nbsp;{&nbsp;useAuth&nbsp;}&nbsp;from&nbsp;'.\/auth'\n\nexport&nbsp;const&nbsp;store&nbsp;=&nbsp;createPinia()\n\nconst&nbsp;storeObj&nbsp;=&nbsp;{\n&nbsp;&nbsp;auth:&nbsp;useAuth\n}\n\n\/\/&nbsp;\u5c01\u88c5\u6210useStore\u7684\u5f62\u5f0f\uff0c\u8fd9\u6837\u4e00\u770b\u5f15\u7528\u5c31\u77e5\u9053\u662fstore\u7684\u6570\u636e\nexport&nbsp;function&nbsp;useStore(key:&nbsp;string)&nbsp;{\n&nbsp;&nbsp;return&nbsp;storeObj[key]()\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u4e2a\u4eba\u4e2d\u5fc3 index.vue<\/p>\n<pre>&lt;template&gt;\n&nbsp;&nbsp;&lt;main&gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;user-info&gt;&lt;\/user-info&gt;\n&nbsp;&nbsp;&lt;\/main&gt;\n&nbsp;&nbsp;&lt;main&gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;nut-button&gt;\u5fae\u4fe1\u4e00\u952e\u767b\u5f55&lt;\/nut-button&gt;\n&nbsp;&nbsp;&lt;\/main&gt;&lt;\/template&gt;&lt;script&gt;\nimport Taro from &#039;@tarojs\/taro&#039;\nimport { computed } from &#039;vue&#039;\nimport { useStore } from &#039;@\/stores&#039;\n\nimport UserInfo from &#039;.\/userInfo.vue&#039;\n\nconst auth = useStore(&#039;auth&#039;)\nconst isLogin = computed(() =&gt; auth.isLogin)\n\nconst handleLogin = () =&gt; {\n  setTimeout(() =&gt; {\n    \/\/ \u6a21\u62df\u540e\u7aef\u8bf7\u6c42\u5f97\u5230token\u548cuserInfo\n    Taro.setStorageSync(&#039;token&#039;, &#039;xxxx&#039;)\n    auth.setUserInfo({\n      nickName: &#039;\u6797&#039;,\n      avatarUrl:\n        &#039;https:\/\/img12.360buyimg.com\/imagetools\/jfs\/t1\/143702\/31\/16654\/116794\/5fc6f541Edebf8a57\/4138097748889987.png&#039;\n    })\n    auth.login()\n  }, 500)\n}\n&lt;\/script&gt;<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>userInfo \u7ec4\u4ef6<\/p>\n<pre>&lt;template&gt;\n&nbsp;&nbsp;&lt;article&gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;nut-avatar&gt;&lt;\/nut-avatar&gt;\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;span&gt;{{&nbsp;userInfo.nickName&nbsp;}}&lt;\/span&gt;\n&nbsp;&nbsp;&lt;\/article&gt;&lt;\/template&gt;&lt;script&gt;\nimport Taro from &#039;@tarojs\/taro&#039;\nimport { computed } from &#039;vue&#039;\nimport { useStore } from &#039;@\/stores&#039;\n\nconst auth = useStore(&#039;auth&#039;)\nconst userInfo = computed(() =&gt; auth.userInfo)\n\n&lt;\/script&gt;<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u603b\u7684\u6765\u8bf4\uff0c pinia \u5199\u8d77\u6765\u662f\u975e\u5e38\u7b80\u6d01\u7684\uff0c\u8fd9\u79cd\u7c7b react hooks \u7684\u5199\u6cd5\uff0c\u6211\u662f\u975e\u5e38\u559c\u6b22\u7684<\/p>\n<h3>\u8bf7\u6c42\u65b9\u6cd5\u5c01\u88c5<\/h3>\n<p>http.ts<\/p>\n<pre>\/\/&nbsp;\u5c01\u88c5axios\u7684\u8bf7\u6c42\uff0c\u8fd4\u56de\u91cd\u65b0\u5c01\u88c5\u7684\u6570\u636e\u683c\u5f0f\n\/\/&nbsp;\u5bf9\u9519\u8bef\u7684\u7edf\u4e00\u5904\u7406\nimport&nbsp;{&nbsp;HttpResponse&nbsp;}&nbsp;from&nbsp;'@\/common\/interface'\nimport&nbsp;Taro&nbsp;from&nbsp;'@tarojs\/taro'\nimport&nbsp;publicConfig&nbsp;from&nbsp;'@\/config\/index'\nimport&nbsp;axios,&nbsp;{\n&nbsp;&nbsp;AxiosInstance,\n&nbsp;&nbsp;AxiosRequestConfig,\n&nbsp;&nbsp;AxiosResponse,\n&nbsp;&nbsp;Canceler\n}&nbsp;from&nbsp;'axios-miniprogram'\nimport&nbsp;errorHandle&nbsp;from&nbsp;'..\/common\/errorHandle'\nconst&nbsp;CancelToken&nbsp;=&nbsp;axios.CancelToken\n\nclass&nbsp;HttpRequest&nbsp;{\n&nbsp;&nbsp;private&nbsp;baseUrl:&nbsp;string\n&nbsp;&nbsp;private&nbsp;pending:&nbsp;Record&lt;string&gt;\n\n&nbsp;&nbsp;constructor(baseUrl:&nbsp;string)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;this.baseUrl&nbsp;=&nbsp;baseUrl\n&nbsp;&nbsp;&nbsp;&nbsp;this.pending&nbsp;=&nbsp;{}\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;\/\/&nbsp;\u83b7\u53d6axios\u914d\u7f6e\n&nbsp;&nbsp;getInsideConfig()&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;config&nbsp;=&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baseURL:&nbsp;this.baseUrl,\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headers:&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Content-Type':&nbsp;'application\/json;charset=utf-8'\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout:&nbsp;10000\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;config\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;removePending(key:&nbsp;string,&nbsp;isRequest&nbsp;=&nbsp;false)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.pending[key]&nbsp;&amp;amp;&amp;amp;&nbsp;isRequest)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.pending[key]('\u53d6\u6d88\u91cd\u590d\u8bf7\u6c42')\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;this.pending[key]\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;\/\/&nbsp;\u8bbe\u5b9a\u62e6\u622a\u5668\n&nbsp;&nbsp;interceptors(instance:&nbsp;AxiosInstance)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;instance.interceptors.request.use(\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config&nbsp;=&amp;gt;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log('config&nbsp;:&amp;gt;&amp;gt;&nbsp;',&nbsp;config)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;isPublic&nbsp;=&nbsp;false\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;publicConfig.publicPath.map(path&nbsp;=&amp;gt;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isPublic&nbsp;=&nbsp;isPublic&nbsp;||&nbsp;path.test(config.url&nbsp;||&nbsp;'')\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;token&nbsp;=&nbsp;Taro.getStorageSync('token')\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!isPublic&nbsp;&amp;amp;&amp;amp;&nbsp;token)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config.headers.Authorization&nbsp;=&nbsp;'Bearer&nbsp;'&nbsp;+&nbsp;token\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;key&nbsp;=&nbsp;config.url&nbsp;+&nbsp;'&amp;amp;'&nbsp;+&nbsp;config.method\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.removePending(key,&nbsp;true)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config.cancelToken&nbsp;=&nbsp;new&nbsp;CancelToken(c&nbsp;=&amp;gt;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.pending[key]&nbsp;=&nbsp;c\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;config\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;=&amp;gt;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorHandle(err)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Promise.reject(err)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;)\n\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u54cd\u5e94\u8bf7\u6c42\u7684\u62e6\u622a\u5668\n&nbsp;&nbsp;&nbsp;&nbsp;instance.interceptors.response.use(\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;=&amp;gt;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;key&nbsp;=&nbsp;res.config.url&nbsp;+&nbsp;'&amp;amp;'&nbsp;+&nbsp;res.config.method\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.removePending(key)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(res.status&nbsp;===&nbsp;200)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Promise.resolve(res.data)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Promise.reject(res)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;=&amp;gt;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorHandle(err)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Promise.reject(err)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;)\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;\/\/&nbsp;\u521b\u5efa\u5b9e\u4f8b\n&nbsp;&nbsp;request(options:&nbsp;AxiosRequestConfig)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;instance&nbsp;=&nbsp;axios.create()\n&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;newOptions&nbsp;=&nbsp;Object.assign(this.getInsideConfig(),&nbsp;options)\n&nbsp;&nbsp;&nbsp;&nbsp;this.interceptors(instance)\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;instance(newOptions)\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;get(url:&nbsp;string,&nbsp;config?:&nbsp;AxiosRequestConfig):&nbsp;Promise&lt;axiosresponse&gt;&nbsp;|&nbsp;Promise&lt;httpresponse&gt;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;options&nbsp;=&nbsp;Object.assign(\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method:&nbsp;'get',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;url\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config\n&nbsp;&nbsp;&nbsp;&nbsp;)\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.request(options)\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;post(url:&nbsp;string,&nbsp;data?:&nbsp;unknown):&nbsp;Promise&lt;axiosresponse&gt;&nbsp;|&nbsp;Promise&lt;httpresponse&gt;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.request({\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method:&nbsp;'post',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;url,\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;data\n&nbsp;&nbsp;&nbsp;&nbsp;})\n&nbsp;&nbsp;}\n}\n\nexport&nbsp;default&nbsp;HttpRequest&lt;\/httpresponse&gt;&lt;\/axiosresponse&gt;&lt;\/httpresponse&gt;&lt;\/axiosresponse&gt;&lt;\/string&gt;<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>request.ts<\/p>\n<pre>import&nbsp;HttpRequest&nbsp;from&nbsp;'.\/http'\nimport&nbsp;config&nbsp;from&nbsp;'@\/config\/index'\nconst&nbsp;baseUrl&nbsp;=&nbsp;process.env.NODE_ENV&nbsp;===&nbsp;'development'&nbsp;?&nbsp;config.baseUrl.dev&nbsp;:&nbsp;config.baseUrl.pro\n\nconst&nbsp;request&nbsp;=&nbsp;new&nbsp;HttpRequest(baseUrl)\n\nexport&nbsp;default&nbsp;request<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u4ee5\u83b7\u53d6\u56fe\u4e66\u5217\u8868\u548c\u56fe\u4e66\u8be6\u60c5\u4e3a\u4f8b<\/p>\n<p>apis\/book.ts<\/p>\n<pre>import&nbsp;request&nbsp;from&nbsp;'..\/request'\n\nexport&nbsp;function&nbsp;getBookList()&nbsp;{\n&nbsp;&nbsp;return&nbsp;request.get('books\/getBookList')\n}\n\nexport&nbsp;function&nbsp;getBookDetail(id:&nbsp;number)&nbsp;{\n&nbsp;&nbsp;return&nbsp;request.post('books\/getBookDetail',&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;id\n&nbsp;&nbsp;})\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u8bf7\u6c42\u65b9\u6cd5\u5c01\u88c5\u8fd8\u662f\u7528\u5230\u4e86 axios\uff0c\u53ea\u662f\u7528\u7684\u662f axios-miniprogram \uff0c\u5199\u6cd5\u548c web \u7aef\u57fa\u672c\u4e00\u81f4\uff0chttp.js \u6587\u4ef6\u5f15\u7528\u7684\u4e00\u4e9b\u6a21\u5757\u592a\u591a\uff0c\u672c\u6587\u6ca1\u6709\u5217\u51fa\u6765\uff0c\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u672c\u9879\u76ee github \u5730\u5740\u67e5\u770b\u3002<\/p>\n<h3>\u6837\u5f0f\u5c01\u88c5<\/h3>\n<p>iPhoneX \u5e95\u90e8\u6a2a\u7ebf\u9002\u914d<\/p>\n<p>assets\/styles\/common.scss<\/p>\n<pre>.safe-area-bottom&nbsp;{\n&nbsp;&nbsp;padding-bottom:&nbsp;constant(safe-area-inset-bottom);\n&nbsp;&nbsp;padding-bottom:&nbsp;env(safe-area-inset-bottom);\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u5218\u6d77\u513f\u5c4f\u9002\u914d<\/p>\n<p>assets\/styles\/hairline.scss<\/p>\n<pre>@mixin&nbsp;hairline-common()&nbsp;{\n&nbsp;&nbsp;position:&nbsp;absolute;\n&nbsp;&nbsp;box-sizing:&nbsp;border-box;\n&nbsp;&nbsp;content:&nbsp;'&nbsp;';\n&nbsp;&nbsp;pointer-events:&nbsp;none;\n}\n\n@mixin&nbsp;hairline()&nbsp;{\n&nbsp;&nbsp;@include&nbsp;hairline-common();\n&nbsp;&nbsp;top:&nbsp;-50%;\n&nbsp;&nbsp;right:&nbsp;-50%;\n&nbsp;&nbsp;bottom:&nbsp;-50%;\n&nbsp;&nbsp;left:&nbsp;-50%;\n&nbsp;&nbsp;border:&nbsp;0&nbsp;solid&nbsp;#eaeaea;\n&nbsp;&nbsp;transform:&nbsp;scale(0.5);\n}\n\n@mixin&nbsp;hairline-top($color,&nbsp;$left:&nbsp;0,&nbsp;$right:&nbsp;0)&nbsp;{\n&nbsp;&nbsp;@include&nbsp;hairline-common();\n&nbsp;&nbsp;top:&nbsp;0;\n&nbsp;&nbsp;right:&nbsp;$right;\n&nbsp;&nbsp;left:&nbsp;$left;\n&nbsp;&nbsp;border-top:&nbsp;1px&nbsp;solid&nbsp;$color;\n&nbsp;&nbsp;transform:&nbsp;scaleY(0.5);\n}\n\n@mixin&nbsp;hairline-bottom($color,&nbsp;$left:&nbsp;0,&nbsp;$right:&nbsp;0)&nbsp;{\n&nbsp;&nbsp;@include&nbsp;hairline-common();\n&nbsp;&nbsp;right:&nbsp;$right;\n&nbsp;&nbsp;bottom:&nbsp;0;\n&nbsp;&nbsp;left:&nbsp;$left;\n&nbsp;&nbsp;border-bottom:&nbsp;1px&nbsp;solid&nbsp;$color;\n&nbsp;&nbsp;transform:&nbsp;scaleY(0.5);\n}\n\n[class*='van-hairline']&nbsp;{\n&nbsp;&nbsp;&amp;amp;::after&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;@include&nbsp;hairline();\n&nbsp;&nbsp;}\n}\n\n.van-hairline&nbsp;{\n&nbsp;&nbsp;&amp;amp;,\n&nbsp;&nbsp;&amp;amp;--top,\n&nbsp;&nbsp;&amp;amp;--left,\n&nbsp;&nbsp;&amp;amp;--right,\n&nbsp;&nbsp;&amp;amp;--bottom,\n&nbsp;&nbsp;&amp;amp;--surround,\n&nbsp;&nbsp;&amp;amp;--top-bottom&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;position:&nbsp;relative;\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;&amp;amp;--top::after&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;border-top-width:&nbsp;1px;\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;&amp;amp;--left::after&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;border-left-width:&nbsp;1px;\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;&amp;amp;--right::after&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;border-right-width:&nbsp;1px;\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;&amp;amp;--bottom::after&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;border-bottom-width:&nbsp;1px;\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;&amp;amp;,\n&nbsp;&nbsp;&amp;amp;-unset&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&amp;amp;--top-bottom::after&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-width:&nbsp;1px&nbsp;0;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;}\n\n&nbsp;&nbsp;&amp;amp;--surround::after&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;border-width:&nbsp;1px;\n&nbsp;&nbsp;}\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u591a\u884c\u6587\u5b57\u7701\u7565<\/p>\n<p>assets\/styles\/ellipsis.scss<\/p>\n<pre>@mixin&nbsp;multi-ellipsis($lines)&nbsp;{\n&nbsp;&nbsp;display:&nbsp;-webkit-box;\n&nbsp;&nbsp;overflow:&nbsp;hidden;\n&nbsp;&nbsp;text-overflow:&nbsp;ellipsis;\n&nbsp;&nbsp;-webkit-line-clamp:&nbsp;$lines;\n&nbsp;&nbsp;-webkit-box-orient:&nbsp;vertical;\n}\n\n@mixin&nbsp;ellipsis()&nbsp;{\n&nbsp;&nbsp;overflow:&nbsp;hidden;\n&nbsp;&nbsp;white-space:&nbsp;nowrap;\n&nbsp;&nbsp;text-overflow:&nbsp;ellipsis;\n}\n\n.ellipsis&nbsp;{\n&nbsp;&nbsp;@include&nbsp;ellipsis();\n}\n\n.multi-ellipsis--l2&nbsp;{\n&nbsp;&nbsp;@include&nbsp;multi-ellipsis(2);\n}\n\n.multi-ellipsis--l3&nbsp;{\n&nbsp;&nbsp;@include&nbsp;multi-ellipsis(3);\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<h2>\u603b\u7ed3<\/h2>\n<p>\u81f3\u6b64\uff0c\u7ec8\u4e8e\u5b8c\u6210\u4e86 Taro + Vue3 \u7684\u9879\u76ee\u642d\u5efa\uff0c\u5f3a\u70c8\u5efa\u8bae\u76f4\u63a5\u8bbf\u95ee\u9879\u76ee  clone \u4f7f\u7528\uff0c\u6709\u4e00\u4e9b\u914d\u7f6e\u7ec6\u8282\u672c\u6587\u65e0\u6cd5\u4e00\u4e00\u5217\u4e3e\uff0c\u5c31\u5728\u9879\u76ee\u4e2d\u53bb\u53d1\u6398\u5427\uff01<\/p>\n<p>\u5982\u679c\u6211\u7684\u6587\u7ae0\u80fd\u5e2e\u52a9\u5230\u4f60\uff0c\u90a3\u5c06\u662f\u6211\u7684\u8363\u5e78\uff01<\/p>\n<p>\u3010\u76f8\u5173\u5b66\u4e60\u63a8\u8350\uff1a\u3011<\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u5229\u7528Taro + Vue3\u5982\u4f55\u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\uff08\u5b9e\u8df5\uff09\u7684\u8be6\u7ec6\u5185\u5bb9\uff0c\u66f4\u591a\u8bf7\u5173\u6ce8\u7c73\u4e91\u5176\u5b83\u76f8\u5173\u6587\u7ae0\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5982\u4f55\u4f7f\u7528 taro3 + vue3 \u5f00\u53d1\u5c0f\u7a0b\u5e8f\uff1f\u4e0b\u9762\u672c\u7bc7\u6587\u7ae0\u7ed9\u5927\u5bb6\u4ecb\u7ecd\u4e00\u4e0b\u4f7f\u7528 taro3 + vue3 \u5f00\u53d1\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7684\u65b9\u6cd5\uff0c\u5e0c\u671b\u5bf9\u5927\u5bb6\u6709\u6240\u5e2e\u52a9\uff01 \u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u662f\u4ee5\u5fae\u4fe1\u4e3a\u8fd0\u884c\u73af\u5883\u7684\u4e00\u79cd\u5e94\u7528\uff0c\u5176\u5b9e\u8d28\u662f Hybrid \u6280\u672f\u7684\u5e94\u7528\uff0cHybrid App \u5373\u6df7\u5408\u6a21\u5f0f\u79fb\u52a8\u5e94\u7528\uff0c\u56e0\u6b64\u4e0e H5 \u7c7b\u4f3c\uff0c\u4f46\u53c8\u6bd4 H5 \u62e5\u6709\u5f88\u591a\u539f\u751f\u7684\u80fd\u529b\uff0c\u4f8b\u5982\u8c03\u7528\u4f4d\u7f6e\u4fe1\u606f\u548c\u6444\u50cf\u5934\u7b49\u3002 \u5c0f\u7a0b\u5e8f\u7684\u5f00\u53d1\u65b9\u5f0f\u4e0e H5 \u5341\u5206\u76f8\u4f3c\uff0c\u7528\u7684\u4e5f\u662f &nbsp;JavaScript\u3001HTML\u3001CSS&nbsp; \u8bed\u8a00\u3002 \u56e0\u6b64\uff0c\u5c0f\u7a0b\u5e8f\u5f00\u53d1\u53ef\u4ee5\u8bf4\u662f\u4e00\u540d\u524d\u7aef\u5de5\u7a0b\u5e08\u5fc5\u987b\u8981\u638c\u63e1\u7684\u6280\u80fd\u3002 \u7acb\u5373\u5b66\u4e60\u201c\u201d\uff1b \u539f\u751f\u5c0f\u7a0b\u5e8f\u5f00\u53d1\u6709\u4e00\u5b9a\u7684\u5b66\u4e60\u6210\u672c\uff0c\u73b0\u5982\u4eca\u5e02\u9762\u4e0a\u6709\u5f88\u591a\u5f00\u53d1\u5c0f\u7a0b\u5e8f\u7684\u7b2c\u4e09\u65b9\u591a\u7aef\u6846\u67b6\uff0c\u5982\u679c\u4e0d\u662f\u8ffd\u6c42\u6781\u81f4\u6027\u80fd\u548c\u7a33\u5b9a\uff0c\u8fd8\u662f\u4e0d\u8981\u7528\u539f\u751f\u5c0f\u7a0b\u5e8f\u5f00\u53d1\u4e86\uff0c\u5f00\u53d1\u6548\u7387\u592a\u4f4e\u3002 \u7b2c\u4e09\u65b9\u591a\u7aef\u6846\u67b6\u4e2d\uff0ctaro \u548c uni-app \u7684\u4f7f\u7528\u5ea6\u662f\u6700\u5e7f\u7684\uff0c\u4e00\u822c\u6765\u8bf4\uff0c\u505a\u6280\u672f\u9009\u578b\u65f6\uff0c\u56e2\u961f\u7528 react\uff0c\u5c31\u7528 taro\uff0c\u56e2\u961f\u7528 vue\uff0c\u5c31\u7528 uni-app\uff0c\u4e24\u8005\u4e4b\u95f4\u6ca1\u6709\u4ec0\u4e48\u4f18\u52a3\u4e4b\u5206\uff0c\u90fd\u633a\u597d\u7528\u7684\u3002 \u4f46\u5f88\u591a\u5f00\u53d1\u8005\u53ef\u80fd\u4e0d\u77e5\u9053\uff0ctaro3.0 \u4ee5\u4e0a\u7248\u672c\u662f\u652f\u6301\u4f7f\u7528 vue \u7684\uff0c\u672c\u7bc7\u6587\u7ae0\u5c31\u6765\u4ecb\u7ecd\u4e00\u4e0b\u5982\u4f55\u4f7f\u7528 Taro3 + Vue3 \u5f00\u53d1\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u3002 \u6211\u6839\u636e\u7f51\u4e0a\u7684\u8d44\u6599\u5b8c\u6210\u4e86\u672c\u9879\u76ee\u7684\u642d\u5efa\u4e4b\u540e\uff0c\u7528\u672c\u9879\u76ee\u5f00\u53d1\u8fc7\u4e00\u4e2a\u5c0f\u7a0b\u5e8f\uff0c\u90a3\u79cd\u5f00\u53d1\u4f53\u9a8c\u771f\u7684\u662f\u8d85\u8d8a\u4e86\u6211\u4ee5\u5f80\u5f00\u53d1\u8fc7\u7684\u6240\u6709\u9879\u76ee\uff0c\u975e\u5e38\u4e1d\u6ed1\uff08\u53ef\u80fd\u662f\u6211\u7b2c\u4e00\u6b21\u5199 vue3 \u7684 script setup \u5427\uff0c\u7528\u8d77\u6765\u786e\u5b9e\u5f88\u8212\u670d\uff09\u3002 \u53ef\u76f4\u63a5\u8bbf\u95ee\u672c\u9879\u76ee clone \u4f7f\u7528\u3002 \u76ee\u6807\u529f\u80fd \u96c6\u6210 vue3\uff0c\u4f7f\u7528 script [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-34194","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/34194","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=34194"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/34194\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=34194"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=34194"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=34194"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}