# React入門会 (コピペ用) 開催日: 1/25(土) 時間13:30 ~ 17:30 開催地: Start Up Lab Lagoon コピペ用資料です。コードはここからコピペしてください! コードが動かない場合は、お知らせください。 Node入れていて欲しいけど、難しかった人はここで! [codesandbox](https://codesandbox.io/) ## 仮想DOM参考資料 [VirtualDOMの仕事ってなに?](https://qiita.com/risagon/items/019942c60e9c3e6c05a5) [リアルな DOM はなぜ遅いのか](https://blog.dodgson.org/b/2014/12/11/why-is-real-dom-slow/) <br> ## Set Up (Hello,Reactまでの道) 1. プロジェクト作成 `npx create-react-app react_beginer` 2. 起動 - まずは、作ったディレクトリに移動 `cd react_beginer` - 起動コマンド `npm start` - 起動が確認できたら `control+c`で一旦、Reactを落とす。 <br> 3. 今回使わないファイルの削除<br> src配下全部消す。 `rm -rf src/*`<br> マジですか?って聞かれるので、yes!と答えてください。 zsh: sure you want to delete all 8 files in /Users/shimabukuroyuuta/study/codebase/react_beiner/react_intro/src [yn]? y<br> 今回は勉強のため、初めから全部書きます! 4. src/index.jsを作る ```javascript= import React from 'react'; import ReactDOM from 'react-dom'; ReactDOM.render(<h1>Hello,React</h1>, document.getElementById('root')); ``` - 起動コマンド `npm start` <br> index.jsの簡単な説明。 <br> Hello,React達成!! <br> ## コンポーネントを作ってみる。 Hello,Reactをコンポーネントとして切り分ける。 後ほど詳しくコンポーネントはやるので、今は簡単に! 1. src/components/App.jsを作る<br> a. srcの中にcomponentというディレクトリを作って、その中にApp.jsというファイルを作る。<br> b. App.jsの中身を書く **App.js** ```javascript= import React, {Component} from 'react'; class App extends Component { render() { return <div>Hello,react</div> } } export default App; ``` <br> 2. insex.jsでApp.jsを読み込む **index.js** ```javascript= import App from './components/App' ``` <br> 3. React.DOMの第一引数をAppコンポーネントにする。 ```javascript= ReactDOM.render(<App/>, document.getElementById('root')); ``` <br> 4. [localhost:3000](localhost:3000) にアクセスして、Hello,Reactが出ればOK <br> ## JSX 一旦、JSXについては、スライド資料! ### JSXを使わないHello,React ```javascript= class App extends Component { render() { return React.createElement( "div", null, "Hello,React" ); } } ``` ※Babelという仕組みがHTMLっぽい書き方をJSの書き方に直している。 [Babelの変換](https://babeljs.io/repl) <br> ### jsの変数を含める書き方 ```javascript= class App extends Component { render() { const greet = "Hello,shimaboo" return <div>{greet}</div> } } ``` <br> ### 複数の親タグをreturnで返せない ```javascript= class App extends Component { render() { return <div>Hello,React</div> <p>I love React</p> } } ``` - 一つのdivの中にタグをいくつも入れることは可能。 - 複数の親タグを作るとエラー出ます。 <br> ### 複数の親タグをreturnで返すReact.Fragment ```javascript= class App extends Component { render() { return <React.Fragment> <div>Hello,React</div> <p>I love React</p> </React.Fragment> } } ``` <br> ### 質問&休憩(10分) <br> ## クラスコンポーネント 基礎的、学ぶならここから。 ```javascript= class App extends Component { render() { return <div>Hello,react</div> } } ``` ## 関数コンポーネント 省略的な書き方、主流。 ```javascript= function App() { return ( <div>Hello,react</div> ); } ``` <br> ## props - 親子の説明(親:const User | 子:<User/>)。 - Userコンポーネント(子)をたくさん作っても楽しい。 **App.js** ```javascript= // 描画の処理 class App extends Component { render() { return <React.Fragment> <div><User name={"shimaboo"} email={"shimaboo@mail.com"}/></div> <div><User name={"yuta"} email={"yuta@mail.com"} tel={"090-0000-0000"}/></div> <div><User name={"hoge"} tel={"090-xxxx-xxxx"}/></div> </React.Fragment> } } // Userコンポーネント const User = (props) => { return <React.Fragment> <div>USER: {props.name} {props.email} {props.tel}</div> </React.Fragment> } ``` <br> ## state ### ボタンを押すと数字が増えるCounterコンポーネントを作る! **App.js** ```javascript= // Appコンポーネント内のCounterコンポーネントの描画 class App extends Component { render() { return <div><Counter/></div> } } // Counterコンポーネント class Counter extends Component { // 初期化処理 constructor(props){ super(props) this.state = { count: 0} } // カウントアップ処理 countUp = () => { this.setState({count: this.state.count + 1}) } // コンポーネント自体の描画処理 render(){ return ( <React.Fragment> <div>counter: {this.state.count}</div> <button onClick={this.countUp}>+1</button> </React.Fragment> ) } } ``` - constructorはCounterが呼び出される際に、最初に走る関数。 - constructor内で、superを用いて初期化処理とstateの初期値を定義する。 [参考:なぜsuper(props) を書くの?](https://qiita.com/hand-dot/items/61a4b808f110b12e4281) - stateへのアクセスは、`this.state`。 - `this.state = {}`ができるのは、constructorの中だけ、他でやるとエラーする。 - setStateを用いて、値は書き換えないといけない - setStateはstateの更新と変更したDOMの再レンダリングを行なってくれる、逆にsetStateを使わなければ再レンダリングが行われないのでエラーが出る。 <br> ### 時間があれば演習として使う。 ## Counterを別ファイルに 再びコンポーネントを切り分ける練習。 まず、Counter.jsをApp.jsの隣に作ってください **App.js** ```javascript= import React, {Component} from 'react'; import Counter from './Counter'; // Appコンポーネント内のCounterコンポーネントの描画 class App extends Component { render() { return <div><Counter/></div> } } export default App; ``` **Counter.js** ```javascript= import React, {Component} from 'react'; // Counterコンポーネント class Counter extends Component { // 初期化処理 constructor(props){ super(props) this.state = { count: 0} } // カウントアップ処理 countUp = () => { this.setState({count: this.state.count + 1}) } // コンポーネント自体の描画処理 render(){ return ( <React.Fragment> <div>counter: {this.state.count}</div> <button onClick={this.countUp}>+1</button> </React.Fragment> ) } } export default Counter; ``` <br> 見ていただきありがとうございました。