{"id":53307,"date":"2024-12-03T17:31:50","date_gmt":"2024-12-03T09:31:50","guid":{"rendered":"https:\/\/fwq.ai\/blog\/53307\/"},"modified":"2024-12-03T17:31:50","modified_gmt":"2024-12-03T09:31:50","slug":"%e5%9c%a8-react-%e4%b8%ad%e6%9e%84%e5%bb%ba%e4%b8%80%e6%ac%be%e5%8f%af%e9%9d%a0%e7%9a%84-pokemon-%e6%b8%b8%e6%88%8f%ef%bc%9a%e5%bc%80%e5%8f%91%e8%80%85%e7%9a%84%e5%86%92%e9%99%a9%ef%bc%81-2","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/53307\/","title":{"rendered":"\u5728 React \u4e2d\u6784\u5efa\u4e00\u6b3e\u53ef\u9760\u7684 Pok\u00e9mon \u6e38\u620f\uff1a\u5f00\u53d1\u8005\u7684\u5192\u9669\uff01"},"content":{"rendered":"<p><b><\/b>     <\/p>\n<h1>\u5728 React \u4e2d\u6784\u5efa\u4e00\u6b3e\u53ef\u9760\u7684 Pok\u00e9mon \u6e38\u620f\uff1a\u5f00\u53d1\u8005\u7684\u5192\u9669\uff01<\/h1>\n<p><span style=\"cursor: pointer\"><i><\/i>\u6536\u85cf<\/span>    <\/p>\n<p>\u4eb2\u7231\u7684\u7f16\u7a0b\u5b66\u4e60\u7231\u597d\u8005\uff0c\u5982\u679c\u4f60\u70b9\u5f00\u4e86\u8fd9\u7bc7\u6587\u7ae0\uff0c\u8bf4\u660e\u4f60\u5bf9\u300a\u5728 React \u4e2d\u6784\u5efa\u4e00\u6b3e\u53ef\u9760\u7684 Pok\u00e9mon \u6e38\u620f\uff1a\u5f00\u53d1\u8005\u7684\u5192\u9669\uff01\u300b\u5f88\u611f\u5174\u8da3\u3002\u672c\u7bc7\u6587\u7ae0\u5c31\u6765\u7ed9\u5927\u5bb6\u8be6\u7ec6\u89e3\u6790\u4e00\u4e0b\uff0c\u4e3b\u8981\u4ecb\u7ecd\u4e00\u4e0b\uff0c\u5e0c\u671b\u6240\u6709\u8ba4\u771f\u8bfb\u5b8c\u7684\u7ae5\u978b\u4eec\uff0c\u90fd\u6709\u5b9e\u8d28\u6027\u7684\u63d0\u9ad8\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20241129\/1732842419674913b39604d.jpg\" class=\"aligncenter\" title=\"\u5728 React \u4e2d\u6784\u5efa\u4e00\u6b3e\u53ef\u9760\u7684 Pok\u00e9mon \u6e38\u620f\uff1a\u5f00\u53d1\u8005\u7684\u5192\u9669\uff01\u63d2\u56fe\" alt=\"\u5728 React \u4e2d\u6784\u5efa\u4e00\u6b3e\u53ef\u9760\u7684 Pok\u00e9mon \u6e38\u620f\uff1a\u5f00\u53d1\u8005\u7684\u5192\u9669\uff01\u63d2\u56fe\" \/><\/p>\n<h2> s\uff1a\u5355\u4e00\u804c\u8d23 &#8211; \u4e00\u53ea\u795e\u5947\u5b9d\u8d1d\uff0c\u4e00\u4efd\u5de5\u4f5c <\/h2>\n<p><strong>\u95ee\u9898<\/strong>\uff1apokemoncomponent \u5904\u7406\u6355\u6349\u3001\u6218\u6597\u548c\u663e\u793a\u5206\u6570\uff0c\u8fdd\u53cd\u4e86 srp\u3002<\/p>\n<pre>function pokemoncomponent({ pokemon, oncatch, onbattle, score }) {\n  return (\n    &lt;div&gt;\n      &lt;h2&gt;{pokemon.name}&lt;\/h2&gt;\n      &lt;button onclick={() =&gt; oncatch(pokemon)}&gt;catch&lt;\/button&gt;\n      &lt;button onclick={() =&gt; onbattle(pokemon)}&gt;battle&lt;\/button&gt;\n      &lt;div&gt;score: {score}&lt;\/div&gt;\n    &lt;\/div&gt;\n  );\n}\n<\/pre>\n<p><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a\u8d23\u4efb\u5212\u5206\u3002<\/p>\n<pre>function pokemoncatcher({ pokemon, oncatch }) {\n  return &lt;button onclick={() =&gt; oncatch(pokemon)}&gt;catch&lt;\/button&gt;;\n}\nfunction pokemonbattler({ pokemon, onbattle }) {\n  return &lt;button onclick={() =&gt; onbattle(pokemon)}&gt;battle&lt;\/button&gt;;\n}\nfunction scoreboard({ score }) {\n  return &lt;div&gt;score: {score}&lt;\/div&gt;;\n}\nfunction pokemongame({ pokemon, oncatch, onbattle, score }) {\n  return (\n    &lt;div&gt;\n      &lt;h2&gt;{pokemon.name}&lt;\/h2&gt;\n      &lt;pokemoncatcher pokemon={pokemon} oncatch={oncatch} \/&gt;\n      &lt;pokemonbattler pokemon={pokemon} onbattle={onbattle} \/&gt;\n      &lt;scoreboard score={score} \/&gt;\n    &lt;\/div&gt;\n  );\n}\n<\/pre>\n<h2> o\uff1a\u5f00\u653e\/\u5c01\u95ed &#8211; \u8fdb\u5316\u7684\u795e\u5947\u5b9d\u8d1d\u7ec4\u4ef6 <\/h2>\n<p><strong>\u95ee\u9898<\/strong>\uff1a\u6dfb\u52a0\u7535\u6e90\u7b49\u529f\u80fd\u9700\u8981\u4fee\u6539\u73b0\u6709\u7ec4\u4ef6\u3002<\/p>\n<p><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a\u4f7f\u7528\u9ad8\u9636\u7ec4\u4ef6\uff08hoc\uff09\u3002<\/p>\n<pre>function withpowerup(pokemoncomponent) {\n  return function poweredupcomponent(props) {\n    const [ispoweredup, setpowerup] = usestate(false);\n    const powerup = () =&gt; {\n      setpowerup(true);\n      settimeout(() =&gt; setpowerup(false), 5000);\n    };\n    return (\n      &lt;div&gt;\n        &lt;pokemoncomponent {...props} ispoweredup={ispoweredup} \/&gt;\n        &lt;button onclick={powerup}&gt;power up!&lt;\/button&gt;\n      &lt;\/div&gt;\n    );\n  };\n}\n\nconst charmander = ({ ispoweredup }) =&gt; (\n  &lt;div&gt;charmander {ispoweredup &amp;&amp; \"(powered up!)\"}&lt;\/div&gt;\n);\n\nconst poweredcharmander = withpowerup(charmander);\n\nfunction pokemonapp() {\n  return &lt;poweredcharmander \/&gt;;\n}\n<\/pre>\n<h2> l\uff1a\u91cc\u6c0f\u66ff\u6362 &#8211; \u53ef\u4e92\u6362\u7684\u795e\u5947\u5b9d\u8d1d <\/h2>\n<p><strong>\u95ee\u9898<\/strong>\uff1a\u4ea4\u6362\u7ec4\u4ef6\u4f1a\u5bfc\u81f4\u95ee\u9898\u3002<\/p>\n<p><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a\u4f7f\u7528\u57fa\u7840\u7ec4\u4ef6\u3002<\/p>\n<pre>function basepokemon({ attack, children }) {\n  return (\n    &lt;div classname=\"pokemon\"&gt;\n      &lt;div&gt;attack: {attack}&lt;\/div&gt;\n      {children}\n    &lt;\/div&gt;\n  );\n}\nfunction pikachu({ attack }) {\n  return (\n    &lt;basepokemon attack={attack}&gt;\n      &lt;h2&gt;pikachu&lt;\/h2&gt;\n    &lt;\/basepokemon&gt;\n  );\n}\nfunction charizard({ attack }) {\n  return (\n    &lt;basepokemon attack={attack}&gt;\n      &lt;h2&gt;charizard&lt;\/h2&gt;\n    &lt;\/basepokemon&gt;\n  );\n}\nfunction pokemonbattle() {\n  return (\n    &lt;div&gt;\n      &lt;basepokemon attack=\"tackle\"&gt;\n        &lt;h2&gt;generic pok\u00e9mon&lt;\/h2&gt;\n      &lt;\/basepokemon&gt;\n      &lt;pikachu attack=\"thunderbolt\" \/&gt;\n      &lt;charizard attack=\"flamethrower\" \/&gt;\n    &lt;\/div&gt;\n  );\n}\n<\/pre>\n<h2> d\uff1a\u4f9d\u8d56\u5012\u7f6e &#8211; \u4f9d\u8d56\u4e8e\u62bd\u8c61 <\/h2>\n<p><strong>\u95ee\u9898<\/strong>\uff1a\u7ec4\u4ef6\u4e0e\u6570\u636e\u6e90\u7d27\u5bc6\u8026\u5408\u3002<\/p>\n<p><strong>\u89e3\u51b3\u65b9\u6848<\/strong>\uff1a\u4f7f\u7528\u4e0a\u4e0b\u6587\u8fdb\u884c\u6570\u636e\u6ce8\u5165\u3002<\/p>\n<pre>const PokemonContext = createContext();\nfunction Pikachu() {\n  const { attack } = useContext(PokemonContext);\n}\n&lt;PokemonContext.Provider value={{ attack: \"Thunderbolt\" }}&gt;\n  &lt;Pikachu \/&gt;\n&lt;\/PokemonContext.Provider&gt;\n<\/pre>\n<h2> \u5907\u5fd8\u5355\uff1a\u575a\u5b9e\u7684\u539f\u5219 <\/h2>\n<table>\n<thead>\n<tr>\n<th>principle<\/th>\n<th>pok\u00e9-mantra<\/th>\n<th>trainer\u2019s tip<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>single responsibility<\/td>\n<td>one pok\u00e9mon, one role.<\/td>\n<td>split complex components into focused ones.<\/td>\n<\/tr>\n<tr>\n<td>open\/closed<\/td>\n<td>evolve without changing.<\/td>\n<td>use hocs, render props for new features.<\/td>\n<\/tr>\n<tr>\n<td>liskov substitution<\/td>\n<td>components like pok\u00e9mon moves &#8211; interchangeable.<\/td>\n<td>ensure components can be used interchangeably.<\/td>\n<\/tr>\n<tr>\n<td>dependency inversion<\/td>\n<td>depend on abstractions, not concretes.<\/td>\n<td>use context or props for data management.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4eca\u5929\u5173\u4e8e\u300a\u5728 React \u4e2d\u6784\u5efa\u4e00\u6b3e\u53ef\u9760\u7684 Pok\u00e9mon \u6e38\u620f\uff1a\u5f00\u53d1\u8005\u7684\u5192\u9669\uff01\u300b\u7684\u5185\u5bb9\u5c31\u4ecb\u7ecd\u5230\u8fd9\u91cc\u4e86\uff0c\u662f\u4e0d\u662f\u5b66\u8d77\u6765\u4e00\u76ee\u4e86\u7136\uff01\u60f3\u8981\u4e86\u89e3\u66f4\u591a\u5173\u4e8e\u7684\u5185\u5bb9\u8bf7\u5173\u6ce8\u7c73\u4e91\u516c\u4f17\u53f7\uff01<\/p>\n<p>      \u7248\u672c\u58f0\u660e \u672c\u6587\u8f6c\u8f7d\u4e8e\uff1adev.to \u5982\u6709\u4fb5\u72af\uff0c\u8bf7\u8054\u7cfb\u5220\u9664    <\/p>\n<dl>\n<dt><\/dt>\n<dd>\n   \u4e3a\u4ec0\u4e48\u5728 Eclipse \u7f16\u5199 JavaScript \u65f6\u6ca1\u6709\u81ea\u52a8\u63d0\u793a\uff1f\n <\/dd>\n<\/dl>\n","protected":false},"excerpt":{"rendered":"<p>\u5728 React \u4e2d\u6784\u5efa\u4e00\u6b3e\u53ef\u9760\u7684 Pok\u00e9mon \u6e38\u620f\uff1a\u5f00\u53d1\u8005\u7684\u5192\u9669\uff01 \u6536\u85cf \u4eb2\u7231\u7684\u7f16\u7a0b\u5b66\u4e60\u7231\u597d\u8005\uff0c\u5982\u679c\u4f60\u70b9\u5f00\u4e86\u8fd9\u7bc7\u6587\u7ae0\uff0c\u8bf4\u660e\u4f60\u5bf9\u300a\u5728 React \u4e2d\u6784\u5efa\u4e00\u6b3e\u53ef\u9760\u7684 Pok\u00e9mon \u6e38\u620f\uff1a\u5f00\u53d1\u8005\u7684\u5192\u9669\uff01\u300b\u5f88\u611f\u5174\u8da3\u3002\u672c\u7bc7\u6587\u7ae0\u5c31\u6765\u7ed9\u5927\u5bb6\u8be6\u7ec6\u89e3\u6790\u4e00\u4e0b\uff0c\u4e3b\u8981\u4ecb\u7ecd\u4e00\u4e0b\uff0c\u5e0c\u671b\u6240\u6709\u8ba4\u771f\u8bfb\u5b8c\u7684\u7ae5\u978b\u4eec\uff0c\u90fd\u6709\u5b9e\u8d28\u6027\u7684\u63d0\u9ad8\u3002 s\uff1a\u5355\u4e00\u804c\u8d23 &#8211; \u4e00\u53ea\u795e\u5947\u5b9d\u8d1d\uff0c\u4e00\u4efd\u5de5\u4f5c \u95ee\u9898\uff1apokemoncomponent \u5904\u7406\u6355\u6349\u3001\u6218\u6597\u548c\u663e\u793a\u5206\u6570\uff0c\u8fdd\u53cd\u4e86 srp\u3002 function pokemoncomponent({ pokemon, oncatch, onbattle, score }) { return ( &lt;div&gt; &lt;h2&gt;{pokemon.name}&lt;\/h2&gt; &lt;button onclick={() =&gt; oncatch(pokemon)}&gt;catch&lt;\/button&gt; &lt;button onclick={() =&gt; onbattle(pokemon)}&gt;battle&lt;\/button&gt; &lt;div&gt;score: {score}&lt;\/div&gt; &lt;\/div&gt; ); } \u89e3\u51b3\u65b9\u6848\uff1a\u8d23\u4efb\u5212\u5206\u3002 function pokemoncatcher({ pokemon, oncatch }) { return &lt;button onclick={() =&gt; oncatch(pokemon)}&gt;catch&lt;\/button&gt;; } [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-53307","post","type-post","status-publish","format-standard","hentry","category-16"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/53307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=53307"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/53307\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=53307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=53307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=53307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}