{"id":48113,"date":"2023-07-20T15:33:29","date_gmt":"2023-07-26T05:04:09","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/"},"modified":"2024-04-30T14:28:17","modified_gmt":"2024-04-30T06:28:17","slug":"%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/","title":{"rendered":"\u5c1d\u8bd5\u5b8c\u6210 AWS Amplify \u7684 React \u6559\u7a0b"},"content":{"rendered":"<h1>\u9996\u5148\/\u8d77\u521d<\/h1>\n<p>\u6211\u5728AWS Amplify\u627e\u5230\u4e86\u4e00\u4e2a\u7b80\u5355\u7684\u6559\u7a0b\uff0c\u6240\u4ee5\u6211\u5c1d\u8bd5\u505a\u4e86\u4e00\u4e0b\u3002<br \/>\n\u6211\u4eec\u5c06\u4f7f\u7528React + Amplify + AppSync + DynamoDB\u521b\u5efa\u4e00\u4e2a\u65e0\u670d\u52a1\u5668\u7684ToDo\u5e94\u7528\u7a0b\u5e8f\u3002<br \/>\n\u94fe\u63a5\uff1ahttps:\/\/docs.amplify.aws\/start\/q\/integration\/react\/<\/p>\n<h1>AWS Amplify\u662f\u4ec0\u4e48\uff1f<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8374913a08637a6b372a\/3-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2021-11-30 8.33.06.png\" \/><\/div>\n<h1>\u7528AWS Amplify\u5c1d\u8bd5\u521b\u5efa\u4e00\u4e2aToDo\u5e94\u7528<\/h1>\n<h2>\u524d\u63d0\u6761\u4ef6<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Node.js v12.x\u4ee5\u964d<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">NPM V5.x \u4ee5\u964d<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">git v2.14.1\u4ee5\u964d<\/ul>\n<h2>\u5b89\u88c5\u5e76\u8bbe\u7f6eamplify\/cli\u3002<\/h2>\n<p>\u5b89\u88c5amplify\/cli<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">sudo <\/span>npm <span class=\"nb\">install<\/span> <span class=\"nt\">-g<\/span> @aws-amplify\/cli\r\n<\/code><\/pre>\n<p>\u653e\u5927\/amplify\/cli\u5de5\u5177\u7684\u5b89\u88c5\u8bbe\u7f6e<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>amplify configure\r\nFollow these steps to <span class=\"nb\">set <\/span>up access to your AWS account:\r\n\r\nSign <span class=\"k\">in <\/span>to your AWS administrator account:\r\nhttps:\/\/console.aws.amazon.com\/\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8374913a08637a6b372a\/12-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2021-11-29 20.45.30.png\" \/><\/div>\n<p>\u5728\u767b\u5f55AWS\u63a7\u5236\u53f0\u540e\uff0c\u8fd4\u56de\u7ec8\u7aef\u5e76\u8f93\u5165\u533a\u57df\u548c\u7528\u6237\u540d\uff0c\u5c31\u4f1a\u5728\u6d4f\u89c8\u5668\u4e2d\u663e\u793aAWS\u63a7\u5236\u53f0\u7684IAM\u754c\u9762\u3002<\/p>\n<pre class=\"post-pre\"><code>Press Enter to <span class=\"k\">continue\r\n\r\n<\/span>Specify the AWS Region\r\n? region:  us-east-1\r\nSpecify the username of the new IAM user:\r\n? user name:  amplify-user\r\nComplete the user creation using the AWS console\r\nhttps:\/\/console.aws.amazon.com\/iam\/home?region<span class=\"o\">=<\/span>us-east-1#\/users<span class=\"nv\">$new<\/span>?step<span class=\"o\">=<\/span>final&amp;accessKey&amp;userNames<span class=\"o\">=<\/span>amplify-user&amp;permissionType<span class=\"o\">=<\/span>policies&amp;policies<span class=\"o\">=<\/span>arn:aws:iam::aws:policy%2FAdministratorAccess\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8374913a08637a6b372a\/15-4.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2021-11-29 20.42.29.png\" \/><\/div>\n<p>\u56de\u5230\u7ec8\u7aef\uff0c\u6309\u4e0bEnter\u952e\u3002<br \/>\n\u8f93\u5165\u4e4b\u524d\u5907\u4efd\u7684\u201c\u8bbf\u95ee\u5bc6\u94a5ID\u201d\u548c\u201c\u79d8\u5bc6\u8bbf\u95ee\u5bc6\u94a5\u201d\u3002<\/p>\n<pre class=\"post-pre\"><code>Press Enter to <span class=\"k\">continue\r\n\r\n<\/span>Enter the access key of the newly created user:\r\n? accessKeyId:  <span class=\"k\">********************<\/span>\r\n? secretAccessKey:  <span class=\"k\">****************************************<\/span>\r\nThis would update\/create the AWS Profile <span class=\"k\">in <\/span>your <span class=\"nb\">local <\/span>machine\r\n? Profile Name:  default\r\n\r\nSuccessfully <span class=\"nb\">set <\/span>up the new user.\r\n<\/code><\/pre>\n<h2>2. \u5236\u4f5cReact\u5e94\u7528\u7a0b\u5e8f<\/h2>\n<p>\u521b\u5efaReact\u5e94\u7528\u7a0b\u5e8f\u3002<br \/>\n*\u622a\u81f32021\u5e7411\u670829\u65e5\uff0c\u5c1d\u8bd5\u5b89\u88c5@latest\u7248\u672c\u5931\u8d25\u3002\u8fd9\u4f3c\u4e4e\u4e0e\u6b64\u9519\u8bef\u62a5\u544a\u6709\u5173\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>npx create-react-app@latest react-amplified\r\n~~~\u7701\u7565~~\r\nWe suggest that you begin by typing:\r\n\r\n  <span class=\"nb\">cd <\/span>react-amplified\r\n  npm start\r\n\r\nHappy hacking!\r\n<\/code><\/pre>\n<p>\u5728\u672c\u5730\u68c0\u67e5\u5c4f\u5e55\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>react-amplified\r\n<span class=\"nv\">$ <\/span>npm start\r\n~~\u7701\u7565~~\r\nCompiled successfully!\r\n\r\nYou can now view react-amplified <span class=\"k\">in <\/span>the browser.\r\n\r\n  Local:            http:\/\/localhost:3000\r\n  On Your Network:  http:\/\/192.168.11.6:3000\r\n\r\nNote that the development build is not optimized.\r\nTo create a production build, use npm run build.\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8374913a08637a6b372a\/23-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2021-11-29 21.04.54.png\" \/><\/div>\n<h2>3. \u521d\u59cb\u5316\u540e\u7aef<\/h2>\n<p>\u521d\u59cb\u5316\u540e\u7aef<br \/>\n\u6309\u9ed8\u8ba4\u503c\u6309Enter\u786e\u8ba4<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>amplify init\r\nNote: It is recommended to run this <span class=\"nb\">command <\/span>from the root of your app directory\r\n? Enter a name <span class=\"k\">for <\/span>the project reactamplified\r\nThe following configuration will be applied:\r\n\r\nProject information\r\n| Name: reactamplified\r\n| Environment: dev\r\n| Default editor: Visual Studio Code\r\n| App <span class=\"nb\">type<\/span>: javascript\r\n| Javascript framework: react\r\n| Source Directory Path: src\r\n| Distribution Directory Path: build\r\n| Build Command: npm run-script build\r\n| Start Command: npm run-script start\r\n\r\n? Initialize the project with the above configuration? Yes\r\nUsing default provider  awscloudformation\r\n? Select the authentication method you want to use: AWS profile\r\n\r\nFor more information on AWS Profiles, see:\r\nhttps:\/\/docs.aws.amazon.com\/cli\/latest\/userguide\/cli-configure-profiles.html\r\n\r\n? Please choose the profile you want to use default\r\nAdding backend environment dev to AWS Amplify app: dxleXXXX\r\n~~\u7701\u7565~~\r\nSome next steps:\r\n<span class=\"s2\">\"amplify status\"<\/span> will show you what you<span class=\"s1\">'ve added already and if it'<\/span>s locally configured or deployed\r\n<span class=\"s2\">\"amplify add &lt;category&gt;\"<\/span> will allow you to add features like user login or a backend API\r\n<span class=\"s2\">\"amplify push\"<\/span> will build all your <span class=\"nb\">local <\/span>backend resources and provision it <span class=\"k\">in <\/span>the cloud\r\n<span class=\"s2\">\"amplify console\"<\/span> to open the Amplify Console and view your project status\r\n<span class=\"s2\">\"amplify publish\"<\/span> will build all your <span class=\"nb\">local <\/span>backend and frontend resources <span class=\"o\">(<\/span><span class=\"k\">if <\/span>you have hosting category added<span class=\"o\">)<\/span> and provision it <span class=\"k\">in <\/span>the cloud\r\n\r\nPro tip:\r\nTry <span class=\"s2\">\"amplify add api\"<\/span> to create a backend API and <span class=\"k\">then<\/span> <span class=\"s2\">\"amplify publish\"<\/span> to deploy everything\r\n<\/code><\/pre>\n<h2>\u5b89\u88c5Amplify\u5e93\u3002<\/h2>\n<p>\u5b89\u88c5Amplify\u5e93<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>npm <span class=\"nb\">install <\/span>aws-amplify @aws-amplify\/ui-react@1.x.x\r\n<\/code><\/pre>\n<h2>5. \u8bbe\u5b9a\u524d\u7aef\u754c\u9762<\/h2>\n<p>\u8bf7\u5728 src\/index.js \u6587\u4ef6\u7684\u6700\u540e\u4e00\u4e2a import \u8bed\u53e5\u4e0b\u9762\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">Amplify<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">aws-amplify<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">awsExports<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/aws-exports<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"nx\">Amplify<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsExports<\/span><span class=\"p\">);<\/span>\r\n<\/code><\/pre>\n<p>src\/index.js \u8ffd\u52a0\u8bb0\u5f55\u540e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">ReactDOM<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-dom<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/index.css<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">App<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/App<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">reportWebVitals<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/reportWebVitals<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Amplify<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">aws-amplify<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">awsExports<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/aws-exports<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"nx\">Amplify<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsExports<\/span><span class=\"p\">);<\/span>\r\n<span class=\"nx\">ReactDOM<\/span><span class=\"p\">.<\/span><span class=\"nx\">render<\/span><span class=\"p\">(<\/span>\r\n  <span class=\"o\">&lt;<\/span><span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">StrictMode<\/span><span class=\"o\">&gt;<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">App<\/span> <span class=\"o\">\/&gt;<\/span>\r\n  <span class=\"o\">&lt;<\/span><span class=\"sr\">\/React.StrictMode&gt;<\/span><span class=\"err\">,\r\n<\/span>  <span class=\"nb\">document<\/span><span class=\"p\">.<\/span><span class=\"nx\">getElementById<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">root<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">);<\/span>\r\n\r\n<span class=\"c1\">\/\/ If you want to start measuring performance in your app, pass a function<\/span>\r\n<span class=\"c1\">\/\/ to log results (for example: reportWebVitals(console.log))<\/span>\r\n<span class=\"c1\">\/\/ or send to an analytics endpoint. Learn more: https:\/\/bit.ly\/CRA-vitals<\/span>\r\n<span class=\"nx\">reportWebVitals<\/span><span class=\"p\">();<\/span>\r\n<\/code><\/pre>\n<h2>6. \u521b\u5efaGraphQL API\u548c\u6570\u636e\u5e93\u3002<\/h2>\n<p>\u521b\u5efa\u4e00\u4e2aGraphQL API\u548c\u6570\u636e\u5e93\u3002\u4fdd\u6301\u9ed8\u8ba4\u8bbe\u7f6e\u5e76\u9009\u62e9\u4e00\u4e2a\u7f16\u8f91\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>amplify add api\r\n? Select from one of the below mentioned services: GraphQL\r\n? Here is the GraphQL API that we will create. Select a setting to edit or <span class=\"k\">continue <\/span>Continue\r\n? Choose a schema template: Single object with fields <span class=\"o\">(<\/span>e.g., \u201cTodo\u201d with ID, name, description<span class=\"o\">)<\/span>\r\n\r\n\u26a0\ufe0f  WARNING: your GraphQL API currently allows public create, <span class=\"nb\">read<\/span>, update, and delete access to all models via an API Key. To configure PRODUCTION-READY authorization rules, review: https:\/\/docs.amplify.aws\/cli\/graphql\/authorization-rules\r\n\r\nGraphQL schema compiled successfully.\r\n\r\nEdit your schema at \/XXXX\/react-amplified\/amplify\/backend\/api\/reactamplified\/schema.graphql or place .graphql files <span class=\"k\">in <\/span>a directory at \/XXXX\/react-amplified\/amplify\/backend\/api\/reactamplified\/schema\r\n\u2714 Do you want to edit the schema now? <span class=\"o\">(<\/span>Y\/n<span class=\"o\">)<\/span> \u00b7 <span class=\"nb\">yes<\/span>\r\n? Choose your default editor: <span class=\"o\">(<\/span>Use arrow keys<span class=\"o\">)<\/span>\r\n\u276f Visual Studio Code\r\n  Android Studio\r\n  Xcode <span class=\"o\">(<\/span>Mac OS only<span class=\"o\">)<\/span>\r\n  Atom Editor\r\n  Sublime Text\r\n  IntelliJ IDEA\r\n  Vim <span class=\"o\">(<\/span>via Terminal, Mac OS only<span class=\"o\">)<\/span>\r\n<span class=\"o\">(<\/span>Move up and down to reveal more choices<span class=\"o\">)<\/span>\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8374913a08637a6b372a\/38-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2021-11-29 21.28.18.png\" \/><\/div>\n<h2>7. API\u7684\u90e8\u7f72<\/h2>\n<p>\u90e8\u7f72API<\/p>\n<pre class=\"post-pre\"><code>$ amplify push\r\n~~\u7701\u7565~~\r\nGraphQL endpoint: https:\/\/dgsXXXX.appsync-api.us-east-1.amazonaws.com\/graphql\r\nGraphQL API KEY: da2-vkaXXXX\r\n<\/code><\/pre>\n<p>\u786e\u8ba4API\u7684\u72b6\u6001<\/p>\n<pre class=\"post-pre\"><code>$ amplify status\r\n\r\n    Current Environment: dev\r\n\r\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502 Category \u2502 Resource name  \u2502 Operation \u2502 Provider plugin   \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 Api      \u2502 reactamplified \u2502 No Change \u2502 awscloudformation \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n\r\nGraphQL endpoint: https:\/\/dgsXXXX.appsync-api.us-east-1.amazonaws.com\/graphql\r\nGraphQL API KEY: da2-vkaXXXX\r\n<\/code><\/pre>\n<h2>8. \u4ece\u524d\u7aef\u8fde\u63a5\u5230API\u5904<\/h2>\n<p>\u5c06src\/App.js\u66ff\u6362\u4e3a\u4ee5\u4e0b\u5185\u5bb9<\/p>\n<pre class=\"post-pre\"><code><span class=\"cm\">\/* src\/App.js *\/<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">React<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useEffect<\/span><span class=\"p\">,<\/span> <span class=\"nx\">useState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Amplify<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">API<\/span><span class=\"p\">,<\/span> <span class=\"nx\">graphqlOperation<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">aws-amplify<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createTodo<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/graphql\/mutations<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">listTodos<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/graphql\/queries<\/span><span class=\"dl\">'<\/span>\r\n\r\n<span class=\"k\">import<\/span> <span class=\"nx\">awsExports<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/aws-exports<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"nx\">Amplify<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsExports<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">initialState<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">''<\/span><span class=\"p\">,<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">''<\/span> <span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">App<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">formState<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setFormState<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(<\/span><span class=\"nx\">initialState<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">todos<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setTodos<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">([])<\/span>\r\n\r\n  <span class=\"nx\">useEffect<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">fetchTodos<\/span><span class=\"p\">()<\/span>\r\n  <span class=\"p\">},<\/span> <span class=\"p\">[])<\/span>\r\n\r\n  <span class=\"kd\">function<\/span> <span class=\"nx\">setInput<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">value<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">setFormState<\/span><span class=\"p\">({<\/span> <span class=\"p\">...<\/span><span class=\"nx\">formState<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"nx\">key<\/span><span class=\"p\">]:<\/span> <span class=\"nx\">value<\/span> <span class=\"p\">})<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nx\">fetchTodos<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">todoData<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">listTodos<\/span><span class=\"p\">))<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">todos<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">todoData<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">listTodos<\/span><span class=\"p\">.<\/span><span class=\"nx\">items<\/span>\r\n      <span class=\"nx\">setTodos<\/span><span class=\"p\">(<\/span><span class=\"nx\">todos<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">error fetching todos<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nx\">addTodo<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">formState<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span> <span class=\"o\">||<\/span> <span class=\"o\">!<\/span><span class=\"nx\">formState<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">todo<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"p\">...<\/span><span class=\"nx\">formState<\/span> <span class=\"p\">}<\/span>\r\n      <span class=\"nx\">setTodos<\/span><span class=\"p\">([...<\/span><span class=\"nx\">todos<\/span><span class=\"p\">,<\/span> <span class=\"nx\">todo<\/span><span class=\"p\">])<\/span>\r\n      <span class=\"nx\">setFormState<\/span><span class=\"p\">(<\/span><span class=\"nx\">initialState<\/span><span class=\"p\">)<\/span>\r\n      <span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">createTodo<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span><span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"nx\">todo<\/span><span class=\"p\">}))<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">error creating todo:<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">container<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">h2<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">Amplify<\/span> <span class=\"nx\">Todos<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/h2<\/span><span class=\"err\">&gt;\r\n<\/span>      <span class=\"o\">&lt;<\/span><span class=\"nx\">input<\/span>\r\n        <span class=\"nx\">onChange<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">event<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">setInput<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">name<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">target<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">)}<\/span>\r\n        <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">input<\/span><span class=\"p\">}<\/span>\r\n        <span class=\"nx\">value<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">formState<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">}<\/span>\r\n        <span class=\"nx\">placeholder<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Name<\/span><span class=\"dl\">\"<\/span>\r\n      <span class=\"o\">\/&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">input<\/span>\r\n        <span class=\"nx\">onChange<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">event<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">setInput<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">description<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">target<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">)}<\/span>\r\n        <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">input<\/span><span class=\"p\">}<\/span>\r\n        <span class=\"nx\">value<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">formState<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span><span class=\"p\">}<\/span>\r\n        <span class=\"nx\">placeholder<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Description<\/span><span class=\"dl\">\"<\/span>\r\n      <span class=\"o\">\/&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">button<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">button<\/span><span class=\"p\">}<\/span> <span class=\"nx\">onClick<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">addTodo<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">Create<\/span> <span class=\"nx\">Todo<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/button<\/span><span class=\"err\">&gt;\r\n<\/span>      <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">todos<\/span><span class=\"p\">.<\/span><span class=\"nx\">map<\/span><span class=\"p\">((<\/span><span class=\"nx\">todo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">index<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span>\r\n          <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">key<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">todo<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"p\">?<\/span> <span class=\"nx\">todo<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"p\">:<\/span> <span class=\"nx\">index<\/span><span class=\"p\">}<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">todo<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\r\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">p<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">todoName<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">{<\/span><span class=\"nx\">todo<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/p<\/span><span class=\"err\">&gt;\r\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">p<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">todoDescription<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">{<\/span><span class=\"nx\">todo<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/p<\/span><span class=\"err\">&gt;\r\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\r\n<\/span>        <span class=\"p\">))<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\r\n<\/span>  <span class=\"p\">)<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">styles<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">container<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">width<\/span><span class=\"p\">:<\/span> <span class=\"mi\">400<\/span><span class=\"p\">,<\/span> <span class=\"na\">margin<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">0 auto<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">display<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">flex<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">flexDirection<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">column<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">justifyContent<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">center<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">padding<\/span><span class=\"p\">:<\/span> <span class=\"mi\">20<\/span> <span class=\"p\">},<\/span>\r\n  <span class=\"na\">todo<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>  <span class=\"na\">marginBottom<\/span><span class=\"p\">:<\/span> <span class=\"mi\">15<\/span> <span class=\"p\">},<\/span>\r\n  <span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">border<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">none<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">backgroundColor<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">#ddd<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">marginBottom<\/span><span class=\"p\">:<\/span> <span class=\"mi\">10<\/span><span class=\"p\">,<\/span> <span class=\"na\">padding<\/span><span class=\"p\">:<\/span> <span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"na\">fontSize<\/span><span class=\"p\">:<\/span> <span class=\"mi\">18<\/span> <span class=\"p\">},<\/span>\r\n  <span class=\"na\">todoName<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">fontSize<\/span><span class=\"p\">:<\/span> <span class=\"mi\">20<\/span><span class=\"p\">,<\/span> <span class=\"na\">fontWeight<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">bold<\/span><span class=\"dl\">'<\/span> <span class=\"p\">},<\/span>\r\n  <span class=\"na\">todoDescription<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">marginBottom<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">},<\/span>\r\n  <span class=\"na\">button<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">backgroundColor<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">black<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">color<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">white<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">outline<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">none<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">fontSize<\/span><span class=\"p\">:<\/span> <span class=\"mi\">18<\/span><span class=\"p\">,<\/span> <span class=\"na\">padding<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">12px 0px<\/span><span class=\"dl\">'<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">App<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u672c\u5730\u8fdb\u884c\u786e\u8ba4<\/p>\n<pre class=\"post-pre\"><code>$ npm start\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8374913a08637a6b372a\/49-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2021-11-29 21.45.31.png\" \/><\/div>\n<h2>9. \u6dfb\u52a0\u8ba4\u8bc1<\/h2>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u6dfb\u52a0\u8ba4\u8bc1<br \/>\n\u6309Enter<\/p>\n<pre class=\"post-pre\"><code>$ amplify add auth\r\n~~\u7701\u7565~~\r\nSome next steps:\r\n\"amplify push\" will build all your local backend resources and provision it in the cloud\r\n\"amplify publish\" will build all your local backend and frontend resources (if you have hosting category added) and provision it in the cloud\r\n<\/code><\/pre>\n<p>\u90e8\u7f72<\/p>\n<pre class=\"post-pre\"><code>$ amplify push\r\n~~\u7701\u7565~~\r\nAll resources are updated in the cloud\r\n<\/code><\/pre>\n<p>\u786e\u8ba4\u5728amplify\u7684\u72b6\u6001\u4e2d\u5df2\u6dfb\u52a0\u4e86Auth\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>amplify status\r\n~~\u7701\u7565~~\r\n\r\n    Current Environment: dev\r\n\r\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502 Category \u2502 Resource name          \u2502 Operation \u2502 Provider plugin   \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 Api      \u2502 reactamplified         \u2502 No Change \u2502 awscloudformation \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 Auth     \u2502 reactamplified91c68478 \u2502 No Change \u2502 awscloudformation \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n\r\nGraphQL endpoint: https:\/\/dgsXXXX.appsync-api.us-east-1.amazonaws.com\/graphql\r\nGraphQL API KEY: da2-vkaXXXX\r\n<\/code><\/pre>\n<h2>10. \u521b\u5efa\u767b\u5f55\u9875\u9762<\/h2>\n<p>\u4fee\u6539 src\/App.js<\/p>\n<h3>10-1. \u5728import\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">withAuthenticator<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@aws-amplify\/ui-react<\/span><span class=\"dl\">'<\/span>\r\n<\/code><\/pre>\n<h3>\u5c06\u9ed8\u8ba4\u5bfc\u51fa\u9879\u66f4\u6539\u4e3awithAuthenticator\uff0c\u5e76\u5c06\u5176\u5305\u88c5\u5728\u4e3b\u7ec4\u4ef6\u5468\u56f4\u3002<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">withAuthenticator<\/span><span class=\"p\">(<\/span><span class=\"nx\">App<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<h3>10-3. \u4fee\u6b63\u8fc7\u540e\u7684src\/App.js<\/h3>\n<pre class=\"post-pre\"><code><span class=\"cm\">\/* src\/App.js *\/<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">React<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useEffect<\/span><span class=\"p\">,<\/span> <span class=\"nx\">useState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Amplify<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">API<\/span><span class=\"p\">,<\/span> <span class=\"nx\">graphqlOperation<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">aws-amplify<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createTodo<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/graphql\/mutations<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">listTodos<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/graphql\/queries<\/span><span class=\"dl\">'<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">withAuthenticator<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">@aws-amplify\/ui-react<\/span><span class=\"dl\">'<\/span>\r\n\r\n<span class=\"k\">import<\/span> <span class=\"nx\">awsExports<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/aws-exports<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"nx\">Amplify<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsExports<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">initialState<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"dl\">''<\/span><span class=\"p\">,<\/span> <span class=\"na\">description<\/span><span class=\"p\">:<\/span> <span class=\"dl\">''<\/span> <span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">App<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">formState<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setFormState<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">(<\/span><span class=\"nx\">initialState<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">todos<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setTodos<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"p\">([])<\/span>\r\n\r\n  <span class=\"nx\">useEffect<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">fetchTodos<\/span><span class=\"p\">()<\/span>\r\n  <span class=\"p\">},<\/span> <span class=\"p\">[])<\/span>\r\n\r\n  <span class=\"kd\">function<\/span> <span class=\"nx\">setInput<\/span><span class=\"p\">(<\/span><span class=\"nx\">key<\/span><span class=\"p\">,<\/span> <span class=\"nx\">value<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">setFormState<\/span><span class=\"p\">({<\/span> <span class=\"p\">...<\/span><span class=\"nx\">formState<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"nx\">key<\/span><span class=\"p\">]:<\/span> <span class=\"nx\">value<\/span> <span class=\"p\">})<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nx\">fetchTodos<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">todoData<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">listTodos<\/span><span class=\"p\">))<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">todos<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">todoData<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">listTodos<\/span><span class=\"p\">.<\/span><span class=\"nx\">items<\/span>\r\n      <span class=\"nx\">setTodos<\/span><span class=\"p\">(<\/span><span class=\"nx\">todos<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">error fetching todos<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nx\">addTodo<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">formState<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span> <span class=\"o\">||<\/span> <span class=\"o\">!<\/span><span class=\"nx\">formState<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">todo<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"p\">...<\/span><span class=\"nx\">formState<\/span> <span class=\"p\">}<\/span>\r\n      <span class=\"nx\">setTodos<\/span><span class=\"p\">([...<\/span><span class=\"nx\">todos<\/span><span class=\"p\">,<\/span> <span class=\"nx\">todo<\/span><span class=\"p\">])<\/span>\r\n      <span class=\"nx\">setFormState<\/span><span class=\"p\">(<\/span><span class=\"nx\">initialState<\/span><span class=\"p\">)<\/span>\r\n      <span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">createTodo<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span><span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"nx\">todo<\/span><span class=\"p\">}))<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nx\">err<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">error creating todo:<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">err<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">container<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">h2<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">Amplify<\/span> <span class=\"nx\">Todos<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/h2<\/span><span class=\"err\">&gt;\r\n<\/span>      <span class=\"o\">&lt;<\/span><span class=\"nx\">input<\/span>\r\n        <span class=\"nx\">onChange<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">event<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">setInput<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">name<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">target<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">)}<\/span>\r\n        <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">input<\/span><span class=\"p\">}<\/span>\r\n        <span class=\"nx\">value<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">formState<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">}<\/span>\r\n        <span class=\"nx\">placeholder<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Name<\/span><span class=\"dl\">\"<\/span>\r\n      <span class=\"o\">\/&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">input<\/span>\r\n        <span class=\"nx\">onChange<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">event<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">setInput<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">description<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">target<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">)}<\/span>\r\n        <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">input<\/span><span class=\"p\">}<\/span>\r\n        <span class=\"nx\">value<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">formState<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span><span class=\"p\">}<\/span>\r\n        <span class=\"nx\">placeholder<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Description<\/span><span class=\"dl\">\"<\/span>\r\n      <span class=\"o\">\/&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">button<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">button<\/span><span class=\"p\">}<\/span> <span class=\"nx\">onClick<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">addTodo<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">Create<\/span> <span class=\"nx\">Todo<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/button<\/span><span class=\"err\">&gt;\r\n<\/span>      <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">todos<\/span><span class=\"p\">.<\/span><span class=\"nx\">map<\/span><span class=\"p\">((<\/span><span class=\"nx\">todo<\/span><span class=\"p\">,<\/span> <span class=\"nx\">index<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">(<\/span>\r\n          <span class=\"o\">&lt;<\/span><span class=\"nx\">div<\/span> <span class=\"nx\">key<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">todo<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"p\">?<\/span> <span class=\"nx\">todo<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"p\">:<\/span> <span class=\"nx\">index<\/span><span class=\"p\">}<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">todo<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\r\n            <span class=\"o\">&lt;<\/span><span class=\"nx\">p<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">todoName<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">{<\/span><span class=\"nx\">todo<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/p<\/span><span class=\"err\">&gt;\r\n<\/span>            <span class=\"o\">&lt;<\/span><span class=\"nx\">p<\/span> <span class=\"nx\">style<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">styles<\/span><span class=\"p\">.<\/span><span class=\"nx\">todoDescription<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">{<\/span><span class=\"nx\">todo<\/span><span class=\"p\">.<\/span><span class=\"nx\">description<\/span><span class=\"p\">}<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/p<\/span><span class=\"err\">&gt;\r\n<\/span>          <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\r\n<\/span>        <span class=\"p\">))<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/div<\/span><span class=\"err\">&gt;\r\n<\/span>  <span class=\"p\">)<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">styles<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">container<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">width<\/span><span class=\"p\">:<\/span> <span class=\"mi\">400<\/span><span class=\"p\">,<\/span> <span class=\"na\">margin<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">0 auto<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">display<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">flex<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">flexDirection<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">column<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">justifyContent<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">center<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">padding<\/span><span class=\"p\">:<\/span> <span class=\"mi\">20<\/span> <span class=\"p\">},<\/span>\r\n  <span class=\"na\">todo<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>  <span class=\"na\">marginBottom<\/span><span class=\"p\">:<\/span> <span class=\"mi\">15<\/span> <span class=\"p\">},<\/span>\r\n  <span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">border<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">none<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">backgroundColor<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">#ddd<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">marginBottom<\/span><span class=\"p\">:<\/span> <span class=\"mi\">10<\/span><span class=\"p\">,<\/span> <span class=\"na\">padding<\/span><span class=\"p\">:<\/span> <span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"na\">fontSize<\/span><span class=\"p\">:<\/span> <span class=\"mi\">18<\/span> <span class=\"p\">},<\/span>\r\n  <span class=\"na\">todoName<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">fontSize<\/span><span class=\"p\">:<\/span> <span class=\"mi\">20<\/span><span class=\"p\">,<\/span> <span class=\"na\">fontWeight<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">bold<\/span><span class=\"dl\">'<\/span> <span class=\"p\">},<\/span>\r\n  <span class=\"na\">todoDescription<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">marginBottom<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">},<\/span>\r\n  <span class=\"na\">button<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">backgroundColor<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">black<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">color<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">white<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">outline<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">none<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span> <span class=\"na\">fontSize<\/span><span class=\"p\">:<\/span> <span class=\"mi\">18<\/span><span class=\"p\">,<\/span> <span class=\"na\">padding<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">12px 0px<\/span><span class=\"dl\">'<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">withAuthenticator<\/span><span class=\"p\">(<\/span><span class=\"nx\">App<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u672c\u5730\u8fdb\u884c\u786e\u8ba4<\/p>\n<pre class=\"post-pre\"><code>$ npm start\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8374913a08637a6b372a\/67-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2021-11-29 22.01.36.png\" \/><\/div>\n<h2>11. \u90e8\u7f72App\u3002<\/h2>\n<p>\u90e8\u7f72\u5e94\u7528\u7a0b\u5e8f<br \/>\n\u6309\u7167\u9ed8\u8ba4\u8bbe\u7f6e\u76f4\u63a5\u70b9\u51fbEnter<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>amplify add hosting\r\n? Select the plugin module to execute Hosting with Amplify Console <span class=\"o\">(<\/span>Managed hosting with custom domains, Continuous deployment<span class=\"o\">)<\/span>\r\n? Choose a <span class=\"nb\">type <\/span>Manual deployment\r\n\r\nYou can now publish your app using the following <span class=\"nb\">command<\/span>:\r\n\r\nCommand: amplify publish\r\n<\/code><\/pre>\n<h2>12. \u53d1\u5e03\u5e94\u7528\u7a0b\u5e8f<\/h2>\n<p>\u53d1\u5e03\u5e94\u7528\u7a0b\u5e8f<\/p>\n<pre class=\"post-pre\"><code>$ amplify publish\r\n~~\u7701\u7565~~\r\nZipping artifacts completed.\r\nDeployment complete!\r\nhttps:\/\/dev.dxlXXXX.amplifyapp.com\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8374913a08637a6b372a\/74-1.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2021-11-29 22.33.39.png\" \/><\/div>\n<h1>\u653e\u5927\u63a7\u5236\u53f0<\/h1>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8374913a08637a6b372a\/76-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2021-11-30 7.35.40.png\" \/><\/div>\n<h1>\u8d44\u6e90\u6e05\u7406<\/h1>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>amplify delete\r\n<span class=\"nv\">$ <\/span>amplify status\r\n<\/code><\/pre>\n<h1>\u6700\u540e<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Cloudformation\u3067\u30a4\u30f3\u30d5\u30e9\u306e\u30b3\u30fc\u30c9\u3092\u4f5c\u6210\u3059\u308b\u3059\u308b\u306e\u306b\u6bd4\u3079\u3001\u6e96\u5099\u3059\u308b\u30b3\u30fc\u30c9\u91cf\u304c\u5c11\u306a\u304f\u4f7f\u3044\u3084\u3059\u3044\u3068\u611f\u3058\u305f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u8a8d\u8a3c\u5468\u308a\u306a\u3069\u7d30\u304b\u3044\u8a2d\u5b9a\u304c\u3069\u3053\u307e\u3067\u3067\u304d\u308b\u304b\u306f\u307e\u3060\u5206\u304b\u3089\u306a\u3044<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u6b21\u306fAWS Amplify \u3092\u4f7f\u3063\u3066\u7d99\u7d9a\u7684\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u74b0\u5883\u3092\u4f5c\u308d\u3046\u3068\u601d\u3046<\/ul>\n<\/li>\n<\/ul>\n<p>https:\/\/docs.aws.amazon.com\/amplify\/latest\/userguide\/multi-environments.html#standard<\/p>\n<h2>\u8bf7\u6309\u7167\u4e0b\u9762\u7684\u5185\u5bb9\u7b80\u8ff0\u51fa\u4e00\u4efd\u4e2d\u6587\u7684\u540c\u4e49\u53e5\uff1a<\/h2>\n<p>\u6bd4\u8d5b\u5b8c\u6574\u7684\u7ed3\u679c\u53ef\u4ee5\u770b\u4f5c\u662f\u5bf9\u7403\u961f\u5b9e\u529b\u7684\u4e00\u4e2a\u5f88\u597d\u7684\u53c2\u8003\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/docs.amplify.aws\/start\/getting-started\/installation\/q\/integration\/react\/#option-1-watch-the-video-guide<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/github.com\/facebook\/create-react-app\/issues\/10601<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">https:\/\/dev.classmethod.jp\/articles\/react-amplify-appsync-dynamodb-tutorial\/<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">https:\/\/docs.aws.amazon.com\/amplify\/latest\/userguide\/multi-environments.html#standard<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148\/\u8d77\u521d \u6211\u5728AWS Amplify\u627e\u5230\u4e86\u4e00\u4e2a\u7b80\u5355\u7684\u6559\u7a0b\uff0c\u6240\u4ee5\u6211\u5c1d\u8bd5\u505a\u4e86\u4e00\u4e0b\u3002 \u6211\u4eec\u5c06\u4f7f\u7528React + A [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48113","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5c1d\u8bd5\u5b8c\u6210 AWS Amplify \u7684 React \u6559\u7a0b - Blog - Silicon Cloud<\/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:\/\/www.silicloud.com\/zh\/blog\/\u5c1d\u8bd5\u5b8c\u6210-aws-amplify-\u7684-react-\u6559\u7a0b\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5c1d\u8bd5\u5b8c\u6210 AWS Amplify \u7684 React \u6559\u7a0b\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148\/\u8d77\u521d \u6211\u5728AWS Amplify\u627e\u5230\u4e86\u4e00\u4e2a\u7b80\u5355\u7684\u6559\u7a0b\uff0c\u6240\u4ee5\u6211\u5c1d\u8bd5\u505a\u4e86\u4e00\u4e0b\u3002 \u6211\u4eec\u5c06\u4f7f\u7528React + A [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5c1d\u8bd5\u5b8c\u6210-aws-amplify-\u7684-react-\u6559\u7a0b\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-26T05:04:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T06:28:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8374913a08637a6b372a\/3-0.png\" \/>\n<meta name=\"author\" content=\"\u79d1, \u96c5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u96c5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/\",\"name\":\"\u5c1d\u8bd5\u5b8c\u6210 AWS Amplify \u7684 React \u6559\u7a0b - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-07-26T05:04:09+00:00\",\"dateModified\":\"2024-04-30T06:28:17+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5c1d\u8bd5\u5b8c\u6210 AWS Amplify \u7684 React \u6559\u7a0b\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\",\"name\":\"\u79d1, \u96c5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u96c5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5c1d\u8bd5\u5b8c\u6210 AWS Amplify \u7684 React \u6559\u7a0b - Blog - Silicon Cloud","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:\/\/www.silicloud.com\/zh\/blog\/\u5c1d\u8bd5\u5b8c\u6210-aws-amplify-\u7684-react-\u6559\u7a0b\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5c1d\u8bd5\u5b8c\u6210 AWS Amplify \u7684 React \u6559\u7a0b","og_description":"\u9996\u5148\/\u8d77\u521d \u6211\u5728AWS Amplify\u627e\u5230\u4e86\u4e00\u4e2a\u7b80\u5355\u7684\u6559\u7a0b\uff0c\u6240\u4ee5\u6211\u5c1d\u8bd5\u505a\u4e86\u4e00\u4e0b\u3002 \u6211\u4eec\u5c06\u4f7f\u7528React + A [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5c1d\u8bd5\u5b8c\u6210-aws-amplify-\u7684-react-\u6559\u7a0b\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-07-26T05:04:09+00:00","article_modified_time":"2024-04-30T06:28:17+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8374913a08637a6b372a\/3-0.png"}],"author":"\u79d1, \u96c5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u96c5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"8 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/","name":"\u5c1d\u8bd5\u5b8c\u6210 AWS Amplify \u7684 React \u6559\u7a0b - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-07-26T05:04:09+00:00","dateModified":"2024-04-30T06:28:17+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5c1d\u8bd5\u5b8c\u6210 AWS Amplify \u7684 React \u6559\u7a0b"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a","name":"\u79d1, \u96c5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","caption":"\u79d1, \u96c5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%9d%e8%af%95%e5%ae%8c%e6%88%90-aws-amplify-%e7%9a%84-react-%e6%95%99%e7%a8%8b%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48113"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48113\/revisions"}],"predecessor-version":[{"id":92458,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48113\/revisions\/92458"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}