{"id":4240,"date":"2019-05-06T23:47:11","date_gmt":"2019-05-06T14:47:11","guid":{"rendered":"https:\/\/greentown.tokyo\/?p=4240"},"modified":"2019-05-06T23:47:11","modified_gmt":"2019-05-06T14:47:11","slug":"react-hooks","status":"publish","type":"post","link":"https:\/\/greentown.tokyo\/?p=4240","title":{"rendered":"ReactHooks"},"content":{"rendered":"<p>GW\u304c\u7d42\u308f\u308b\u301c<\/p>\n<p>\u4f1a\u793e\u3044\u304d\u305f\u304f\u306a\u3044\u306a\u3041\u3002\u3002<\/p>\n<p>\u5f15\u304d\u7d9a\u304d\u3053\u3061\u3089\u3092&#8230;<\/p>\n<p><a href=\"https:\/\/oukayuka.booth.pm\/items\/1312652\">https:\/\/oukayuka.booth.pm\/items\/1312652<\/a><\/p>\n<p><a href=\"https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/b58a45d3559cc75109305d27be6d5ea8.png\"><img decoding=\"async\" class=\"alignnone size-medium wp-image-4130\" src=\"https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/b58a45d3559cc75109305d27be6d5ea8-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/b58a45d3559cc75109305d27be6d5ea8-300x300.png 300w, https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/b58a45d3559cc75109305d27be6d5ea8-150x150.png 150w, https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/b58a45d3559cc75109305d27be6d5ea8-768x766.png 768w, https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/b58a45d3559cc75109305d27be6d5ea8-100x100.png 100w, https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/b58a45d3559cc75109305d27be6d5ea8-400x400.png 400w, https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/b58a45d3559cc75109305d27be6d5ea8-60x60.png 60w, https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/b58a45d3559cc75109305d27be6d5ea8.png 1012w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>\u3084\u3063\u3068Hooks\u306e\u3068\u3053\u307e\u3067\u30ad\u30bf..<\/p>\n<p><a href=\"https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/1fa30bcc78b7d79a827c744271b2ccb2.png\"><img decoding=\"async\" class=\"alignnone size-medium wp-image-4241\" src=\"https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/1fa30bcc78b7d79a827c744271b2ccb2-300x172.png\" alt=\"\" width=\"300\" height=\"172\" srcset=\"https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/1fa30bcc78b7d79a827c744271b2ccb2-300x172.png 300w, https:\/\/greentown.tokyo\/wp-content\/uploads\/2019\/05\/1fa30bcc78b7d79a827c744271b2ccb2.png 606w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>\u30af\u30e9\u30b9\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3067\u66f8\u3044\u3066\u3044\u305f\u3053\u308c\u3092\u3001\u95a2\u6570\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306b\u66f8\u304d\u76f4\u3059\u3002<\/p>\n<h3>useState<\/h3>\n<pre class=\"lang:js decode:true \">import React, { FC, useState } from 'react';<\/pre>\n<p>useState\u3092\u4f7f\u3046<\/p>\n<pre class=\"lang:js decode:true\">const App: FC = () =&gt; {\r\n  \/\/ useState(\u5f15\u6570\uff1aState\u5909\u6570\u521d\u671f\u5024)\r\n  \/\/ \u30af\u30e9\u30b9\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u30fc\u306e\u300cthis.state = { count:0 };\u300d\u3068\u540c\u3058\r\n  \/\/ useSState()\u306f\u4e8c\u3064\u306e\u623b\u308a\u5024\u3092\u8fd4\u3059\r\n  \/\/   - state\u5909\u6570\r\n  \/\/   - \u30bb\u30c3\u30bf\u30fc\u95a2\u6570\r\n  const [count, setCount] = useState(0);\r\n\r\n  const increment = () =&gt; {\r\n    \/\/\/\/ this.state\u306b\u5024\u3092\u5165\u308c\u308b\u3053\u3068\u306f\u3067\u304d\u306a\u3044\r\n    \/\/\/\/ this.state\u3067\u53c2\u7167\u306f\u3067\u304d\u308b\r\n    \/\/this.setState(prevState =&gt; ({\r\n    \/\/  count: prevState.count + 1,\r\n    \/\/}));\r\n    setCount(count + 1);\r\n  }\r\n\r\n  \/\/decrement = (e: SyntheticEvent) =&gt; {\r\n  const decrement = () =&gt; {\r\n    \/\/e.preventDefault();\r\n    \/\/this.setState(prevState =&gt; ({\r\n    \/\/  count: prevState.count - 1,\r\n    \/\/}));\r\n    setCount(count - 1);\r\n  }\r\n\r\n  return (\r\n    &lt;div className=\"container\"&gt;\r\n      &lt;header&gt;\r\n        &lt;h1&gt;\u30ab\u30a6\u30f3\u30bf\u30fc&lt;\/h1&gt;\r\n      &lt;\/header&gt;\r\n      &lt;Card&gt;\r\n        &lt;Statistic className=\"number-board\"&gt;\r\n          &lt;Statistic.Label&gt;count&lt;\/Statistic.Label&gt;\r\n          &lt;Statistic.Value&gt;{count}&lt;\/Statistic.Value&gt;\r\n        &lt;\/Statistic&gt;\r\n        &lt;Card.Content&gt;\r\n          &lt;div className=\"ui two buttons\"&gt;\r\n            &lt;Button color=\"pink\" onClick={decrement}&gt;\r\n              -1\r\n            &lt;\/Button&gt;\r\n            &lt;Button color=\"blue\" onClick={increment}&gt;\r\n              +1\r\n            &lt;\/Button&gt;\r\n          &lt;\/div&gt;\r\n        &lt;\/Card.Content&gt;\r\n      &lt;\/Card&gt;\r\n    &lt;\/div&gt;\r\n  );\r\n}<\/pre>\n<p>\u3059\u3054\u3044\u30b9\u30c3\u30ad\u30ea\u304b\u3051\u308b\u30fb\u30fb\u3002\u3057\u3085\u3054\u3044\u30fb\u30fb\u3002<\/p>\n<p>useState\u306e\u623b\u308a\u3092\u30bb\u30c3\u30c8\u3059\u308b\u5909\u6570\u306e\u540d\u79f0\u306f\u3001\u4e00\u610f\u306b\u3059\u308b\u3002<\/p>\n<pre class=\"lang:js decode:true \">const [hoge, setHoge] = useState(15);\r\nconst [fuga, setFuga] = useState('test');<\/pre>\n<p>&nbsp;<\/p>\n<h3>EffectHook<\/h3>\n<p>\u5148\u65e5React\u306eLT\u4f1a\u3067\u8272\u3005\u805e\u3044\u3066\u304d\u305f\u306e\u3060\u3051\u3069\u3001EffectHook\u3092\u8a71\u984c\u306b\u3057\u3066\u305f\u4eba\u304c\u4f55\u4eba\u304b\u3044\u3066\u3001\u305d\u306e\u6642\u306f\u3001\u4f55\u8a00\u3063\u3066\u308b\u306e\u3055\u3063\u3071\u3057\u3067\u3057\u305f\u304c&#8230;\u4eca\u56de\u306e\u304a\u52c9\u5f37\u3067\u7406\u89e3\u3057\u305f\u3067\u3059\u3002<\/p>\n<ul>\n<li>\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u3092\u6271\u3046<\/li>\n<li>componentDidMount(),componentDidUpdate(),componentWillUnmount()\u306b\u76f8\u5f53\u3059\u308b\u6a5f\u80fd\u3092\u5b9f\u73fe\u3059\u308b<\/li>\n<\/ul>\n<pre class=\"lang:js decode:true \">\/\/import React, { Component } from 'react';\r\nimport React, { FC, useEffect, useState } from 'react';\r\nimport { Button, Card, Icon, Statistic } from 'semantic-ui-react'\r\nimport 'semantic-ui-css\/semantic.min.css';\r\nimport '.\/App.css';\r\n\r\nconst LIMIT = 60;\r\n\r\n\/\/interface AppState {\r\n\/\/  timeLeft: number;\r\n\/\/}\r\n\r\nconst App: FC = () =&gt; {\r\n  \/\/constructor(props: {}) {\r\n  \/\/  super(props);\r\n  \/\/  this.state = { timeLeft: LIMIT }\r\n  \/\/}\r\n  const [timeLeft, setTimeLeft] = useState(LIMIT);\r\n\r\n  const reset = () =&gt; {\r\n    \/\/ this.setState({ timeLeft: LIMIT });\r\n    setTimeLeft(LIMIT);\r\n  }\r\n\r\n  const tick = () =&gt; {\r\n    \/\/this.setState(prevState =&gt; ({ timeLeft: prevState.timeLeft -1}));\r\n    setTimeLeft(prevTime =&gt; (prevTime === 0 ? LIMIT: prevTime - 1));\r\n  }\r\n\r\n  \/*\r\n  componentDidMount = () =&gt; {\r\n    \/\/ setInterval..JS\u7d44\u307f\u8fbc\u307f\u95a2\u6570\r\n    \/\/ setInterval\u306f\u8b58\u5225ID\u3092\u8fd4\u3059\r\n    this.timerId = setInterval(this.tick, 1000);\r\n  }\r\n\r\n  componentDidUpdate = () =&gt; {\r\n    const { timeLeft } = this.state;\r\n    if (timeLeft === 0) {\r\n      this.reset();\r\n    }\r\n  }\r\n\r\n  componentWillUnmount = () =&gt; {\r\n    clearInterval(this.timerId as NodeJS.Timer);\r\n  }\r\n\r\n  timerId?: NodeJS.Timer;\r\n  *\/\r\n  useEffect(() =&gt; {\r\n    \/\/ componentDidMount()\u306e\u4ee3\u308f\u308a\r\n    \/\/ \u3053\u306e\u90e8\u5206\u304c\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u76f4\u524d\u306b\u5b9f\u884c\u3055\u308c\u308b\r\n    const timerId = setInterval(tick, 1000);\r\n    \r\n    \/\/ componentWillUnmount()\u306e\u4ee3\u308f\u308a\r\n    \/\/ \u623b\u308a\u5024\u306b\u95a2\u6570\u3092\u8a2d\u5b9a\u3002\u30a2\u30f3\u30de\u30a6\u30f3\u30c8\u76f4\u524d\u306b\u5b9f\u884c\u3055\u308c\u308b\r\n    return () =&gt; clearInterval(timerId);\r\n  }, []);\r\n  \/\/ \u2191\u7b2c\u4e8c\u5f15\u6570\u306f\u914d\u5217\u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u3002\r\n  \/\/  \u4efb\u610f\u306e\u5909\u6570\u3092\u5165\u308c\u3066\u304a\u304f\u3068\u3001\u305d\u306e\u5024\u304c\u524d\u56de\u306e\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u6642\u3068\u5909\u308f\u3089\u306a\u3051\u308c\u3070\u3001\u7b2c\u4e00\u5f15\u6570\u3067\u6e21\u3055\u308c\u305f\u95a2\u6570\u306e\u4e2d\u8eab\u306e\u526f\u4f5c\u7528\u51e6\u7406\u304c\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u308b\r\n  \/\/     \u2192[]\u306e\u5024\u306b\u5909\u66f4\u304c\u3042\u308c\u3070\u3001const timerId = setInterval(tick, 1000);\u304c\u5b9f\u884c\u3055\u308c\r\n  \/\/      []\u306e\u5024\u306b\u5909\u66f4\u304c\u306a\u3051\u308c\u3070\u3001const timerId = setInterval(tick, 1000);\u306f\u5b9f\u884c\u3055\u308c\u306a\u3044\r\n  \/\/  \u7b2c\u4e8c\u5f15\u6570\u306b\u7a7a\u306e\u914d\u5217\u3092\u6e21\u3059\u3068setInterval()\u306e\u3068\u3053\u308d\u306f\u521d\u56de\u3057\u304b\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3055\u308c\u306a\u3044\r\n  \/\/  \u203b\u521d\u56de\u306e\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u3057\u304b\u3057\u305f\u304f\u306a\u3044\u5834\u5408\u306f\u3001\u7b2c\u4e8c\u5f15\u6570\u306b\u7a7a\u306e\u914d\u5217\u3092\u6e21\u3059\r\n\r\n  return (\r\n    &lt;div className=\"container\"&gt;\r\n      &lt;header className=\"App-header\"&gt;\r\n        &lt;h1&gt;Timer&lt;\/h1&gt;\r\n        &lt;Card&gt;\r\n          &lt;Statistic className=\"number-board\"&gt;\r\n            &lt;Statistic.Label&gt;time&lt;\/Statistic.Label&gt;\r\n            &lt;Statistic.Value&gt;{timeLeft}&lt;\/Statistic.Value&gt;\r\n          &lt;\/Statistic&gt;\r\n          &lt;Card.Content&gt;\r\n            &lt;Button color=\"pink\" fluid onClick={reset}&gt;\r\n              &lt;Icon name=\"bolt\" \/&gt;Reset!\r\n            &lt;\/Button&gt;\r\n          &lt;\/Card.Content&gt;\r\n        &lt;\/Card&gt;\r\n      &lt;\/header&gt;\r\n    &lt;\/div&gt;\r\n  );\r\n}\r\n\r\nexport default App;<\/pre>\n<p>&nbsp;<\/p>\n<p>\u30bf\u30a4\u30de\u30fc\u306e\u30b3\u30fc\u30c9\u3092Custom Hook\u3067\u52d5\u304f\u3068\u3053\u307e\u3067\u66f8\u3044\u305f\u3002<\/p>\n<p>\u5909\u66f4\u3057\u305f\u306e\u306f<\/p>\n<ul>\n<li>\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210\u5909\u66f4\n<ul>\n<li>src\/components\/App.tsx \u4f5c\u6210<\/li>\n<li>src\/containers\/App.tsx \u4f5c\u6210<\/li>\n<\/ul>\n<\/li>\n<li>src\/index.tsx \u4fee\u6b63<\/li>\n<li>src\/App.css \u3092 src\/components\/ \u306b\u79fb\u52d5<\/li>\n<\/ul>\n<p>\u304f\u3089\u3044\u304b\u306a\u301c<\/p>\n<p>\u6c17\u3065\u3044\u3066\u3057\u307e\u3063\u305f\u3093\u3060\u3051\u3069\u3001\u3082\u3057\u304b\u3057\u3066\u300cimport &#8216;semantic-ui-css\/semantic.min.css&#8217;;\u300d\u306f index.tsx\u306b\u66f8\u304f\u3079\u304d\u3060\u3063\u305f\uff1f\uff1f<\/p>\n<h6>Hooks\u30e1\u30e2<\/h6>\n<ul>\n<li>Hooks\u3092\u547c\u3079\u308b\u306e\u306f\u95a2\u6570\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8 or Custom Hook\u306e\u6642\u3060\u3051<\/li>\n<li>Hooks\u3092\u8a18\u8ff0\u3059\u308b\u306e\u306f\u95a2\u6570\u306e\u30c8\u30c3\u30d7\u30ec\u30d9\u30eb\u3067\u66f8\u304f\u3002\u6761\u4ef6\u5206\u5c90\u3001\u30eb\u30fc\u30d7\u3001\u30cd\u30b9\u30c8\u3057\u305f\u95a2\u6570\u306b\u66f8\u3044\u3061\u3083\u30c0\u30e1\uff08\u3053\u3053\u3088\u304f\u308f\u304b\u3063\u3066\u306a\u3044\uff09<\/li>\n<li>Custom Hook\u306e\u95a2\u6570\u540d\u306f useHoge\u306e\u3088\u3046\u306b\u3001\u982d\u306b\u300cuse\u300d\u3092\u3064\u3051\u308b<\/li>\n<\/ul>\n<p>\u3053\u306e\u7ae0\u898b\u8fd4\u3059\u5fc5\u8981\u3042\u308b\u306a\u3041\u30fb\u30fb\u30fb<\/p>\n<p>\u6b8b\u308a<\/p>\n<ul>\n<li>\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0<\/li>\n<li>Redux<\/li>\n<\/ul>\n<p>\u307e\u305f\u660e\u65e5\u3084\u308d\u3046\u30fb\u30fb<\/p>\n","protected":false},"excerpt":{"rendered":"<p>GW\u304c\u7d42\u308f\u308b\u301c \u4f1a\u793e\u3044\u304d\u305f\u304f\u306a\u3044\u306a\u3041\u3002\u3002 \u5f15\u304d\u7d9a\u304d\u3053\u3061\u3089\u3092&#8230; https:\/\/oukayuka.booth.pm\/items\/1312652 &nbsp; \u3084\u3063\u3068Hooks\u306e\u3068\u3053\u307e\u3067\u30ad\u30bf. &#8230; <\/p>\n","protected":false},"author":1,"featured_media":4130,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[97],"tags":[],"class_list":["post-4240","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-react"],"_links":{"self":[{"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/posts\/4240"}],"collection":[{"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4240"}],"version-history":[{"count":7,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/posts\/4240\/revisions"}],"predecessor-version":[{"id":4248,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/posts\/4240\/revisions\/4248"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=\/wp\/v2\/media\/4130"}],"wp:attachment":[{"href":"https:\/\/greentown.tokyo\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/greentown.tokyo\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}