登録済みユーザーがログインしてダッシュボードのページに入った時に、自分のプロフィール情報をさらに入力できるよう、CreateProfile.jsというファイルを作成しました。(フォルダはcomponent/profile-form/CreateProfile.jsで、新しく作成)
①component/profile-form/CreateProfile.jsの作成 ユーザーが会社やウェブサイト、スキル、SNS情報などを入力できるようにした
少し長いコードなのですが、全体的に見るとパターン化されています。開発者向けのソーシャル・ネットワーキングのアプリケーションなので、プロフィールには様々な内容が記入できるようになっています。
import React, { useState, Fragment } from "react"; import PropTypes from "prop-types"; import { connect } from "react-redux"; const CreateProfile = props => { const [formData, setFormData] = useState({ company: "", website: "", location: "", status: "", skills: "", githubusername: "", bio: "", twitter: "", facebook: "", linkedin: "", youtube: "", instagram: "" }); const [displaySocialImputs, toggleSocialImputs] = useState(false); const { company, website, location, status, skills, githubusername, bio, twitter, facebook, linkedin, youtube, instagram } = formData; const onChange = e => setFormData({ ...formData, [e.target.name]: e.target.value }); return ( <Fragment> <h1 className='large text-primary'>Create Your Profile</h1> <p className='lead'> <i className='fas fa-user' /> Let's get some information to make your profile stand out </p> <small>* = required field</small> <form className='form'> <div className='form-group'> <select name='status' value={status} onChange={e => onChange(e)}> <option value='0'>* Select Professional Status</option> <option value='Developer'>Developer</option> <option value='Junior Developer'>Junior Developer</option> <option value='Senior Developer'>Senior Developer</option> <option value='Manager'>Manager</option> <option value='Student or Learning'>Student or Learning</option> <option value='Instructor'>Instructor or Teacher</option> <option value='Intern'>Intern</option> <option value='Other'>Other</option> </select> <small className='form-text'> Give us an idea of where you are at in your career </small> </div> <div className='form-group'> <input type='text' placeholder='Company' name='company' value={company} onChange={e => onChange(e)} /> <small className='form-text'> Could be your own company or one you work for </small> </div> <div className='form-group'> <input type='text' placeholder='Website' name='website' value={website} onChange={e => onChange(e)} /> <small className='form-text'> Could be your own or a company website </small> </div> <div className='form-group'> <input type='text' placeholder='Location' name='location' value={location} onChange={e => onChange(e)} /> <small className='form-text'> City & state suggested (eg. Boston, MA) </small> </div> <div className='form-group'> <input type='text' placeholder='* Skills' name='skills' value={skills} onChange={e => onChange(e)} /> <small className='form-text'> Please use comma separated values (eg. HTML,CSS,JavaScript,PHP) </small> </div> <div className='form-group'> <input type='text' placeholder='Github Username' name='githubusername' value={githubusername} onChange={e => onChange(e)} /> <small className='form-text'> If you want your latest repos and a Github link, include your username </small> </div> <div className='form-group'> <textarea placeholder='A short bio of yourself' name='bio' value={bio} onChange={e => onChange(e)} /> <small className='form-text'>Tell us a little about yourself</small> </div> <div className='my-2'> <button onClick={() => toggleSocialImputs(!displaySocialImputs)} type='button' className='btn btn-light' > Add Social Network Links </button> <span>Optional</span> </div> {displaySocialImputs && ( <Fragment> <div className='form-group social-input'> <i className='fab fa-twitter fa-2x' /> <input type='text' placeholder='Twitter URL' name='twitter' value={twitter} onChange={e => onChange(e)} /> </div> <div className='form-group social-input'> <i className='fab fa-facebook fa-2x' /> <input type='text' placeholder='Facebook URL' name='facebook' value={facebook} onChange={e => onChange(e)} /> </div> <div className='form-group social-input'> <i className='fab fa-youtube fa-2x' /> <input type='text' placeholder='YouTube URL' name='youtube' value={youtube} onChange={e => onChange(e)} /> </div> <div className='form-group social-input'> <i className='fab fa-linkedin fa-2x' /> <input type='text' placeholder='Linkedin URL' name='linkedin' value={linkedin} onChange={e => onChange(e)} /> </div> <div className='form-group social-input'> <i className='fab fa-instagram fa-2x' /> <input type='text' placeholder='Instagram URL' name='instagram' value={instagram} onChange={e => onChange(e)} /> </div> </Fragment> )} <input type='submit' className='btn btn-primary my-1' /> <a className='btn btn-light my-1' href='dashboard.html'> Go Back </a> </form> </Fragment> ); }; CreateProfile.propTypes = {}; export default CreateProfile;
大元のApp.jsにも新しいファイル(CreateProfile.js)の情報を書き加える。
import部分とPrivateRoute部分に、新しく作成したCreateProfile.jsの情報を書き加えました。PrivateRouteの作成方法については、前回/dashboardの時に学んだので良い復習になりました。
import React, { Fragment, useEffect } from "react"; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; import Navbar from "./components/layout/Navbar"; import Landing from "./components/layout/Landing"; import Register from "./components/auth/Register"; import Login from "./components/auth/Login"; import Alert from "./components/layout/Alert"; import Dashboard from "./components/dashboard/Dashboard"; import CreateProfile from "./components/profile-form/CreateProfile"; import PrivateRoute from "./components/routing/PrivateRoute"; //Redux import { Provider } from "react-redux"; import store from "./store"; import { loadUser } from "./actions/auth"; import setAuthToken from "./utils/setAuthToken"; import "./App.css"; if (localStorage.token) { setAuthToken(localStorage.token); } const App = () => { useEffect(() => { store.dispatch(loadUser()); }, []); return ( <Provider store={store}> <Router> <Fragment> <Navbar /> <Route exact path='/' component={Landing} /> <section className='container'> <Alert /> <Switch> <Route exact path='/register' component={Register} /> <Route exact path='/login' component={Login} /> <PrivateRoute exact path='/dashboard' component={Dashboard} /> <PrivateRoute exact path='/create-profile' component={CreateProfile} /> </Switch> </section> </Fragment> </Router> </Provider> ); }; export default App;
ここまでの感想
やっとソーシャル・ネットワーキングアプリケーションらしい仕様になってきました。次はCreate Profileのactionの部分のコードを書いていきます。さらに動くようになるかと思うと楽しみです。本日は、エラーもあまりなかったのでありがたかったです。
現在使用している教材と学習時間:本日の学習時間2.5時間
Udemy:MERN Stack Front To Back: Full Stack React, Redux & Node.js by Brad Traversy
★Section9:Dashboard & Profile Management
-Lec 46 Starting On The Dashboard
-Lec 45 CreateProfileComponent (このブログ記事に書いた内容。ここまで完了。)
進捗状況:65%
学習時間2.5時間
~本日は休みにしている教材~
Udemy:The Complete Web Developer: Zero to Mastery by Andrei Neagoie
進捗状況: 92%
★参考にした本★
「React.js & Next.js超入門」掌田津耶乃 (秀和システム)
Section4-1: Reduxを使ってみよう
★参照記事★
Quiita参照記事⇒[axios] axios の導入と簡単な使い方