見出し画像

React備忘録

勉強しながらメモしたことをそのまま記述しています。


・React
FacebookやAirbnbやDropboxやProgateが利用している
サイトの見た目の部分を作ることができる。

ReactNativeというものもあり、iOSとAndroid両方のスマートフォンアプリを作ることができる

ボタンを押すとHTMLが切り替わったり、カウンタのようなものを作れる

・App.js
class App extends React.Component{
render(){
return(
<h1>Hello World</h1>
);
}
}

・JSX
HTMLではなくJSX
JAVA SCRIPT XML


render returnの中にHTMLを書ける
class App extends React.Component{
render(){
return(
<h1>Hello World</h1>
);
}
}

ただし、複数の要素を書くとエラーになるため、
必ず<div></div>でくくるなどする

・コメント
{/* コメント */}

・imgタグ
<img src='URL' />

※末尾が/>となっているところめっちゃ注意!

・App.jsの構成
テンプレート
import React from 'react';

class XXXXXXXX extends React.Component{
render(){
return(
);
}
}
export default XXXXXXXX;


・JSとJSXの違い
JSは全体、JSXはrenderの中のこと

・javascriptを記述する
const text = 'Hello World';

・javascriptに書いたものをJSXで使う
<div>{text}</div>

・JSとJSXのコメントの違い
JSX
{/* コメント */}

JS
//

・イベントとstate
重要

・ボタンを追加する
<butoon>ひつじ仙人</button>
<butoon>にんじゃわんこ</button>

・イベント
<button イベント名={() => {処理}}></button>

・onClickイベント
<button onClick={() => {処理}}>ひつじ仙人</button>

・コンソール出力
console.log('ひつじ仙人')

・state
stateの定義
stateの表示
stateの変更

・オブジェクトの復習
const user = { name:"にんじゃわんこ", age: 14 }
console.log(user.age)

・stateの定義
constructor(props){
super(props);
this.state = {name: 'にんじゃわんこ'}
}

・stateの表示
<h1>こんにちわ、{this.state.name}さん!</h1>

のような感じ

・stateの変更
this.setState({name: 'ひつじ仙人'})
this.setState({name: 'にんじゃわんこ'})

setStateメソッドを使わなければならないというルールがある。

※stateの値に直接代入することで値を変更してはいけないというルールがある
×this.state={name:'ひつじ仙人'};
×this.state.name='ひつじ仙人';


・メソッドの作成
メソッド名(){
//行いたい処理
}

handleClick(){
// stateのnameプロパティの値を変更する処理
}


呼び出し方は
this.handleClick()
のような感じ

メソッドに引数を渡す
handleClick(name){
this.setState({name: name});
}
呼び出し方
this.handleClick('ひつじ仙人')
this.handleClick('にんじゃわんこ')


・カウントアップ機能の作成
コンストラクタ
this.state = {count:0};

{this.state.count}

メソッド
handleClick(){
this.setState({count: this.state.count+1});
}

JSX
<button onClick={()=>{this.handleClick()}}>
+
</button>


・コンポーネントとprops

・表示の流れ
app.js→index.is→index.html

ファイル構造
React┳index.html
┗src┳index.js
┗components━App.js

・CSSをつけよう
読み込み
<link rel="stylesheet" href="stylesheet.css">

・JSXではclass名のつけかたが違うよ!
className='title'

・コンポーネント
パーツという意味
Languageコンポーネントを作る


・コンポーネントの構成
Language.js
import React from 'react';
class Language extends React.Component{
render(){
return(

);
}

}
クラス名がコンポーネントの名前になる!
最初はappっていう名前にしてたが、そこをLanguageにする

・コンポーネントの表示
Language.jsの末尾に以下を記述
export default Language;

App.jsの先頭に以下を記述
import Language from './Language';

JSX内に<コンポーネント名 />と書く
<Language />

・propsを学ぼう
propsは小道具という意味

・propsの渡し方
<Language
name = 'HTML & CSS'
image = 'https://....'
/>

・渡されたpropsの使い方
propsにはオブジェクトが入ってる
console.log( this.props );
return(
:
);

JSXで
this.props.name
this.props.image
のように取得できる。
thisを忘れないこと!

・mapメソッド
{fruitList.map( (fruitItem) => {
return <p>{fruitItem}</p>
})}

const languageList = [
{name:'HTML & CSS', image: 'https://...'}
];

{languageList.map( (languageItem) => {
return (
<Language
name={languageItem.name}
image={languageItem.image}
/>
);
})}

・モーダル
ポップアップのことをモーダルと呼ぶ


コンポーネントのファイル
components┳App.js
┣Footer.js
┣Header.js
┣Lesson.js
┗Main.js

