LaravelとReactで作るSPAアプリ第9段です。
続けて関数での切り分けを行っていきましょう。
今回はスケジュールの表示部分を関数化します。
今回でこのシリーズは最後ですね。
Laravel×ReactでつくるSPAスケジュールアプリ【⑨関数化Ⅱ】
まずはナビゲーション部分を切り分けよう
最初は、前回までの復習としてナビゲーションを切り分けましょう。
「Example.js」で切り分けられるナビゲーション部分は以下の通りです。
Example.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
const onClick = n => () => { const nextMonth = month + n if (12 < nextMonth) { setMonth(1) setYear(year + 1) } else if (nextMonth < 1) { setMonth(12) setYear(year - 1) } else { setMonth(nextMonth) } } --省略-- return ( <Fragment> <div className="calender-header"> <h1>{`${year}年${month}月`}</h1> <div className="calender-nav"> <button onClick={onClick(-1)}>{'<先月'}</button> <button onClick={onClick(1)}>{'翌月>'}</button> </div> </div> |
これは前回と同じですね。そこに以下のように記述を移し替えます。
Navigation.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import React from 'react'; function Navigation(props){ const{year,month,setYear,setMonth}=props; const onClick = n => () => { const nextMonth = month + n if (12 < nextMonth) { setMonth(1) setYear(year + 1) } else if (nextMonth < 1) { setMonth(12) setYear(year - 1) } else { setMonth(nextMonth) } } return( <div className="calender-header"> <h1>{`${year}年${month}月`}</h1> <div className="calender-nav"> <button onClick={onClick(-1)}>{'<先月'}</button> <button onClick={onClick(1)}>{'翌月>'}</button> </div> </div> ) } export default Navigation; |
いくつか持ってくる必要があるので、propsにはyear、monthのステートを指定しています。
あとは「Example.js」にこれを連携するのみですね。
Example.js
1 2 3 4 5 6 7 |
import Navigation from './/navigation/Navigation'; //追加 --省略-- return ( <Fragment> <Navigation year={year} month={month} setYear={setYear} setMonth={setMonth}/> |
ビルドしてみると今まで通り正常に動くことも確認できます。
最後にスケジュール取得の部分を関数化して終わりにしましょう!
スケジュール取得部分を関数化する
最後にスケジュール取得部分を関数化します。
とはいえこれもとても簡単です。ナビゲーションと同じようにできます。
今までと同様に「schedule」というフォルダを作成し、その中に「GetSchedule.js」ファイルを作成しましょう。
GetSchedule.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
import React,{useState,useEffect} from 'react'; import axios from 'axios'; function GetSchedule(props){ const userid = props; //スケジュールのデータ const [schedules,setSche] = useState([]) //画面読み込み時に、1度だけ起動 useEffect(()=>{ getPostData(); },[]) //バックエンドからデータ一覧を取得 const getPostData = () =>{ axios .post('/api/posts') .then(response=>{ setSche(response.data); //バックエンドからのデータでスケジュールを更新 console.log(response.data); //確認用ログ }).catch(()=>{ console.log('通信に失敗しました'); }); } //データ格納の空配列を作成 let rows = []; //スケジュールデータをrowに格納する schedules.map((post)=> rows.push({ sch_id:post.id, sch_category:post.sch_category, sch_contents:post.sch_contents, sch_date:post.sch_date, sch_time:post.sch_time }) ); return rows } export default GetSchedule; |
「Example.js」も削減しましょう。
Example.js
1 2 3 4 5 6 |
import GetSchedule from './/schedule/GetSchedule'; //追記 --省略-- //スケジュールのデータを取得する let rows = GetSchedule(); //追加 |
return部分の記述は「GetSchedule」にはないので、そちらは弄りません。
これでかなり削減ができましたね。「Example.js」の行数も130程度になり、
各機能ごとにフォルダ分けが出来たので、修正や機能追加もしやすいです。
最後に、これまで作成したフォルダの中身をGitHubにて公開しておきますね。
https://github.com/Lotusxx/Laravel-React-SPA-Schedule/tree/master/resources/js/components
Laravel×Reactでつくるスケジュールアプリ | |
環境構築 | Git、Reactの導入 |
カレンダー表示 | スケジュール表示 |
スケジュール登録 | スケジュール更新 |
スケジュール削除 | 関数化Ⅰ |
関数化Ⅱ |