{"id":48116,"date":"2023-01-29T17:28:45","date_gmt":"2024-02-16T13:54:06","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/"},"modified":"2024-04-29T12:06:27","modified_gmt":"2024-04-29T04:06:27","slug":"%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/","title":{"rendered":"\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528"},"content":{"rendered":"<p>\u6211\u5c06\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6765\u6784\u5efa\u5177\u6709\u8eab\u4efd\u9a8c\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528\u7a0b\u5e8f\u7684\u65b9\u6cd5\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8318913a08637a6b2a00\/1-0.gif\" alt=\"ezgif.com-gif-maker.gif\" \/><\/div>\n<p>\u672c\u6587\u4e2d\u6240\u63d0\u5230\u7684\u5e94\u7528\u7a0b\u5e8f\u67b6\u6784\u5982\u4e0b\uff1a<br \/>\n\u6211\u4eec\u5c06\u4f7f\u7528Amplify Console Static Web Site Hosting\u6765\u8fdb\u884c\u524d\u7aef\u4ee3\u7801\u7684\u6258\u7ba1\u3002<br \/>\n\u4f7f\u7528AWS Appsync\u6765\u63d0\u4f9bGraphQL API\uff0c\u5e76\u4f7f\u7528DynamoDB\u4f5c\u4e3a\u6570\u636e\u5e93\u3002<br \/>\n\u6211\u4eec\u5c06\u4f7f\u7528Amazon Cognito\u8fdb\u884c\u7528\u6237\u8ba4\u8bc1\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8318913a08637a6b2a00\/3-0.png\" alt=\"image.png\" \/><\/div>\n<h1>\u7248\u672c<\/h1>\n<p>\u6211\u4f7f\u7528\u7684\u73af\u5883\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre class=\"post-pre\"><code>$ npx create-react-app --version\r\n4.0.3\r\n$ node -v\r\nv14.16.0\r\n$ npm -v\r\n6.14.11\r\n$ amplify -v\r\n4.44.2\r\n<\/code><\/pre>\n<p>\u5982\u679c\u672a\u5b89\u88c5 Amplify CLI \uff0c\u8bf7\u53c2\u8003\u5b98\u65b9\u6587\u6863\u8fdb\u884c\u5b89\u88c5\u3002<\/p>\n<h1>\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f\u7684\u6a21\u677f<\/h1>\n<p>\u4f7f\u7528create-react-app\u6765\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f\u7684\u6a21\u677f\u3002<\/p>\n<pre class=\"post-pre\"><code>$ npx create-react-app chat --template typescript\r\n<\/code><\/pre>\n<p>\u53ea\u8981\u901a\u8fc7\u8fd0\u884c `yarn start`\uff0c\u793a\u4f8b\u5e94\u7528\u7a0b\u5e8f\u80fd\u591f\u542f\u52a8\uff0c\u5c31\u8868\u793a\u6210\u529f\u3002<\/p>\n<pre class=\"post-pre\"><code>$ cd chat\r\n$ yarn start\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8318913a08637a6b2a00\/14-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u63a5\u4e0b\u6765\uff0c\u60a8\u53ef\u4ee5\u901a\u8fc7\u8fd0\u884c&#8221;amplify init&#8221;\u7684\u547d\u4ee4\uff0c\u5411\u60a8\u7684\u9879\u76ee\u4e2d\u6dfb\u52a0\u9002\u7528\u4e8eAmplify\u7684\u914d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code>$ amplify init\r\n? Enter a name for the project chat\r\n? Enter a name for the environment production\r\n? Choose your default editor: Visual Studio Code\r\n? Choose the type of app that you're building javascript\r\n? What javascript framework are you using 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? Do you want to use an AWS profile? Yes\r\n? Please choose the profile you want to use default \u2190 amplify configure\u3067\u6307\u5b9a\u3057\u305f\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u6307\u5b9a\r\n<\/code><\/pre>\n<p>\u5e94\u7528\u7a0b\u5e8f\u7684\u6a21\u677f\u5df2\u5b8c\u6210\u3002<\/p>\n<h1>\u5b9e\u65bd\u8ba4\u8bc1\u529f\u80fd<\/h1>\n<p>\u6211\u4eec\u5c06\u5b9e\u65bd\u8ba4\u8bc1\u529f\u80fd\u3002<\/p>\n<h2>\u540e\u7aef\/\u57fa\u7840\u67b6\u6784<\/h2>\n<p>\u589e\u5f3a\u529f\u80fd\uff0c\u6dfb\u52a0\u8ba4\u8bc1\u529f\u80fd\u3002<\/p>\n<pre class=\"post-pre\"><code>$ amplify add auth\r\n? Do you want to use the default authentication and security configuration? Default configuration\r\n? Warning: you will not be able to edit these selections.\r\n? How do you want users to be able to sign in? Username\r\n? Do you want to configure advanced settings? No, I am done.\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528amplify push\u5c06\u66f4\u6539\u540c\u6b65\u5230\u4e91\u7aef\u3002<\/p>\n<pre class=\"post-pre\"><code>$ amplify push\r\n? Are you sure you want to continue? Yes\r\n<\/code><\/pre>\n<p>\u540e\u7aef\/\u57fa\u7840\u8bbe\u65bd\u7684\u5b9e\u73b0\u5df2\u7ecf\u5b8c\u6210\u4e86\u3002<\/p>\n<h2>\u524d\u7aef<\/h2>\n<h3>\u5b89\u88c5\u8f6f\u4ef6\u5305<\/h3>\n<p>\u9996\u5148\uff0c\u5b89\u88c5Amplify\u76f8\u5173\u7684\u8f6f\u4ef6\u5305\u3002<\/p>\n<pre class=\"post-pre\"><code>$ yarn add aws-amplify @aws-amplify\/ui-react\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u5b89\u88c5Material-UI\u3002<\/p>\n<pre class=\"post-pre\"><code>$ yarn add @material-ui\/core @material-ui\/icons\r\n<\/code><\/pre>\n<p>\u6700\u540e\uff0c\u5b89\u88c5Recoil\u3002<\/p>\n<pre class=\"post-pre\"><code>$ yarn add recoil\r\n<\/code><\/pre>\n<h3>\u7ec4\u4ef6\u7684\u5b9e\u73b0<\/h3>\n<p>\u5c06App.tsx\u91cd\u5199\u4e3a\u4ee5\u4e0b\u65b9\u5f0f\u3002<br \/>\n\u767b\u5f55\u754c\u9762\u4f7f\u7528@aws-amplify\/ui-react\u7684\u7ec4\u4ef6\u8fdb\u884c\u521b\u5efa\u3002<br \/>\n\u6ce8\u9500\u901a\u8fc7\u5728handleClick\u51fd\u6570\u5185\u4f7f\u7528aws-amplify\u7684Auth.signOut()\u6765\u5b9e\u73b0\u3002<br \/>\n\u540c\u65f6\uff0c\u5c06\u767b\u5f55\u7528\u6237\u7684\u7528\u6237\u540d\u5b58\u50a8\u5728\u540e\u9762\u8981\u63d0\u5230\u7684Recoil\u7684\u539f\u5b50(atom)\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span><span class=\"p\">,<\/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=\"s2\">react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Amplify<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Auth<\/span> <span class=\"p\">}<\/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=\"p\">{<\/span> <span class=\"nx\">AmplifyAuthenticator<\/span><span class=\"p\">,<\/span> <span class=\"nx\">AmplifySignUp<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@aws-amplify\/ui-react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">AuthState<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">onAuthUIStateChange<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">CognitoUserInterface<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@aws-amplify\/ui-components<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">awsconfig<\/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=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">RecoilRoot<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">recoil<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createStyles<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Theme<\/span><span class=\"p\">,<\/span> <span class=\"nx\">makeStyles<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/styles<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">AppBar<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/AppBar<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Toolbar<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/Toolbar<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Typography<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/Typography<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">IconButton<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/IconButton<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">ExitToAppIcon<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/icons\/ExitToApp<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"nx\">Amplify<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsconfig<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">useStyles<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">makeStyles<\/span><span class=\"p\">((<\/span><span class=\"nx\">theme<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Theme<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span>\r\n  <span class=\"nx\">createStyles<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">appBar<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">zIndex<\/span><span class=\"p\">:<\/span> <span class=\"nx\">theme<\/span><span class=\"p\">.<\/span><span class=\"nx\">zIndex<\/span><span class=\"p\">.<\/span><span class=\"nx\">drawer<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"na\">toolBar<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">display<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">flex<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"na\">signOut<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">marginLeft<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">auto<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">display<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">flex<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n  <span class=\"p\">})<\/span>\r\n<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=\"nx\">classes<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useStyles<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">authState<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setAuthState<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">AuthState<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">user<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setUser<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">CognitoUserInterface<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">undefined<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n\r\n  <span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">useEffect<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"nx\">onAuthUIStateChange<\/span><span class=\"p\">((<\/span><span class=\"nx\">nextAuthState<\/span><span class=\"p\">,<\/span> <span class=\"nx\">authData<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">setAuthState<\/span><span class=\"p\">(<\/span><span class=\"nx\">nextAuthState<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">AuthState<\/span><span class=\"p\">);<\/span>\r\n      <span class=\"nx\">setUser<\/span><span class=\"p\">(<\/span><span class=\"nx\">authData<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">CognitoUserInterface<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">});<\/span>\r\n  <span class=\"p\">},<\/span> <span class=\"p\">[]);<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">handleClick<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Auth<\/span><span class=\"p\">.<\/span><span class=\"nx\">signOut<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"nx\">authState<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">AuthState<\/span><span class=\"p\">.<\/span><span class=\"nx\">SignedIn<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">user<\/span> <span class=\"p\">?<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">RecoilRoot<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">AppBar<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">classes<\/span><span class=\"p\">.<\/span><span class=\"nx\">appBar<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n          <span class=\"p\">&lt;<\/span><span class=\"nc\">Toolbar<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">classes<\/span><span class=\"p\">.<\/span><span class=\"nx\">toolBar<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;<\/span><span class=\"nc\">Typography<\/span> <span class=\"na\">variant<\/span><span class=\"p\">=<\/span><span class=\"s\">\"h6\"<\/span> <span class=\"na\">noWrap<\/span><span class=\"p\">&gt;<\/span>\r\n              ChatApp\r\n            <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Typography<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span> <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">handleClick<\/span><span class=\"si\">}<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">classes<\/span><span class=\"p\">.<\/span><span class=\"nx\">signOut<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n              <span class=\"p\">&lt;<\/span><span class=\"nc\">IconButton<\/span>\r\n                <span class=\"na\">aria<\/span><span class=\"err\">-<\/span><span class=\"na\">label<\/span><span class=\"p\">=<\/span><span class=\"s\">\"display more actions\"<\/span>\r\n                <span class=\"na\">edge<\/span><span class=\"p\">=<\/span><span class=\"s\">\"end\"<\/span>\r\n                <span class=\"na\">color<\/span><span class=\"p\">=<\/span><span class=\"s\">\"inherit\"<\/span>\r\n              <span class=\"p\">&gt;<\/span>\r\n                <span class=\"p\">&lt;<\/span><span class=\"nc\">ExitToAppIcon<\/span> <span class=\"p\">\/&gt;<\/span>\r\n              <span class=\"p\">&lt;\/<\/span><span class=\"nc\">IconButton<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n          <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Toolbar<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;\/<\/span><span class=\"nc\">AppBar<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;\/<\/span><span class=\"nc\">RecoilRoot<\/span><span class=\"p\">&gt;<\/span>\r\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n  <span class=\"p\">)<\/span> <span class=\"p\">:<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"p\">&lt;<\/span><span class=\"nc\">AmplifyAuthenticator<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">AmplifySignUp<\/span>\r\n        <span class=\"na\">slot<\/span><span class=\"p\">=<\/span><span class=\"s\">\"sign-up\"<\/span>\r\n        <span class=\"na\">formFields<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">[<\/span>\r\n          <span class=\"p\">{<\/span> <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">username<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">},<\/span>\r\n          <span class=\"p\">{<\/span> <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">password<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">},<\/span>\r\n          <span class=\"p\">{<\/span> <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">email<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">},<\/span>\r\n        <span class=\"p\">]<\/span><span class=\"si\">}<\/span>\r\n      <span class=\"p\">\/&gt;<\/span>\r\n    <span class=\"p\">&lt;\/<\/span><span class=\"nc\">AmplifyAuthenticator<\/span><span class=\"p\">&gt;<\/span>\r\n  <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><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<h3>\u56de\u5f39\u529f\u80fd\u7684\u5b9e\u73b0<\/h3>\n<p>\u5728src\/recoil\/ChatState.tsx\u4e2d\u521b\u5efa\u4e00\u4e2a\u6587\u4ef6\uff0c\u7136\u540e\u6309\u7167\u4e0b\u9762\u7684\u65b9\u5f0f\u7f16\u5199\uff1a<br \/>\n\u521b\u5efa\u4e00\u4e2a\u8868\u793a\u4e00\u6761\u5e16\u5b50\u7684postState\u548c\u8868\u793a\u5e16\u5b50\u5217\u8868\u7684postListState\u3002<br \/>\n\u6b64\u5916\uff0c\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a\u7528\u4e8e\u83b7\u53d6\/\u8bbe\u7f6e\u5e16\u5b50\u6d88\u606f\u7684messageState\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">atom<\/span><span class=\"p\">,<\/span> <span class=\"nx\">selector<\/span><span class=\"p\">,<\/span> <span class=\"nx\">DefaultValue<\/span><span class=\"p\">,<\/span> <span class=\"nx\">RecoilState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">recoil<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">produce<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">immer<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kr\">interface<\/span> <span class=\"nx\">PostState<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nl\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">message<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">owner<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">user<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">createdAt<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">defaultValue<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PostState<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"na\">owner<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"na\">user<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"na\">createdAt<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">atomKeyName<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">postState<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">postState<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">atom<\/span><span class=\"p\">({<\/span>\r\n  <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">atomKeyName<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"na\">default<\/span><span class=\"p\">:<\/span> <span class=\"nx\">defaultValue<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">});<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">messageState<\/span><span class=\"p\">:<\/span> <span class=\"nx\">RecoilState<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"o\">&gt;<\/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=\"na\">propName<\/span><span class=\"p\">:<\/span> <span class=\"kr\">keyof<\/span> <span class=\"nx\">PostState<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">message<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"k\">return<\/span> <span class=\"nx\">selector<\/span><span class=\"o\">&lt;<\/span><span class=\"kr\">string<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">atomKeyName<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">propName<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">get<\/span><span class=\"p\">:<\/span> <span class=\"p\">({<\/span> <span class=\"kd\">get<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"k\">return<\/span> <span class=\"kd\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">postState<\/span><span class=\"p\">)[<\/span><span class=\"nx\">propName<\/span><span class=\"p\">];<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"na\">set<\/span><span class=\"p\">:<\/span> <span class=\"p\">({<\/span> <span class=\"kd\">set<\/span><span class=\"p\">,<\/span> <span class=\"kd\">get<\/span> <span class=\"p\">},<\/span> <span class=\"nx\">newValue<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"na\">tempValue<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span> <span class=\"o\">=<\/span>\r\n        <span class=\"nx\">newValue<\/span> <span class=\"k\">instanceof<\/span> <span class=\"nx\">DefaultValue<\/span> <span class=\"p\">?<\/span> <span class=\"nx\">defaultValue<\/span><span class=\"p\">[<\/span><span class=\"nx\">propName<\/span><span class=\"p\">]<\/span> <span class=\"p\">:<\/span> <span class=\"nx\">newValue<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">imValue<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">produce<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">PostState<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"kd\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">postState<\/span><span class=\"p\">),<\/span> <span class=\"p\">(<\/span><span class=\"nx\">draft<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">draft<\/span><span class=\"p\">[<\/span><span class=\"nx\">propName<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">tempValue<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"p\">});<\/span>\r\n      <span class=\"kd\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">postState<\/span><span class=\"p\">,<\/span> <span class=\"nx\">imValue<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">},<\/span>\r\n  <span class=\"p\">});<\/span>\r\n<span class=\"p\">})();<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">postListDefaultValue<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PostState<\/span><span class=\"p\">[]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[];<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">postListState<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">atom<\/span><span class=\"p\">({<\/span>\r\n  <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">postListState<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"na\">default<\/span><span class=\"p\">:<\/span> <span class=\"nx\">postListDefaultValue<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">});<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0a\u5373\u4e3a\u8ba4\u8bc1\u529f\u80fd\u7684\u5b9e\u73b0\u5b8c\u6bd5\u3002<br \/>\n\u8ba9\u6211\u4eec\u6309\u7167\u4e0b\u8ff0\u6b65\u9aa4\u8fdb\u884c\u64cd\u4f5c\u786e\u8ba4\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8318913a08637a6b2a00\/41-0.png\" alt=\"image.png\" \/><\/div>\n<h1>\u804a\u5929\u529f\u80fd\u7684\u5b9e\u65bd<\/h1>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u4f1a\u8fdb\u884c\u5728\u7ebf\u804a\u5929\u7684\u5b9e\u73b0\u3002<\/p>\n<h2>\u540e\u7aef\/\u57fa\u7840\u67b6\u6784<\/h2>\n<h3>\u521b\u5efaGraphQL API<\/h3>\n<p>\u4f7f\u7528amplify\u5e76\u6dfb\u52a0API\uff0c\u521b\u5efaGraphQL API\u3002<\/p>\n<pre class=\"post-pre\"><code>$ amplify add api\r\n? Please select from one of the below mentioned services: GraphQL\r\n? Provide API name: chat\r\n? Choose the default authorization type for the API Amazon Cognito User Pool\r\n? Do you want to configure advanced settings for the GraphQL API No, I am done.\r\n? Do you have an annotated GraphQL schema? No\r\n? Choose a schema template: Single object with fields (e.g., \u201cTodo\u201d with ID, name, description)\r\n? Do you want to edit the schema now? No\r\n<\/code><\/pre>\n<h3>\u7f16\u8f91GraphQL\u7684\u6a21\u5f0f<\/h3>\n<p>\u901a\u8fc7\u7f16\u8f91amplify\/backend\/api\/chat\/build\/schema.graphql\u751f\u6210\u7684\u6a21\u5f0f\u6765\u5b9e\u73b0\u3002 \u5728\u83b7\u53d6\u6240\u6709\u5e16\u5b50\u65f6\uff0c\u4f7f\u7528@key\u6309\u7167\u521b\u5efa\u65e5\u671f\u7684\u987a\u5e8f\u6392\u5e8f\u3002<\/p>\n<pre class=\"post-pre\"><code>type Post\r\n  @model\r\n  @key(\r\n    name: \"SortByCreatedAt\"\r\n    fields: [\"owner\", \"createdAt\"]\r\n    queryField: \"listPostsSortedByCreatedAt\"\r\n  ) {\r\n  id: ID!\r\n  message: String!\r\n  owner: String\r\n  user: String\r\n  createdAt: AWSDateTime\r\n}\r\n<\/code><\/pre>\n<p>\u8bf7\u53c2\u9605\u5b98\u65b9\u6587\u6863\u4e86\u89e3\u5173\u4e8e@model\u548c@key\u7684\u8be6\u7ec6\u8bf4\u660e\u3002<br \/>\nhttps:\/\/docs.amplify.aws\/cli\/graphql-transformer\/model<br \/>\nhttps:\/\/docs.amplify.aws\/cli\/graphql-transformer\/key<\/p>\n<h3>GraphQL API \u7684\u90e8\u7f72<\/h3>\n<p>\u4f7f\u7528Amplify push\u5c06GraphQL API\u90e8\u7f72\u5230\u4e91\u4e0a\u3002<\/p>\n<pre class=\"post-pre\"><code>$ amplify push\r\n? Are you sure you want to continue? Yes\r\n? Do you want to generate code for your newly created GraphQL API Yes\r\n? Choose the code generation language target typescript\r\n? Enter the file name pattern of graphql queries, mutations and subscriptions src\/graphql\/**\/*.ts\r\n? Do you want to generate\/update all possible GraphQL operations - queries, mutations and subscriptions Yes\r\n? Enter maximum statement depth [increase from default if your schema is deeply nested] 2\r\n? Enter the file name for the generated code src\/API.ts\r\nGraphQL endpoint: https:\/\/xxxxxxxxx.appsync-api.us-east-1.amazonaws.com\/graphql\r\n<\/code><\/pre>\n<p>\u6700\u5f8c\u4e00\u884c\u7684URL\u662fApp Sync\u63d0\u4f9b\u7684GraphQL API\u7684URL\u3002<br \/>\n\u8fd9\u4e2aURL\u4f1a\u81ea\u52a8\u5199\u5165\u5230\u4e00\u4e2a\u540d\u4e3asrc\/aws-exports.js\u7684\u6587\u4ef6\u4e2d\uff0c\u800c\u4e14\u662f\u81ea\u52a8\u751f\u6210\u7684\u3002<\/p>\n<h2>\u524d\u7aef<\/h2>\n<h3>\u7ec4\u4ef6\u5b9e\u73b0<\/h3>\n<p>\u5b9e\u73b0\u5177\u6709\u804a\u5929\u529f\u80fd\u7684Content\u7ec4\u4ef6\u3002<br \/>\n\u521b\u5efasrc\/Content.tsx\u5e76\u6309\u4e0b\u9762\u7684\u4ee3\u7801\u7f16\u5199\u3002<br \/>\n\u901a\u8fc7GraphQL\u7684mutations\u5728\u70b9\u51fb\u6ce8\u518c\u6309\u94ae\u65f6\u5c06\u6570\u636e\u6ce8\u518c\u5230DynamoDB\u4e2d\u3002<br \/>\n\u53e6\u5916\uff0c\u5728\u7b2c\u4e00\u6b21\u8c03\u7528Content\u7ec4\u4ef6\u65f6\uff0c\u901a\u8fc7GraphQL\u7684queries\u83b7\u53d6\u5e16\u5b50\u5217\u8868\u3002\u4e3a\u4e86\u6309\u521b\u5efa\u65e5\u671f\u548c\u65f6\u95f4\u987a\u5e8f\u83b7\u53d6\u6240\u6709\u5e16\u5b50\uff0c\u5728owner\u4e2d\u653e\u5165\u4e86\u56fa\u5b9a\u503cchat\u3002<br \/>\n\u6b64\u5916\uff0c\u901a\u8fc7\u8c03\u7528GraphQL\u7684subscriptions\u6765\u8ba2\u9605\u65b0\u5e16\u5b50\uff0c\u5728Content\u7ec4\u4ef6\u7b2c\u4e00\u6b21\u8c03\u7528\u65f6\u3002\u7531\u4e8e\u8fd8\u8ba2\u9605\u4e86\u81ea\u5df1\u53d1\u5e03\u7684\u5e16\u5b50\uff0c\u56e0\u6b64\u5728\u5904\u7406\u81ea\u5df1\u53d1\u5e03\u7684\u5e16\u5b50\u65f6\uff0c\u4e0d\u9700\u8981\u8bbe\u7f6esetPost\u3002<\/p>\n<pre class=\"post-pre\"><code><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=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useRecoilState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">recoil<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">postListState<\/span><span class=\"p\">,<\/span> <span class=\"nx\">messageState<\/span><span class=\"p\">,<\/span> <span class=\"nx\">PostState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/recoil\/ChatState<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/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=\"s2\">aws-amplify<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">GraphQLResult<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@aws-amplify\/api<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">listPostsSortedByCreatedAt<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/graphql\/queries<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createPost<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/graphql\/mutations<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">onCreatePost<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/graphql\/subscriptions<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">List<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/List<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">ListItem<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/ListItem<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Chip<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/Chip<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Button<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/Button<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">TextField<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/TextField<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createStyles<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Theme<\/span><span class=\"p\">,<\/span> <span class=\"nx\">makeStyles<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/styles<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Container<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/Container<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">CreatePostMutation<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ListPostsSortedByCreatedAtQuery<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/API<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">useStyles<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">makeStyles<\/span><span class=\"p\">((<\/span><span class=\"nx\">theme<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Theme<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span>\r\n  <span class=\"nx\">createStyles<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">container<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">paddingTop<\/span><span class=\"p\">:<\/span> <span class=\"nx\">theme<\/span><span class=\"p\">.<\/span><span class=\"nx\">spacing<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">),<\/span>\r\n      <span class=\"na\">paddingBottom<\/span><span class=\"p\">:<\/span> <span class=\"nx\">theme<\/span><span class=\"p\">.<\/span><span class=\"nx\">spacing<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">),<\/span>\r\n      <span class=\"na\">backgroundColor<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">white<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">display<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">flex<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"na\">myMessage<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">display<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">flex<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">justifyContent<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">flex-start<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"na\">otherMessage<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">display<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">flex<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">justifyContent<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">flex-end<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n  <span class=\"p\">})<\/span>\r\n<span class=\"p\">);<\/span>\r\n\r\n<span class=\"kr\">interface<\/span> <span class=\"nx\">ContentProps<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nl\">userName<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">Content<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">:<\/span> <span class=\"nx\">ContentProps<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">classes<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useStyles<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">posts<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setPosts<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useRecoilState<\/span><span class=\"p\">(<\/span><span class=\"nx\">postListState<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">message<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setMessage<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useRecoilState<\/span><span class=\"p\">(<\/span><span class=\"nx\">messageState<\/span><span class=\"p\">);<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">handleClick<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">postPost<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">postPost<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">post<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span>\r\n      <span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">createPost<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">message<\/span><span class=\"p\">:<\/span> <span class=\"nx\">message<\/span><span class=\"p\">,<\/span> <span class=\"na\">owner<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">chat<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"na\">user<\/span><span class=\"p\">:<\/span> <span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">userName<\/span> <span class=\"p\">},<\/span>\r\n      <span class=\"p\">})<\/span>\r\n    <span class=\"p\">))<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">GraphQLResult<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">CreatePostMutation<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">postData<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">post<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">?.<\/span><span class=\"nx\">createPost<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">PostState<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"nx\">setPosts<\/span><span class=\"p\">([...<\/span><span class=\"nx\">posts<\/span><span class=\"p\">,<\/span> <span class=\"nx\">postData<\/span><span class=\"p\">]);<\/span>\r\n    <span class=\"nx\">setMessage<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"\"<\/span><span class=\"p\">);<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">handleChange<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"na\">event<\/span><span class=\"p\">:<\/span> <span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">ChangeEvent<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">HTMLInputElement<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">setMessage<\/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=\"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=\"k\">async<\/span> <span class=\"kd\">function<\/span> <span class=\"nx\">getPosts<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">res<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">listPostsSortedByCreatedAt<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"na\">owner<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">chat<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">})<\/span>\r\n      <span class=\"p\">))<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">GraphQLResult<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">ListPostsSortedByCreatedAtQuery<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">postData<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">res<\/span><span class=\"p\">?.<\/span><span class=\"nx\">data<\/span><span class=\"p\">?.<\/span><span class=\"nx\">listPostsSortedByCreatedAt<\/span>\r\n        <span class=\"p\">?.<\/span><span class=\"nx\">items<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">PostState<\/span><span class=\"p\">[];<\/span>\r\n      <span class=\"nx\">setPosts<\/span><span class=\"p\">(<\/span><span class=\"nx\">postData<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"nx\">getPosts<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">},<\/span> <span class=\"p\">[<\/span><span class=\"nx\">setPosts<\/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=\"c1\">\/\/ @ts-ignore<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">subscription<\/span> <span class=\"o\">=<\/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\">onCreatePost<\/span><span class=\"p\">)).<\/span><span class=\"nx\">subscribe<\/span><span class=\"p\">({<\/span>\r\n      <span class=\"na\">next<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"na\">eventData<\/span><span class=\"p\">:<\/span> <span class=\"kr\">any<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"nx\">post<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">eventData<\/span><span class=\"p\">.<\/span><span class=\"nx\">value<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">onCreatePost<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">post<\/span> <span class=\"o\">!==<\/span> <span class=\"kc\">undefined<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">post<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span> <span class=\"o\">!==<\/span> <span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">userName<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"nx\">setPosts<\/span><span class=\"p\">([...<\/span><span class=\"nx\">posts<\/span><span class=\"p\">,<\/span> <span class=\"nx\">post<\/span><span class=\"p\">]);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n      <span class=\"p\">},<\/span>\r\n    <span class=\"p\">});<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">subscription<\/span><span class=\"p\">.<\/span><span class=\"nx\">unsubscribe<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">},<\/span> <span class=\"p\">[<\/span><span class=\"nx\">posts<\/span><span class=\"p\">]);<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"na\">postList<\/span><span class=\"p\">:<\/span> <span class=\"nx\">JSX<\/span><span class=\"p\">.<\/span><span class=\"nx\">Element<\/span><span class=\"p\">[]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[];<\/span>\r\n\r\n  <span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"kd\">const<\/span> <span class=\"nx\">post<\/span> <span class=\"k\">of<\/span> <span class=\"nx\">posts<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">post<\/span><span class=\"p\">.<\/span><span class=\"nx\">user<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">props<\/span><span class=\"p\">.<\/span><span class=\"nx\">userName<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">postList<\/span><span class=\"p\">.<\/span><span class=\"nx\">push<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">ListItem<\/span> <span class=\"na\">key<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">post<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"si\">}<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">classes<\/span><span class=\"p\">.<\/span><span class=\"nx\">myMessage<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n          <span class=\"p\">&lt;<\/span><span class=\"nc\">Chip<\/span> <span class=\"na\">label<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">post<\/span><span class=\"p\">.<\/span><span class=\"nx\">message<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;&lt;\/<\/span><span class=\"nc\">Chip<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;\/<\/span><span class=\"nc\">ListItem<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">postList<\/span><span class=\"p\">.<\/span><span class=\"nx\">push<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">ListItem<\/span> <span class=\"na\">key<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">post<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"si\">}<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">classes<\/span><span class=\"p\">.<\/span><span class=\"nx\">otherMessage<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n          <span class=\"p\">&lt;<\/span><span class=\"nc\">Chip<\/span> <span class=\"na\">label<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">post<\/span><span class=\"p\">.<\/span><span class=\"nx\">message<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;&lt;\/<\/span><span class=\"nc\">Chip<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;\/<\/span><span class=\"nc\">ListItem<\/span><span class=\"p\">&gt;<\/span>\r\n      <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=\"p\">&lt;<\/span><span class=\"nc\">Container<\/span> <span class=\"na\">maxWidth<\/span><span class=\"p\">=<\/span><span class=\"s\">\"lg\"<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">classes<\/span><span class=\"p\">.<\/span><span class=\"nx\">container<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">classes<\/span><span class=\"p\">.<\/span><span class=\"nx\">input<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">TextField<\/span> <span class=\"na\">value<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">message<\/span><span class=\"si\">}<\/span> <span class=\"na\">onChange<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">handleChange<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">Button<\/span> <span class=\"na\">variant<\/span><span class=\"p\">=<\/span><span class=\"s\">\"contained\"<\/span> <span class=\"na\">color<\/span><span class=\"p\">=<\/span><span class=\"s\">\"secondary\"<\/span> <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">handleClick<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n          \u767b\u9332\u3059\u308b\r\n        <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Button<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">List<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">postList<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nc\">List<\/span><span class=\"p\">&gt;<\/span>\r\n    <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Container<\/span><span class=\"p\">&gt;<\/span>\r\n  <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\">Content<\/span><span class=\"p\">;<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u5728App\u7ec4\u4ef6\u4e2d\u8c03\u7528\u5df2\u521b\u5efa\u7684Content\u7ec4\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span><span class=\"p\">,<\/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=\"s2\">react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Amplify<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Auth<\/span> <span class=\"p\">}<\/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=\"p\">{<\/span> <span class=\"nx\">AmplifyAuthenticator<\/span><span class=\"p\">,<\/span> <span class=\"nx\">AmplifySignUp<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@aws-amplify\/ui-react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">AuthState<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">onAuthUIStateChange<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">CognitoUserInterface<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@aws-amplify\/ui-components<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">awsconfig<\/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=\"k\">import<\/span> <span class=\"nx\">Content<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/Content<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">RecoilRoot<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">recoil<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createStyles<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Theme<\/span><span class=\"p\">,<\/span> <span class=\"nx\">makeStyles<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/styles<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">AppBar<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/AppBar<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Toolbar<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/Toolbar<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Typography<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/Typography<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">IconButton<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/core\/IconButton<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">ExitToAppIcon<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@material-ui\/icons\/ExitToApp<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"nx\">Amplify<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">awsconfig<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">useStyles<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">makeStyles<\/span><span class=\"p\">((<\/span><span class=\"nx\">theme<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Theme<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span>\r\n  <span class=\"nx\">createStyles<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">appBar<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">zIndex<\/span><span class=\"p\">:<\/span> <span class=\"nx\">theme<\/span><span class=\"p\">.<\/span><span class=\"nx\">zIndex<\/span><span class=\"p\">.<\/span><span class=\"nx\">drawer<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"na\">toolBar<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">display<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">flex<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"na\">signOut<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">marginLeft<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">auto<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">display<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">flex<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">},<\/span>\r\n  <span class=\"p\">})<\/span>\r\n<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=\"nx\">classes<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useStyles<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">authState<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setAuthState<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">AuthState<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">user<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setUser<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">CognitoUserInterface<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">undefined<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n\r\n  <span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">useEffect<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"nx\">onAuthUIStateChange<\/span><span class=\"p\">((<\/span><span class=\"nx\">nextAuthState<\/span><span class=\"p\">,<\/span> <span class=\"nx\">authData<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">setAuthState<\/span><span class=\"p\">(<\/span><span class=\"nx\">nextAuthState<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">AuthState<\/span><span class=\"p\">);<\/span>\r\n      <span class=\"nx\">setUser<\/span><span class=\"p\">(<\/span><span class=\"nx\">authData<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">CognitoUserInterface<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">});<\/span>\r\n  <span class=\"p\">},<\/span> <span class=\"p\">[]);<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">handleClick<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">Auth<\/span><span class=\"p\">.<\/span><span class=\"nx\">signOut<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"nx\">authState<\/span> <span class=\"o\">===<\/span> <span class=\"nx\">AuthState<\/span><span class=\"p\">.<\/span><span class=\"nx\">SignedIn<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">user<\/span> <span class=\"p\">?<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">RecoilRoot<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">AppBar<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">classes<\/span><span class=\"p\">.<\/span><span class=\"nx\">appBar<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n          <span class=\"p\">&lt;<\/span><span class=\"nc\">Toolbar<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">classes<\/span><span class=\"p\">.<\/span><span class=\"nx\">toolBar<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;<\/span><span class=\"nc\">Typography<\/span> <span class=\"na\">variant<\/span><span class=\"p\">=<\/span><span class=\"s\">\"h6\"<\/span> <span class=\"na\">noWrap<\/span><span class=\"p\">&gt;<\/span>\r\n              ChatApp\r\n            <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Typography<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span> <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">handleClick<\/span><span class=\"si\">}<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">classes<\/span><span class=\"p\">.<\/span><span class=\"nx\">signOut<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n              <span class=\"p\">&lt;<\/span><span class=\"nc\">IconButton<\/span>\r\n                <span class=\"na\">aria<\/span><span class=\"err\">-<\/span><span class=\"na\">label<\/span><span class=\"p\">=<\/span><span class=\"s\">\"display more actions\"<\/span>\r\n                <span class=\"na\">edge<\/span><span class=\"p\">=<\/span><span class=\"s\">\"end\"<\/span>\r\n                <span class=\"na\">color<\/span><span class=\"p\">=<\/span><span class=\"s\">\"inherit\"<\/span>\r\n              <span class=\"p\">&gt;<\/span>\r\n                <span class=\"p\">&lt;<\/span><span class=\"nc\">ExitToAppIcon<\/span> <span class=\"p\">\/&gt;<\/span>\r\n              <span class=\"p\">&lt;\/<\/span><span class=\"nc\">IconButton<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n          <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Toolbar<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;\/<\/span><span class=\"nc\">AppBar<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">Content<\/span> <span class=\"na\">userName<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">username<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;\/<\/span><span class=\"nc\">RecoilRoot<\/span><span class=\"p\">&gt;<\/span>\r\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n  <span class=\"p\">)<\/span> <span class=\"p\">:<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"p\">&lt;<\/span><span class=\"nc\">AmplifyAuthenticator<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">AmplifySignUp<\/span>\r\n        <span class=\"na\">slot<\/span><span class=\"p\">=<\/span><span class=\"s\">\"sign-up\"<\/span>\r\n        <span class=\"na\">formFields<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">[<\/span>\r\n          <span class=\"p\">{<\/span> <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">username<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">},<\/span>\r\n          <span class=\"p\">{<\/span> <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">password<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">},<\/span>\r\n          <span class=\"p\">{<\/span> <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">email<\/span><span class=\"dl\">\"<\/span> <span class=\"p\">},<\/span>\r\n        <span class=\"p\">]<\/span><span class=\"si\">}<\/span>\r\n      <span class=\"p\">\/&gt;<\/span>\r\n    <span class=\"p\">&lt;\/<\/span><span class=\"nc\">AmplifyAuthenticator<\/span><span class=\"p\">&gt;<\/span>\r\n  <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><span class=\"p\">;<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0a\u662f\u804a\u5929\u529f\u80fd\u7684\u5b9e\u73b0\u5df2\u7ecf\u5b8c\u6210\u3002<br \/>\n\u8ba9\u6211\u4eec\u6309\u7167\u4e0b\u9762\u7684\u6b65\u9aa4\u8fdb\u884c\u64cd\u4f5c\u9a8c\u8bc1\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8318913a08637a6b2a00\/63-0.png\" alt=\"image.png\" \/><\/div>\n<h1>\u524d\u7aef\u6258\u7ba1<\/h1>\n<p>\u6700\u540e\uff0c\u8ba9\u6211\u4eec\u4f7f\u7528Amplify Console Static Web Site Hosting\u6765\u6258\u7ba1\u6211\u4eec\u521b\u5efa\u7684\u524d\u7aef\u4ee3\u7801\u3002<\/p>\n<pre class=\"post-pre\"><code>$ amplify hosting add\r\n? Select the plugin module to execute Hosting with Amplify Console (Managed hosting with custom domains, Continuous deployment)\r\n? Choose a type Manual deployment\r\n\r\n$ amplify publish\r\n? Are you sure you want to continue? Yes\r\n<\/code><\/pre>\n<p>\u5982\u679c\u53ef\u4ee5\u8bbf\u95ee\u63a7\u5236\u53f0\u8f93\u51fa\u7684URL\uff0c\u5219\u8868\u793a\u6210\u529f\u3002<\/p>\n<p>\u4ee5\u4e0a\uff0c\u672c\u6587\u4e2d\u5b9e\u73b0\u5e26\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528\u7684\u521b\u5efa\u5df2\u7ecf\u5b8c\u6210\u3002<\/p>\n<h1>\u6700\u540e<\/h1>\n<p>\u8bf7\u6267\u884c\u4e0b\u9762\u7684\u6b65\u9aa4\u6765\u5220\u9664\u5df2\u521b\u5efa\u7684\u73af\u5883\u3002<\/p>\n<pre class=\"post-pre\"><code>$ amplify delete\r\n? Are you sure you want to continue? This CANNOT be undone. (This will delete all the environments of the project from the cloud and wipe out all the local files created by Amplify CLI) Yes\r\n<\/code><\/pre>\n<p>\u672c\u6587\u7ae0\u4e2d\u521b\u5efa\u7684\u5e26\u6709\u8eab\u4efd\u9a8c\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528\u7684\u5b8c\u6574\u6e90\u4ee3\u7801\u5df2\u5728\u4e0b\u65b9\u94fe\u63a5\u4e2d\u516c\u5f00\u3002<br \/>\nhttps:\/\/github.com\/shimi7o\/chat<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u5c06\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6765\u6784\u5efa\u5177\u6709\u8eab\u4efd\u9a8c [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48116","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>\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528 - 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\/\u4f7f\u7528reactamplifyappsynctypescriptrecoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528\" \/>\n<meta property=\"og:description\" content=\"\u6211\u5c06\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6765\u6784\u5efa\u5177\u6709\u8eab\u4efd\u9a8c [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528reactamplifyappsynctypescriptrecoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2024-02-16T13:54:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T04:06:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8318913a08637a6b2a00\/1-0.gif\" \/>\n<meta name=\"author\" content=\"\u96c5, \u609f\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u96c5, \u609f\" \/>\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\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/\",\"name\":\"\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2024-02-16T13:54:06+00:00\",\"dateModified\":\"2024-04-29T04:06:27+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528\"}]},{\"@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\/f044a4b7fa4ee2701702942002419ca6\",\"name\":\"\u96c5, \u609f\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"caption\":\"\u96c5, \u609f\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528 - 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\/\u4f7f\u7528reactamplifyappsynctypescriptrecoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528","og_description":"\u6211\u5c06\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6765\u6784\u5efa\u5177\u6709\u8eab\u4efd\u9a8c [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528reactamplifyappsynctypescriptrecoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2024-02-16T13:54:06+00:00","article_modified_time":"2024-04-29T04:06:27+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8318913a08637a6b2a00\/1-0.gif"}],"author":"\u96c5, \u609f","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u96c5, \u609f","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"8 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/","name":"\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2024-02-16T13:54:06+00:00","dateModified":"2024-04-29T04:06:27+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528React+Amplify+AppSync+TypeScript+Recoil\u6784\u5efa\u5177\u6709\u8ba4\u8bc1\u529f\u80fd\u7684\u804a\u5929\u5e94\u7528"}]},{"@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\/f044a4b7fa4ee2701702942002419ca6","name":"\u96c5, \u609f","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","caption":"\u96c5, \u609f"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescriptrecoil%e6%9e%84%e5%bb%ba%e5%85%b7%e6%9c%89%e8%ae%a4%e8%af%81%e5%8a%9f%e8%83%bd%e7%9a%84%e8%81%8a%e5%a4%a9%e5%ba%94%e7%94%a8\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48116","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\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48116"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48116\/revisions"}],"predecessor-version":[{"id":85176,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48116\/revisions\/85176"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}