メモ(React III)
総合演習
構造は下記のとおり。
- Appで各コンポーネントを配置
- MainにてLessonのstateを定義し、mapメソッドにてLessonコンポーネントを表示。
- Lessonにてコンストラクタ設定
- コンストラクタに、イズオープンのstateを追加。初期値はfalse
- こっからトリッキーよ〜。if文にて、イズオープンがtrueのときにmodal(ぽこっと出るやつ)を表示するようにする。前項のとおり、初期はfalseなので表示されていないというカラクリ。
- で、要素をonClickしたときにイズオープンをtrueにする
- モーダルの閉じるをonClickしたときにイズオープンをfalseにする
- 上記2つのメソッドを定める
//App import React from 'react'; import Header from './Header'; import Main from './Main'; import Footer from './Footer'; class App extends React.Component { render() { return ( <div> <Header /> <Main /> <Footer /> </div> ); } } export default App;
//Main import React from 'react'; import Lesson from './Lesson'; class Main extends React.Component { render() { const lessonList = [ { name: 'HTML & CSS', image: 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/react/html.svg', introduction: 'WEBページはHTML、CSSという言語によってその見た目が作られています。 実際にWEBページを作りながら学んでみましょう!', }, { name: 'Sass', image: 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/react/sass.svg', introduction: 'SassはCSSをより便利に効率的にするための言語です。', }, { name: 'JavaScript', image: 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/react/es6.svg', introduction: 'JavaScriptはフロントエンドだけでなく、サーバーサイドまで広い可能性を持つプログラミング言語です。', }, { name: 'React', image: 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/react/react.svg', introduction: 'ReactはHTMLのように、サイトの見た目をつくることができるJavaScriptのライブラリです。', }, ]; return ( <div className='main-wrapper'> <div className='main'> <div className='copy-container'> <h1>Hello, World.</h1> <h2>プログラミングの世界へようこそ!</h2> </div> <div className='lesson-container'> <h3>学べるレッスン</h3> {lessonList.map((lessonItem) => { return ( <Lesson name={lessonItem.name} image={lessonItem.image} introduction={lessonItem.introduction} /> ); })} </div> </div> </div> ); } } export default Main;
//Lesson import React from 'react'; class Lesson extends React.Component { constructor(props) { super(props); this.state = {isModalOpen: false}; } handleClickLesson() { this.setState({isModalOpen: true}); } handleClickClose() { this.setState({isModalOpen: false}); } render() { let modal; if (this.state.isModalOpen) { modal = ( <div className='modal'> <div className='modal-inner'> <div className='modal-header'></div> <div className='modal-introduction'> <h2>{this.props.name}</h2> <p>{this.props.introduction}</p> </div> <button className='modal-close-btn' onClick={() => {this.handleClickClose()}} > とじる </button> </div> </div> ); } return ( <div className='lesson-card'> <div className='lesson-item' onClick={() => {this.handleClickLesson()}} > <p>{this.props.name}</p> <img src={this.props.image} /> </div> {modal} </div> ); } } export default Lesson;