- 投稿日:2019-07-24T23:13:28+09:00
【初心者】React&Redux入門を理解するための超入門/環境構築編
未来電子テクノロジー株式会社でインターンをしている文系大学1回生です。
半月ほどReactとReduxの勉強をしています。
理解がなかなか難しいので、勉強したこと、自分なりのポイントをアウトプットしていきます。Reactをブラウザに表示するまでの過程が難しかったのでまとめます。
React at CodePen を用いる
これが一番簡単です。
環境構築なしで、すぐにReactを試せます。create-react-app
$ cd desktop
$ create-react-app mirai
デスクトップにmiraiフォルダができる。
$ cd mirai
$ npm start
で、ブラウザに表示できる。(ロゴがクルクル)しかし、このままではコードがややこしい。
自分でいじろうとした時に、どこをいじれば良いか分からない。
そこで、コードをスッキリさせる。mirai/src/App.jsimport React from 'react'; function App() { return ( <div> Learn React </div> ); } export default App;mirai/src/index.jsimport React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; import * as serviceWorker from './serviceWorker'; ReactDOM.render(<App />, document.getElementById('root')); serviceWorker.unregister();mirai/public/index.js<title>React App</title> <div id="root"></div>こうすると、ブラウザには、Learn Reactと表示されるだけになる。
コードがスッキリして、どこをいじればいいか分かりやすい。HTMLファイル1枚
実はReactは、HTMLファイル1枚でブラウザ表示ができる。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>React</title> <script src="https://unpkg.com/react@16/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script> </head> <body> <div id="root"></div> <script type="text/babel"> let dom = document.querySelector('#root'); let el = ( <div> <h1>Learn React</1> </div> ); ReactDOM.render(el, dom); </script> </body> </html>ブラウザには、Learn Reactと表示される。
あとは、scriptタグ内をいじっていけば良い。
- 投稿日:2019-07-24T22:31:19+09:00
【初心者】React&Redux入門を理解するための超入門
未来電子テクノロジー株式会社でインターンをしている文系大学1回生です。
半月ほどReactとReduxの勉強をしています。
理解がなかなか難しいので、勉強したこと、自分なりのポイントをアウトプットしていきます。ReactやReduxのコードの意味が分からないのは、jsの基礎が抜けているのも一つの原因でした。
そこで、jsの基礎をもう一度確認しました。jsの基礎
英語ですが、とても分かりやすいです。
実際に手を動かして基礎の理解を深められます。ポイント
document.getElementById("hoge")<!DOCTYPE html> <html> <body> <h2>JavaScript in Body</h2> <p id="demo"></p> <script> document.getElementById("demo").innerHTML = "My First JavaScript"; </script> </body> </html>Reactにも出てきます。
任意のHTMLタグで指定したIDにマッチするドキュメント要素を取得するメソッドです。
オブジェクト<script> // Create an object: var car = {type:"Fiat", model:"500", color:"white"}; // Display some data from the object: document.getElementById("demo").innerHTML = "The car type is " + car.type; </script>Reactでは、複数のスタイルを設定するために、スタイル名をプロパティとしたオブジェクトのリテラルを記述するときや、ステートの値を設定するときなどに必要な知識です。
*new演算子の使い方と生成方法まとめ!
これもオブジェクトの勉強になった。Reactにも出てくる構文の基礎を固めるのに最適です。
ポイント
thisvar myObject = { value: 10, show: function() { console.log(this.value); } } myObject.show(); // 10上記は、単にメソッドの呼び出しを行っています。
しかし、thisはそんなに生易しいものでは無いようです。*thisって何?使い方を覚えて、JavaScriptをもっと楽しく使おう!
これらの記事を理解して少し
thisについて詳しくなったと思います。
windowオブジェクトとグローバルの実態なんて知らなかった。。。
superclass Animal { constructor(name) { console.log('親クラスのコンストラクタ'); this.name = name; } speak() { console.log('親クラスのspeakメソッド'); } } class Dog extends Animal { constructor(name, age) { console.log('子クラスのコンストラクタ'); super(name); this.age = age; } speak() { super.speak(); console.log('子クラスのspeakメソッド'); } } const dog = new Dog('ポチ', 1); dog.speak(); console.log('名前: ' + dog.name + '年齢: ' + dog.age); //"名前: ポチ年齢: 1"constructor : 「super()」で親クラスのconstructorを実行する。
constructor以外のメソッド : 「super.メソッド名()」で親クラスのメソッドを実行する。
bindfunction say(){ console.log("こんにちは。" + this + "です"); } var taro = say.bind("hoge"); taro(); //こんにちは。hogeですfunction sum(x, y, z){ return x + y + z; } var keisan = sum.bind(null, 10, 20, 30); console.log(keisan()); //60関数に対してthisや引数を指定することができるメソッド。
非同期処理、コールバック関数redux-saga等の理解に不可欠。
const promise = new Promise((resolve, reject) => { setTimeout(() => { console.log('hello'); resolve(); }, 500); }); promise.then(() => console.log('world!'));
- 投稿日:2019-07-24T22:31:19+09:00
【初心者】React&Redux入門を理解するための超入門/jsの基礎編
未来電子テクノロジー株式会社でインターンをしている文系大学1回生です。
半月ほどReactとReduxの勉強をしています。
理解がなかなか難しいので、勉強したこと、自分なりのポイントをアウトプットしていきます。ReactやReduxのコードの意味が分からないのは、jsの基礎が抜けているのも一つの原因でした。
そこで、jsの基礎をもう一度確認しました。jsの基礎
英語ですが、とても分かりやすいです。
実際に手を動かして基礎の理解を深められます。ポイント
document.getElementById("hoge")<!DOCTYPE html> <html> <body> <h2>JavaScript in Body</h2> <p id="demo"></p> <script> document.getElementById("demo").innerHTML = "My First JavaScript"; </script> </body> </html>Reactにも出てきます。
任意のHTMLタグで指定したIDにマッチするドキュメント要素を取得するメソッドです。
オブジェクト<script> // Create an object: var car = {type:"Fiat", model:"500", color:"white"}; // Display some data from the object: document.getElementById("demo").innerHTML = "The car type is " + car.type; </script>Reactでは、複数のスタイルを設定するために、スタイル名をプロパティとしたオブジェクトのリテラルを記述するときや、ステートの値を設定するときなどに必要な知識です。
*new演算子の使い方と生成方法まとめ!
これもオブジェクトの勉強になった。
アロー関数普通の関数。
hello = function() { return "Hello World!"; }アロー関数。
hello = () => { return "Hello World!"; }リターン省略。
hello = () => "Hello World!";引数あり。
hello = (val) => "Hello " + val;()省略。
hello = val => "Hello " + val;
コールバック関数function doTwice(func) { func(); // 1回目! func(); // 2回目! } // あいさつするだけの関数 function hello() { console.log('Hello!'); } // あいさつを2回実行する doTwice(hello); //Hello! //Hello!hello:コールバック関数 渡すときは()をはずす。
doTwice:高階関数(関数を受け取る関数)
map構文
var array = [ 配列データ ]; array.map( コールバック関数 );基本的な使い方
var items = [1,2,3,4,5]; var result = items.map(function( value ) { //配列の各要素を2倍にする return value * 2; }); console.log( result ); //[2, 4, 6, 8, 10]
mapとアロー関数var result = items.map(( value ) => { //配列の各要素を2倍にする return value * 2; });
Spread Operator配列
const hoge = [2, 3]; console.log([1, ...hoge, 4, 5]) //[1, 2, 3, 4, 5]オブジェクト
const fuga = {name: 'Taro' , age: 25 }; const piyo = {name: 'Jiro' , location : 'Tokyo'}; console.log({...fuga, ...piyo}); //{ name: 'Jiro', age: 25, location: 'Tokyo'}
slicevar array = ['メロン', 'リンゴ', 'イチゴ', 'バナナ']; //開始位置を指定 var result1 = array.slice( 1 ); //開始位置と終了位置を指定 var result2 = array.slice( 1, 3 ); //そのまま返す var result3 = array.slice( ); console.log( result1 ); //["リンゴ", "イチゴ", "バナナ"] console.log( result2 ); //["リンゴ", "イチゴ"] console.log( result3 ); //["メロン", "リンゴ", "イチゴ", "バナナ"]そのまま返すなんて意味がないと思うかもしれない。
しかし、Reduxで配列操作をする時に必要なのだ!
concatvar array1 = ['ho', 'ge']; var array2 = ['wa', 'fu']; var result = array1.concat(array2); console.log(result);// ho,ge,wa,fu配列を結合できる。
とにかくReduxでは配列を直接いじりたくない。
イベント<button onclick="document.getElementById('demo').innerHTML = Date()">The time is?</button>上記は
onclickイベント。クリック時に発動。
他に、onchangeonmouseoveronkeydownなどがある。Reactにも出てくる構文の基礎を固めるのに最適です。
ポイント
thisvar myObject = { value: 10, show: function() { console.log(this.value); } } myObject.show(); // 10上記は、単にメソッドの呼び出しを行っています。
しかし、thisはそんなに生易しいものでは無いようです。*thisって何?使い方を覚えて、JavaScriptをもっと楽しく使おう!
これらの記事を理解して少し
thisについて詳しくなったと思います。
windowオブジェクトとグローバルの実態なんて知らなかった。。。
superclass Animal { constructor(name) { console.log('親クラスのコンストラクタ'); this.name = name; } speak() { console.log('親クラスのspeakメソッド'); } } class Dog extends Animal { constructor(name, age) { console.log('子クラスのコンストラクタ'); super(name); this.age = age; } speak() { super.speak(); console.log('子クラスのspeakメソッド'); } } const dog = new Dog('ポチ', 1); dog.speak(); console.log('名前: ' + dog.name + '年齢: ' + dog.age); //"名前: ポチ年齢: 1"constructor : 「super()」で親クラスのconstructorを実行する。
constructor以外のメソッド : 「super.メソッド名()」で親クラスのメソッドを実行する。
bindfunction say(){ console.log("こんにちは。" + this + "です"); } var taro = say.bind("hoge"); taro(); //こんにちは。hogeですfunction sum(x, y, z){ return x + y + z; } var keisan = sum.bind(null, 10, 20, 30); console.log(keisan()); //60関数に対してthisや引数を指定することができるメソッド。
Reactでは、
this.hogehoge = this,hogehoge.bind(this);のように登場。
非同期処理、コールバック関数redux-saga等の理解に不可欠。
const promise = new Promise((resolve, reject) => { setTimeout(() => { console.log('hello'); resolve(); }, 500); }); promise.then(() => console.log('world!'));
- 投稿日:2019-07-24T22:15:47+09:00
【初心者】React&Redux入門を理解するための超入門/jsの基礎編
未来電子テクノロジー株式会社でインターンをしている文系大学1回生です。
半月ほどReactとReduxの勉強をしています。
理解がなかなか難しいので、勉強したこと、自分なりのポイントをアウトプットしていきます。ReactやReduxのコードの意味が分からないのは、jsの基礎が抜けているのも一つの原因でした。
そこで、jsの基礎をもう一度確認しました。jsの基礎
英語ですが、とても分かりやすいです。
実際に手を動かして基礎の理解を深められます。ポイント
document.getElementById("hoge")<!DOCTYPE html> <html> <body> <h2>JavaScript in Body</h2> <p id="demo"></p> <script> document.getElementById("demo").innerHTML = "My First JavaScript"; </script> </body> </html>Reactにも出てきます。
任意のHTMLタグで指定したIDにマッチするドキュメント要素を取得するメソッドです。
オブジェクト<script> // Create an object: var car = {type:"Fiat", model:"500", color:"white"}; // Display some data from the object: document.getElementById("demo").innerHTML = "The car type is " + car.type; </script>Reactでは、複数のスタイルを設定するために、スタイル名をプロパティとしたオブジェクトのリテラルを記述するときや、ステートの値を設定するときなどに必要な知識です。
*new演算子の使い方と生成方法まとめ!
これもオブジェクトの勉強になった。Reactにも出てくる構文の基礎を固めるのに最適です。
ポイント
thisvar myObject = { value: 10, show: function() { console.log(this.value); } } myObject.show(); // 10上記は、単にメソッドの呼び出しを行っています。
しかし、thisはそんなに生易しいものでは無いようです。*thisって何?使い方を覚えて、JavaScriptをもっと楽しく使おう!
これらの記事を理解して少し
thisについて詳しくなったと思います。
windowオブジェクトとグローバルの実態なんて知らなかった。。。
superclass Animal { constructor(name) { console.log('親クラスのコンストラクタ'); this.name = name; } speak() { console.log('親クラスのspeakメソッド'); } } class Dog extends Animal { constructor(name, age) { console.log('子クラスのコンストラクタ'); super(name); this.age = age; } speak() { super.speak(); console.log('子クラスのspeakメソッド'); } } const dog = new Dog('ポチ', 1); dog.speak(); console.log('名前: ' + dog.name + '年齢: ' + dog.age); //"名前: ポチ年齢: 1"constructor : 「super()」で親クラスのconstructorを実行する。
constructor以外のメソッド : 「super.メソッド名()」で親クラスのメソッドを実行する。
bind
- 投稿日:2019-07-24T20:17:18+09:00
非エンジニアの社長にReactとは何かを説明する①
非エンジニアの社長にReactとは何かを説明する
最近、エンジニアのデイリーMTGを始めたのですが、ありがたいことに非エンジニアの社長もオブザーバーとして参加してくれています。
とはいえ、やはりエンジニアのデイリーMTGの内容となると技術的な内容が多くなるので非エンジニアの面々には分からない部分が多いはずです。
このままMTGを続けるのは申し訳ないですし、非エンジニアにも分かるように説明するという視点で記事を書いてみるのも面白いかなと思うので、つらつらと書いてみようかと思います。
まず、最近主に扱っているReactについて。なお、説明がややこしくなるのを避けるため、厳密に正確な説明をすることは放棄している部分があります。
悪しからず。ブラウザとjavascript
いきなりReactの説明を始めることは出来ないので、その前提となるブラウザとjavascriptから説明を始めます。
ブラウザ
ブラウザは、ChromeやInternetExploler,Edgeと言ったWebページを閲覧するのに使っているものです。
さて、このブラウザにはエンジニアは当たり前のように使うものの、一般の方はまず使わない機能が搭載されています。
何らかのページを開いている状態で「F12」ボタンを押して見てください。おそらく、開発者コンソールとかDevToolとかそんな感じの名前のものが出てくるかと思います。
画面上部にタブがあるので、Elementあるいは要素(ブラウザによって表示は違います)を選んでください。そうすると、以下のような感じに
<>で囲まれた文字が羅列されていると思います。この一見、よく分からない文字列の羅列がいわゆるHTMLと呼ばれる形式で書かれたページのソースで、ブラウザ上に表示されているWebページの元です。
コンテンツとして載せる画像や動画は別として、Webページは基本的にこのHTML形式のデータをブラウザが読み取って表示しています。
(ちなみに、Webページ上の要素を右クリックして、「検証」を選択すると、その要素がソース上の何に相当するのか表示してくれます。興味があれば是非)
大雑把な言い方をすれば、Web系のエンジニアはこの文字列を作ったり操作したりするプログラムを書くのが仕事というわけです。JavaScript
先ほど、「WebページはHTML形式のデータをブラウザが読み取って表示しているもの」と説明しましたが、
実は、HTML形式のデータだけではWebページはほとんどあるいは全く動きがないものになります。
具体的には、阿部寛のホームページのような感じです。
リンクを踏んでページを切り替える以外に画面を変化させる方法がありません。ただ、このようなページは極めて例外的です。実際、普段皆さんがご覧になっているWebページは、もっと色々な動きがついているはずです。
例えば、検索欄に何か打ち込んだらサジェストが出たり、スクロールしたら徐々に要素が出てきたりとかですね。これがどうやって実現されているかと言うと、ブラウザ上で「JavaScript」という言語が動き、Htmlの内容を書き換えることによって実現されています。
実際、先ほど紹介した開発者ツールのElementを見ながら画面上の動きを起こすと、
どこかしら要素に変化があることがわかるかと思います。(ものによっては一か所値が書き換わるだけで分かりにくかったりもしますが…)WebページのUI・UXがどんどんリッチになっていっている現代、このJavaScriptの役割もますます大きくなってきており、いわゆる「フロントエンドエンジニア」と呼ばれる人々は主にこのJavaScriptを扱っています。
そして、今回説明しようとしているReactはこのjavascriptをうまく使うための便利な道具集(ライブラリ)の一つです。
Reactは名前しか出てきていませんが、長くなってきたのでこの辺りで。
次回に続きます。
- 投稿日:2019-07-24T17:27:27+09:00
React.useEffectでfetchをするhookの実装方法
はじめに
本記事は過去記事のまとめです。とはいえ、スクリーンキャストは新しい内容です。
スクリーンキャスト
? How to develop React useFetch hook. https://t.co/HEx5TwgUAo with code-surfer v2. ? #reactjs #react #javascript #reacthooks pic.twitter.com/QKukxnabbJ
— Daishi Kato (@dai_shi) July 2, 2019ゆっくり見るには、リンクを開いて、右矢印を押して進めてください。
各ステップの記事
おわりに
当初の記事に載せたコードもほぼ同じものです。色々改善して最後に作成したスクリーンキャストのコードが分かりやすくなっていると思います。
- 投稿日:2019-07-24T16:35:35+09:00
Create React AppからStorybookの追加が超簡単だった。
概要
ReactでStorybook使ってみたくて、色々調べてた結果、
設定面倒なのかなーと思ってたらCreate React Appからの追加が超簡単だったという話です。環境構築
今回は
yarnでゴリゴリ入れていきましょう。yarn global add create-react-app yarn create react-app sample-storybook cd sample-storybook yarn add storybook yarn storybookここまで来ると、「お?Create React Appで作ったプロジェクトやんけ!」
と勝手に解釈してくれて、良い感じに雛型を作ってくれます。超便利ですね。再度
yarn storybookを叩くと、http://localhost:9009でStorybookの
サーバーが立ち上がります。以上です。コンポーネント追加
Material-UIのボタンを追加してみます。
(実際は自作のコンポーネントを追加するような使い方になると思いますが)yarn add @material-ui/coresrc/stories/index.jsimport React from 'react'; import { storiesOf } from '@storybook/react'; import { action } from '@storybook/addon-actions'; import { linkTo } from '@storybook/addon-links'; import { Button, Welcome } from '@storybook/react/demo'; + import MaterialButton from '@material-ui/core/Button'; storiesOf('Welcome', module).add('to Storybook', () => ( <Welcome showApp={linkTo('Button')} /> )); storiesOf('Button', module) .add('with text', () => ( <Button onClick={action('clicked')}>Hello Button</Button> )) .add('with some emoji', () => ( <Button onClick={action('clicked')}>? ? ? ?</Button> )) + .add('material', () => ( + <MaterialButton + variant="contained" + color="primary" + onClick={action('clicked')} + > + Primary + </MaterialButton> + ));
- 投稿日:2019-07-24T11:08:48+09:00
43種ものデータ変形がブラウザだけでできる『transform』が便利そう
transformは、なんでもデータ変形サービスで、JSONからYAML、HTMLからJSXへの変形はもちろん、JSONやGraphQLのIDLからTypeScriptのinterfaceを生成するようなものまで手広く対応しているサービスだ。
特別なツールをインストールする必要はなくブラウザだけで動作する。
現在、43種類のデータ変形に対応しており、対応している変形パターンは下記のとおり:
- SVG to JSX
- SVG to React Native
- HTML to JSX
- JSON to React PropTypes
- JSON to Flow
- JSON to GraphQL
- JSON to TypeScript
- JSON to MobX-State-Tree Model
- JSON to Sarcastic
- JSON to io-ts
- JSON to Rust Serde
- JSON to Mongoose Schema
- JSON to Big Query Schema
- JSON to MySQL
- JSON to Scala Case Class
- JSON to Go Struct
- JSON to YAML
- JSON to JSDoc
- JSON Schema
- JSON to TypeScript
- JSON to OpenAPI Schema
- CSS to JS Objects
- CSS to template literal
- JavaScript to JSON
- GraphQL to TypeScript
- GraphQL to Flow
- GraphQL to JAVA
- GraphQL to Resolvers Signature
- GraphQL to Introspection JSON
- GraphQL to Schema AST
- GraphQL to Fragment Matcher
- GraphQL to Components
- GraphQL to TypeScript MongoDB
- JSON-LD to N-Quads
- JSON-LD to Expanded
- JSON-LD to Compacted
- JSON-LD to Flattened
- JSON-LD to Framed
- JSON-LD to Normalized
- Flow to Typescript
- XML to JSON
- YAML to JSON
- Markdown to HTML
どんなときに使うといいか?
例えば
- Reactコンポーネントを作っていて、素材となるHTMLをJSXにしたいとき。
- JSON APIのレスポンスをTypeScriptで扱う際、レスポンスJSONの型をTypeScriptのinterfaceで定義したいとき
- ScalaやGoでも同様
こういったシーンで、手っ取り早く仕事を済ますときに使えそう。
- 投稿日:2019-07-24T00:24:12+09:00
React+Typescriptでカウンターアプリ作成に難航したお話〜3の倍数の時モーダル出現が難しい訳ないじゃん....〜
こんなものを作りました。
Reactの基本を学ぶためにカウターを作りました。
3の倍数のとき、モーダルが立ち上がります。全体を通して簡単でしたが、苦労した点がありました。
☆Special Thanks☆
・React Component ライフサイクル ひとめぐり (CodeSandbox 付き)
・js STUDIO 【componentDidUpdate】
信じられない...ライフサイクルを考えて実装しないといけないなんて...
[+1]を押下すると、カウントの値が1づつ増える。増えた値を判定してその値が3の倍数であったらモーダルを表示するフラグをtrueにする。この流れを1つの関数として以下のように実装しました。
App.tsxincrement() { this.setState(prevState => ({ count: prevState.count + 1, })); if(this.state.count && this.state.count % 3 === 0){ this.setState({isModalOpen: true}); } }信じられない4が3の倍数だなんて...(違う)
setStateでcountを変えても、全てを一気に書き換えるというsetStateの特性上、
this.state.countを直後に呼び出してもそのstateは更新前の状態になっている。これが想い通りにならない原因のようだった。そこで、コンポーネントの更新を終えてすぐに関数を呼び出したい時(DOMを操作したい時)は、
componentDidUpdateを使うといいよ、ということでしたので試しました。
React入門でこのカウンターを作っていたので「ライフサイクルとかとりあえずいいやっ」そんな軽い気持ちで読み飛ばしていたせいで引っかかってしまいました。まさかの落とし穴...無限ループに陥るべからず...
componentDidUpdateを使って、countに[+1]づつ足していき、値が3の倍数かどうかを判定するという実装をしようと試みた矢先の出来事でした。consoleにはけたたましい数のエラーがっ(。゚(゚´Д`゚)゚。)52回でループが止まってよかった...
こんなエラーも出てました。Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.
ふむふむ。。なるほど。(Google先生によると)
最大更新深度を超えました。これは、コンポーネントがcomponentWillUpdateまたはcomponentDidUpdate内でsetStateを繰り返し呼び出すと発生する可能性があります。 Reactは、無限ループを防ぐために入れ子になった更新の数を制限します。
ということのようだが....
何だろう...このコードの何がいけないの?...
App.tsxincrement() { this.setState(prevState => ({ count: prevState.count + 1, })); } componentDidUpdate(prevProps: object, prevState: AppState){ this.judge(prevState.count + 1); //←問題はこの部分に条件式がないこと } judge(num: number) { if(this.state.count && this.state.count % 3 === 0) { this.setState({isModalOpen: true}); } }【上記コードの問題点】
(1)[+1]を押下する
↓
(2)prevState.count+1 した値をcontへ渡す
↓
(3)componentDidUpdate内で、countの値を判定し、3の倍数(かつ0以外)のときモーダル表示フラグisModalOpenをtrueにする(3)において、judge関数内で状態変更がなされた後、その状態の変更によって再度
componentDidUpdateがトリガされ、setStateによって状態が再びtrueに設定される。これにより、componentDidUpdateが何度もトリガされる。このようになっており無限ループが始まってしまう問題をはらんでいます。Reactは無限ループを防ぐ仕様になっていてよかった。問題ということなので、下記の【実行したいこと】をもとに問題箇所のコードを書き直しました。
App.tsxcomponentDidUpdate(prevProps: object, prevState: AppState){ if (prevState.count !== this.state.count) { this.judge(prevState.count + 1); } }【実行したいこと】
・[+1]を押下する
↓
・押下する前の値prevState.countを補完する
↓
・prevState.countと押下後の値countを比較して違っている場合だけjudge()を発火させる(★)
↓
・countが3の倍数(かつ0以外)のときモーダル表示フラグisModalOpenをtrueにする問題の箇所に、(★)の条件式を追加して解決しました。
まとめ
Reactの勉強を始めたとき、ライフサイクルについてはサラーっと流してしまいましたが、すぐに必要な場面に出会うことができ大変理解が深まったと思います。
初心者だからと言って安易に読み飛ばしてはいけません!
入門書だからここは飛ばしていいよなんていう甘い言葉を鵜呑みにしてはいけません!!!この記事が、桂三度さん思い出すきっかけになれれば幸いです。
発展課題
5の倍数だけ犬っぽくなるを実装する
まとめのコード
(※classNameは省いています)
App.tsximport React, { Component } from 'react'; import { Card, Statistic } from 'semantic-ui-react'; import './App.css'; interface AppState { count: number; isModalOpen: boolean; } class App extends Component<{}, AppState> { constructor(props: {}) { super(props); this.state = { count: 0, isModalOpen: false, } } modalOpen() { this.setState({isModalOpen: true}); } modalClose() { this.setState({isModalOpen: false}); } increment() { this.setState(prevState => ({ count: prevState.count + 1, })); } componentDidUpdate(prevProps: object, prevState: AppState){ if (prevState.count !== this.state.count) { this.judge(prevState.count + 1); } } decrement() { this.setState(prevState => ({ count: prevState.count - 1, })); } judge(num: number) { console.log(this.state.count); if(this.state.count && this.state.count % 3 === 0) { this.setState({isModalOpen: true}); } } render() { const { count } = this.state; let modal; if(this.state.isModalOpen) { modal = ( <div className="modal"> <div className="modal-inner"> <div className="modal-hedder">☆3の倍数お知らせBot☆</div> <div className="modal-value"> <h2>{count}</h2> <p>{count}は3の倍数です。</p> </div> <button onClick={() => {this.modalClose()}}> とじる </button> </div> </div> ) } return ( <div> {modal} <header> <h1>カウンター</h1> </header> <Card> <Statistic> <Statistic.Value> {count} </Statistic.Value> </Statistic> <Card.Content> <div> <button onClick={() => this.decrement()}> -1</button> <button onClick={() => this.increment()}>+1 </button> </div> </Card.Content> </Card> </div> ); } } export default App;