・Lesson部分の作成手順
Lessonコンポーネントの作成
テンプレートを貼る
JSXを作成する
Lessonコンポーネントの表示
Main.jsでimport Lesson from './Lesson';とする
Main.jsで<Lesson />とする
Main.jsでpropsを作成する
const lessonItem={
name: 'HTML & CSS', image: 'https://///html.svg'
}
Main.jsでpropsを渡す
<Lesson
name={lessonitem.name}
image={lessonitem.image}
/>
Lesson.jsでpropsを受け取る
{this.props.name}
{this.props.image}
各レッスンの情報を表示
Main.jsに配列を用意
const lessonList=[
{name: 'HTML & CSS', image: 'URL'},
{name: 'Sass', image: 'URL'},
{name: 'JavaScript', image: 'URL'},
{name: 'React', image: 'URL'},
];
Main.jsでmapを使ってループ
{lessonList.map(( lessonItem )=>{
return(
<Lesson
name={lessonItem.name}
image={lessonItem.image}
/>
);
})}

・モーダルの作成手順
モーダルのJSXを追加する
Lesson.jsにレッスンの名前とレッスンの紹介文を表示する
<h2>{this.props.name}</h2>
<p>{this.props.introduction}</p>
初期状態でモーダルを隠す
Lesson.jsのconstructor(props)で、非表示にする
this.state={isModalOpen: false}

Lesson.jsに空の変数を用意する
let modal;

Lesson.js条件文で判定し、空の変数にモーダルを入れる
if( this.state.isModalOpen )
{
modal = JSX
}

Lesson.jsでmodalを表示する
{modal}

modalが複数行の時はかっこで囲む。ただし、末尾にセミコロンを忘れないこと

モーダルの表示・非表示
表示
Lesson.jsでstateをtrueにする処理を追加
handleClickLesson(){
this.setState({isModalOpen:true});
}

<img
src={this.props.image}
onClick={()=>{this.handleClickLesson()}}
/>

onClickはクリック時にメソッドを呼び出せる。既に用意されたメソッド

非表示
Lesson.jsでstateをfalseにする処理を追加
handleClickLesson(){
this.setState({isModalOpen:false});
}

・お問い合わせフォームの作成
フォームの作成手順
フォームの見た目の作成
入力欄のJSX
<form>
<p>アド</p>
<input />
<p>メッセ</p>
<textarea />
<input
type='submit'
value='送信'
/>
</form>

※タグの書き方がHTMLと異なることに注意
formはたぶん以降の手順でデータのやり取りのために必要

送信完了メッセージの準備
ContactForm.jsのconstructorに以下を追加する
this.state = {
isSubmitted: false,
};

renderに以下を追加
let contactForm;
if(this.state.isSubmitted)
{
contactForm = 送信完了JSX;
}
else
{
contactForm = フォームJSX;
}

フォームを表示する部分を以下のようにする
{contactForm}

フォームとメッセージの切り替え
formにイベントを指定する
<form onSubmit={()=>{処理}}>

handleSubmit(){
this.setState({isSubmitted: true});
}
<form onSubmit={()=>{this.handleSubmit()}}>

エラーメッセージを表示する
・入力値をstateで管理する
stateとinputの準備
stateに入力値を管理するstateを準備する
inputのvalueに{this.state.email}のようにstateと紐づける
入力イベント・入力値の取得
入力や削除が行われたときに処理を実行するイベントを追加
onChange={()=>{処理}}
入力値の取得
onChange={(event)=>{console.log(event.target.value)}}
stateの更新
handleEmailChange(event){
const inputValue = event.target.value;
this.setState({email:inputValue});
}

onChange={(event)=>{this.handleEmailChange(event)}}

・入力値をチェック
contactForm.jsのconstructorのstateに
hasEmailError:false,
を追加する

let emailErrorText;
if(this.state.hasEmailError)
{
emailErrorText = (
<p className='contact-message-error'>
Emailを入力してください
</p>
);
}

{emailErrorText}
・stateの更新
const isEmpty = inputValue==='';

複数のstateの同時更新
this.setState({
email: inputValue,
hasEmailError: isEmpty,
});

・お問い合わせ欄もstateで管理する
stateとtextareaの準備
content: '',
hasContentError: false,

<textarea value={this.state.content}>


入力イベント・入力値の取得・入力値のチェック
handleContentChange(event){
const inputValue=event.target.value;
const isEmpty = inputValue === '';
this.setState({
content: inputValue,
hasContentError: isEmpty,
});
}

<textarea
value={this.content}
onChange={(event)=>{this.handleContentChange(event)}}
/>

stateの更新
let contentErrorText;
if(this.state.hasContentError)
{
contentErrorText = (
<p>className='contact-message-error'
お問い合わせ内容を入力してください
</p>
);
}
<textarea
value={this.state.content}
{contentErrorText}
/>

この記事が気に入ったらサポートをしてみませんか?