- 投稿日:2020-04-01T23:30:12+09:00
【25日目】React(フォーム)
はじめに
こんばんは。
昨日は体調不良でした。
1日ぶりにアウトプットしていきます。今日の学び
progate React 4
フォーム
import React from 'react'; class ContactForm extends React.Component { constructor(props) { super(props); this.state = { isSubmitted: false, {/*真偽値型のstate*/} }; } handleSubmit(){ {/*stateの値の更新*/} this.setState({isSubmitted:true}); } render() { let contactForm; if (this.state.isSubmitted) { contactForm = ( {/*送信できた場合*/} <div className='contact-submit-message'> 送信完了 </div> ); } else { contactForm = ( {/*まだ送信していない*/} <form onSubmit={()=>{this.handleSubmit()}}> {/*formタグで囲う*/} {/*フォーム送信時にメソッドの呼び出し 送信時に処理*/} <p>メールアドレス(必須)</p> <input /> <p>お問い合わせ内容(必須)</p> <textarea /> <input type='submit' {/*送信ボタン*/} value='送信' {/*ボタンの表示*/} /> {/*/を忘れないように*/} </form> ); } return ( <div className='contact-form'> {contactForm} </div> ); } } export default ContactForm;入力内容の管理
import React from 'react'; class ContactForm extends React.Component { constructor(props) { super(props); this.state = { isSubmitted: false, email: '', {/*入力値を管理するstate*/} }; } handleEmailChange(event){ const inputValue = event.target.value; {/*入力値を受け取る*/} this.setState({email:inputValue}); {/*入力値でstateを更新*/} } handleSubmit() { this.setState({isSubmitted: true}); } render() { let contactForm; if (this.state.isSubmitted) { contactForm = ( <div className='contact-submit-message'> 送信完了 </div> ); } else { contactForm = ( <form onSubmit={() => {this.handleSubmit()}}> <p>メールアドレス(必須)</p> <input value={this.state.email} {/*value属性を値emailとする*/} onChange={(event) => {this.handleEmailChange(event)}} /> {/*入力されるとeventが始まる eventを引数にしてメソッドの呼び出し*/} <p>お問い合わせ内容(必須)</p> <textarea /> <input type='submit' value='送信' /> </form> ); } return ( <div className='contact-form'> {contactForm} </div> ); } } export default ContactForm;入力値のチェック
import React from 'react'; class ContactForm extends React.Component { constructor(props) { super(props); this.state = { isSubmitted: false, email: '', hasEmailError: false, {/*入力値が空かどうか判断*/} }; } handleEmailChange(event) { const inputValue = event.target.value; const isEmpty = inputValue === ''{/*空の文字列と比較しisEmptyに代入*/} this.setState({ email: inputValue, hasEmailError:isEmpty }); } handleSubmit() { this.setState({isSubmitted: true}); } render() { let emailErrorText; if (this.state.hasEmailError) { emailErrorText = ( <p className='contact-message-error'> メールアドレスを入力してください </p> ); } let contactForm; if (this.state.isSubmitted) { contactForm = ( <div className='contact-submit-message'> 送信完了 </div> ); } else { contactForm = ( <form onSubmit={() => {this.handleSubmit()}}> <p>メールアドレス(必須)</p> <input value={this.state.email} onChange={(event) => {this.handleEmailChange(event)}} /> {emailErrorText} <p>お問い合わせ内容(必須)</p> <textarea /> <input type='submit' value='送信' /> </form> ); } return ( <div className='contact-form'> {contactForm} </div> ); } } export default ContactForm;所感
progateは終了してしまいました。
なんとなく形は分かった気がします。
これではまだまだ知識不足だと思うので、
Udemyで勉強していきたいと思います。
- 投稿日:2020-04-01T23:30:12+09:00
【25日目】React
はじめに
こんばんは。
昨日は体調不良でした。
1日ぶりにアウトプットしていきます。今日の学び
progate React 4
フォーム
import React from 'react'; class ContactForm extends React.Component { constructor(props) { super(props); this.state = { isSubmitted: false, {/*真偽値型のstate*/} }; } handleSubmit(){ {/*stateの値の更新*/} this.setState({isSubmitted:true}); } render() { let contactForm; if (this.state.isSubmitted) { contactForm = ( {/*送信できた場合*/} <div className='contact-submit-message'> 送信完了 </div> ); } else { contactForm = ( {/*まだ送信していない*/} <form onSubmit={()=>{this.handleSubmit()}}> {/*formタグで囲う*/} {/*フォーム送信時にメソッドの呼び出し 送信時に処理*/} <p>メールアドレス(必須)</p> <input /> <p>お問い合わせ内容(必須)</p> <textarea /> <input type='submit' {/*送信ボタン*/} value='送信' {/*ボタンの表示*/} /> {/*/を忘れないように*/} </form> ); } return ( <div className='contact-form'> {contactForm} </div> ); } } export default ContactForm;入力内容の管理
import React from 'react'; class ContactForm extends React.Component { constructor(props) { super(props); this.state = { isSubmitted: false, email: '', {/*入力値を管理するstate*/} }; } handleEmailChange(event){ const inputValue = event.target.value; {/*入力値を受け取る*/} this.setState({email:inputValue}); {/*入力値でstateを更新*/} } handleSubmit() { this.setState({isSubmitted: true}); } render() { let contactForm; if (this.state.isSubmitted) { contactForm = ( <div className='contact-submit-message'> 送信完了 </div> ); } else { contactForm = ( <form onSubmit={() => {this.handleSubmit()}}> <p>メールアドレス(必須)</p> <input value={this.state.email} {/*value属性を値emailとする*/} onChange={(event) => {this.handleEmailChange(event)}} /> {/*入力されるとeventが始まる eventを引数にしてメソッドの呼び出し*/} <p>お問い合わせ内容(必須)</p> <textarea /> <input type='submit' value='送信' /> </form> ); } return ( <div className='contact-form'> {contactForm} </div> ); } } export default ContactForm;入力値のチェック
import React from 'react'; class ContactForm extends React.Component { constructor(props) { super(props); this.state = { isSubmitted: false, email: '', hasEmailError: false, {/*入力値が空かどうか判断*/} }; } handleEmailChange(event) { const inputValue = event.target.value; const isEmpty = inputValue === ''{/*空の文字列と比較しisEmptyに代入*/} this.setState({ email: inputValue, hasEmailError:isEmpty }); } handleSubmit() { this.setState({isSubmitted: true}); } render() { let emailErrorText; if (this.state.hasEmailError) { emailErrorText = ( <p className='contact-message-error'> メールアドレスを入力してください </p> ); } let contactForm; if (this.state.isSubmitted) { contactForm = ( <div className='contact-submit-message'> 送信完了 </div> ); } else { contactForm = ( <form onSubmit={() => {this.handleSubmit()}}> <p>メールアドレス(必須)</p> <input value={this.state.email} onChange={(event) => {this.handleEmailChange(event)}} /> {emailErrorText} <p>お問い合わせ内容(必須)</p> <textarea /> <input type='submit' value='送信' /> </form> ); } return ( <div className='contact-form'> {contactForm} </div> ); } } export default ContactForm;所感
progateは終了してしまいました。
なんとなく形は分かった気がします。
これではまだまだ知識不足だと思うので、
Udemyで勉強していきたいと思います。
- 投稿日:2020-04-01T20:14:17+09:00
MERNスタックをDockerでやっていく
はじめに
30代正社員経験のないクズ人間だけどSHUSHOKUできました!やったー!
うれC!!!!!!!!うれC!!!
MERNスタック使って、ポートフォリオ用にWebアプリ作ってみたけど、大変だった気がします。正直全部大変だし難しいし自分が何やってるかよくわからない感じになります。頭が悪いので整理ができない……(´・ω・`)
DockerでMERNスタック環境構築したらDocker使っちゃう気持ちもアゲアゲでいけるのでは?などと考え、あとからECRやら楽なんじゃね?とか思っていた時期が自分にもありました。MERNスタックでなんかDockerもつかって気軽に色々できればいいなあというわけで、今後忘れないように書いておこうと思います。
Dockerについては、「何故Dockerなのか」とか、なんか公式読めば良いとかいう風潮がある気がします。
公式は字が多すぎて読む気がおきないみたいなやつはあります。でも、読め!とインターネッツの中の人たちが言ってくるので読みました。読んでもよくわからないので、脳がやばい。
脳みそやわやわな状態でやっているので、やっていける気がしない。チラシの裏にでも書いてろ!という記事です。でもQiitaに書いたろと思いました。承認欲求モンスターなので。謝罪しておきます。申し訳ございません。
フォルダ構成
とりあえず、こんなん
. ├── README.md ├── backend │ ├── Dockerfile-dev │ ├── app.js │ ├── config.env │ ├── controllers │ ├── middleware │ ├── models │ ├── node_modules │ ├── package-lock.json │ ├── package.json │ ├── public │ ├── routes │ ├── uploads │ └── utils ├── frontend │ ├── Dockerfile-dev │ ├── build │ ├── node_modules │ ├── package-lock.json │ ├── package.json │ ├── public │ └── src ├── dev-docker-compose.yml ├── node_modules ├── package-lock.json └── package.jsonメインにフロントエンドとバックエンドそれぞれフォルダを作りその中にdev環境Dockerfileをそれぞれ置いておく。
メインフォルダにはdev環境Docker-compose.ymlをつくる。
とりあえずsudo apt install docker-compose
やら色々はやってる状態。
他のフォルダなんかは、皆自由にやっていっていると思います。基本的に↓
nanka_app_nandemo_yoi_example/ ├── node-backend/ │ └── Dockerfile ├── react-frontend/ │ └── Dockerfile └── docker-compose.ymlこういう構成で作っていきたい気持ち。
バックエンド(MERNのN担当Node.js)
とりあえず動かしたいので、こんな感じに。
Dockerfile-devFROM node:10.18.0-alpine3.9 EXPOSE 3000 RUN apk add --update curl WORKDIR /usr/src/app COPY package.json package-lock.json* ./ RUN npm cache clean --force && npm install && npm install -g nodemon COPY . . CMD ["npm", "run", "dev"]自分にはdev環境とproduction環境をしっかり構成したいという夢がありました
というわけで、devになっていますが、別にDockerfileとしていれば良い。フロントエンド(MERNのR担当React.js)
担当とか書くと、なんかMERNの中で誰推し?みたいな雰囲気になっていいですね。
皆JS界からきてるわけですし、でかいアイドルグループみたいなもんやろ。しらんけど。
自分は誰推しでもないです、皆むずかしい。もう誰も信じない。とりあえずこんな感じ
Dockerfile-devFROM node:10.18.0-alpine3.9 EXPOSE 3000 RUN apk add --update curl WORKDIR /usr/src/app COPY package.json package-lock.json* ./ COPY . . CMD [ "npm", "start" ]ほぼバックエンド側と変わらない感じのやつ。少しでも、行数を減らしたい。行が増えると絶望感が増す。
COMPOSEファイル(MERNのM担当Mongoあたりも登場)
コンポーズファイル作ります。
こいつがないと私にはなにもできない。dev-docker-compose.ymlversion: "2.2" services: mongodb: image: "mongo" ports: - "27017:27017" backend: build: context: ./backend/ dockerfile: Dockerfile-dev ports: - "6200:6200" volumes: - ./backend:/usr/src/app depends_on: - mongodb frontend: build: context: ./frontend/ dockerfile: Dockerfile-dev ports: - "3000:3000" volumes: - ./frontend:/usr/src/app depends_on: - backendビルドしたい
docker-compose -f dev-docker-compose.yml build
これでビルドできる。
あとは毎回docker-compose -f dev-docker-compose.yml up
とかすれば良い。これで、なんか構築はされる感じになっている。
あとはCircleCIがどうとか、Node.js側でAPIがどうのとかReact側でSPAがどうとか、MongoDBでAtlasで某とか、そういうあれでなんかやっていきます。
- 投稿日:2020-04-01T17:49:55+09:00
[超簡単]Gatsby.jsでカッコいいポートフォリオを作成する方法
はじめに
今回は、Gatsby.jsを使って簡単にカッコいいポートフォリオを作る方法を共有したいと思います。
こちらが、完成形の例になります。
そもそもGatsbyとは?
Gatsbyは、Reactに基づく無料のオープンソースフレームワークであり、開発者が非常に高速なWebサイトやアプリを構築するのに役立ちます
*公式ドキュメント(英語)より
手順
1 . まずは、Gatsbyでの開発に必要な以下のツールを揃えましょう。
- Git
- Node.js(npmを使えているなら入っているはず)
- Gatsby CLI
もしもインストール方法がわからない場合は、こちらの記事を参考にしてください。
2 . こちらのGatsby公式サイトで、お好きなテンプレートを見つけましょう。
今回は、この
gatsby-starter-portfolio-caraというテンプレートを使用していきます。3 . 作業用のディレクトリに
cd 開発をするディレクトリ名
で移動し、gatsby new
する先ほどのテンプレート詳細ページに下にスクロールしてもらうと、使い方が英語で載っています。
そこに、
gatsby new
のコマンドが載っているので、それを作業するディレクトリに移動して実行します。cd ディレクトリ名 gatsby new gatsby-starter-portfolio-cara https://github.com/LekoArts/gatsby-starter-portfolio-cara
その後、
gatsby new
で生成したディレクトリにcd
で移動し、次はgatsby develop
します。cd gatsby-starter-portfolio-cara gatsby develop
はい、一応完成です!!
gatsby develop
が成功したら、ブラウザでタブを開いてlocalhost:8000
にアクセスしてみてください。お洒落でカッコいいサイトができあがってますよね!!
使用するテンプレートによっても異なりますが、もちろん中身の編集も簡単にできます!
今回の
gatsby-starter-portfolio-caraというテンプレートの場合、作成されたフォルダの中のsrc
の中にintro.mdx
というファイルが入っており、ページのトップの部分はマークダウン式で中身を自由に編集できるようになっています。トップ以外の箇所も、projects.mdx
、about.mdx
、contact.mdx
という風にそれぞれファイルをsrc
の中に作成してマークダウン式で編集可能です。最後に
今回は、Gatsby.jsを使用して簡単にカッコいいポートフォリオサイトを作成する方法をシェアしました!
とっても簡単なので、ぜひ皆さん試してみてくださいね!
- 投稿日:2020-04-01T17:47:39+09:00
[第0章:環境構築編] Gatsby公式ドキュメントを翻訳してみた。
はじめに
このシリーズでは、英語ソースばかりで「Gatsby使ってみたいけど、よくわからない...」という方々のために、公式Docを翻訳(ところどころざっくり要約)していきます。
実際の公式ドキュメントはこちら
(この章では、Gatsby.jsを使って開発ができる環境の構築を済ませ、Hello world!と画面に表示させることがゴールです)
〜〜 以下、翻訳となります 〜〜
0. 開発に必要な環境を構築しよう
Gatsbyを使用したサイトを開発する前に、まずはあなたが次に挙げるようなウェブ開発における主要技術を使い慣れているか確認してください。
- CLI(ターミナル)
(ある程度プログラミングをしている方には必要ないと思うので、ターミナルの説明は割愛します)- Node.js
Node.jsとは、JavaScirptのコードをブラウザの外でも実行できるようにするためのものです。GatsbyもNode.jsを使用して動いています。よって、Gatsbyを使って開発する際には、安定して動く最近のバージョンのNode.jsをインストールする必要があります。npmとNode.jsは基本的にセットでインストールされるので、もしnpmを使ったことがなければ、Node.jsもインストールされていない可能性が高いでしょう。参考記事: HomebrewでNode.jsとnpmをインストールする方法
- Git
Gitとは無料でオープンソースのバージョン管理システムです。Gatsbyでは、「starter」というページ作成のためのテンプレートのようなものを活用してSPAのサイトを高速で作ることができるのですが、その「starter」をインストールする際にGitを使用することになるので、Gitはあらかじめインストールしておいてください。
参考記事: 最新のGitをインストールする方法
Gatsby CLIを使ってみよう
Gatsby CLIは、あなたが高速でGatsbyのサイトを開発するのをより簡単にしてくれるnpmパッケージです。
以下のコマンドを実行して、インストールしてみましょう。npm install -g gatsby-cliインストールが完了したら、以下のコマンドで実行可能なコマンドを確認できます。
gatsby --help
Gatsbyでサイトを作ってみよう
ここまできたら、もうGatsby CLIを使ってGatsbyのサイトを作成する準備は完了です。このツールを使って、前述した「starter」をダウンロードできます。今回使用する「Hello world starter」はGatsbyサイトを作るのに必要最低限のものだけが入っているstarterです。
1 . ターミナルを開く
2 . starterを利用して、gatsby newでサイトを作成gatsby new hello-world https://github.com/gatsbyjs/gatsby-starter-hello-world3 . 作成したディレクトリに移動
cd hello-world
4 . 開発用サーバーを立ち上げる
gatsby developこれだけで、今回の作業はおしまいです!!
ローカル環境でサイトを見てみよう
それでは以下のURLにアクセスして、作ったサイトを見てみましょう。
おめでとうございます?
これで、あなたの最初のGatsbyサイトができました!
gatsby develop
で立ち上げた開発用サーバーが動いている限り、あなたはいつでもこのhttp://localhost:8000/
にアクセスできます。
もしサーバーを止めたければCtrl + c
で止められますし、また立ち上げたければもう一度gatsby develop
を実行してください。参考文献:Gatsby公式ドキュメント
次の章のテーマは、
「今回gatsby new
で作成したgatsbyサイトがどんな構成で成り立っているのか理解する」です。お楽しみに!!
- 投稿日:2020-04-01T15:46:20+09:00
CDNでReactを使う方法
導入方法
reactとreact-domをCDNで読み込む
<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>使用例
index.html<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>React</title> </head> <body> <div id="root"></div> <script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script> <script> let dom = document.querySelector('#root'); let el = React.createElement( 'p', {}, 'React' ); ReactDOM.render(el, dom); </script> </body> </html>JSXを使う場合
babelをCDNで読み込む
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script>scriptのtypeは「text/babel」にする
index.html<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>React</title> </head> <body> <div id="root"></div> <script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script> <script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script> <script type="text/babel"> let dom = document.querySelector('#root'); let el = ( <div> <p>React</p> </div> ); ReactDOM.render(el, dom); </script> </body> </html>
- 投稿日:2020-04-01T15:15:22+09:00
Next.jsでsvgを使用する
概要
- TypeScript × Next.jsでsvgを使う
手順
Next.jsのリポジトリにsvgを使用する例があります。
これを参考にbabel-plugin-inline-react-svgを追加
yarn add -D babel-plugin-inline-react-svg
.babelrc
に以下を追記.babelrc{ "presets": [ "next/babel" ], "plugins": [ "inline-react-svg" ] }これでNext.js上で、svgをそのままインポートして利用できます。
しかし、Typescriptを使用している場合、次のようなエラーが出ます。
Cannot find module './logo.svg'.ts
これは解決するには以下の宣言を追加します。
index.d.tsdeclare module '*.svg'以上で問題なくsvgが使用できるはずです。
- 投稿日:2020-04-01T14:24:12+09:00
Create React AppでTypeScriptとScssを使う
Create React App は React を学習するのに快適な環境であり、React で新しいシングルページアプリケーションを作成するのに最も良い方法です。(-- 新しい React アプリを作る)
Create React App を用いて React で SPA ( single-page application ) を作成する際に、TypeScript と Scss を導入するためのメモです。
Create React App のプロジェクトをインストール
npx create-react-app my-app --template typescript # or yarn create react-app my-app --template typescript
--template typescript
をつけるだけ
node-sass
をインストールnpm install node-sass --save # or yarn add node-sassあとは
src/App.css
をsrc/App.scss
に書き換えて、src/App.js
でsrc/App.scss
を読み込むように書き換えるだけ以上でCreate React AppでTypeScriptとScssを書ける。
参考