– ReactとはDOM操作ライブラリでコンポーネント指向の開発スタイル
– ReactのDOM操作の特徴
L 仮想DOM(Virtual DOM)
L データとUIの同期
– Reactは具体的なDOM操作はコーディングせず、before afterのデータを更新する
– 仮想DOMの仕組みはReactのほか、Vue.jsでも採用されている
– props(属性)やstate(状態)といったReactが管理するデータを更新する
e.g. : JSでdom操作を書く場合
<div id="root"></div> <script> const element = document.createElement('p'); element.id = 'the-text'; element.className = 'text'; element.innerText = 'Hello world'; const root = document.getElementById('root'); root.insertAdjacentElement('beforeend', element); </script>
入れ子(ul,li)の場合はこう書く
L React.createElementはReact要素を返却する
L ReactDOM.renderは、第一引数がReact要素、第二引数がReact要素を内部に描画する親要素
const element = React.createElement('ul', {className: 'list'}, [ React.createElement('li', {className: 'list-item'}, ['one']), React.createElement('li', {className: 'list-item'}, ['two']), React.createElement('li', {className: 'list-item'}, ['three']) ]);
### JSXはcreateElement
CDNからBabelを読み込んだ状態でscriptのtypeにbabelを指定すると実行される
JSXの構文は機能的にはcreateElementと同一
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> <script type="text/babel"> const element = <p id="the-text" className="text">Hello React</p>; const root = document.getElementById('root'); ReactDOM.render(element, root); </script>
React.createElementの属性値をpropsと言う。第三引数は第二引数のchildrenプロパティとして渡すこともできるので、以下のようにしても同じ。ただし、視認性の問題からタグで囲むことの方が多い
const element = <p id="the-text" className="text" children="JSX & babel" />;
JSXには、単一のルート要素を持つべきというルールがあるため、複数の要素を入れる場合は、親要素としてDivタグで囲むようにする
下記の場合はdiv要素がないとエラーで実行できない
const element = ( <div> <article>...</article> <aside>...</aside> </div> );
ただし、Fragment要素を利用した方がbetter
const element = ( <React.Fragment> <article>...</article> <aside>...</aside> </React.Fragment> );
const element = ( <> <article>...</article> <aside>...</aside> </> );
### 値の埋め込み
const name = 'john'; const element = <p id="the-text" className="text">{name}</p>;
const members = [ {name: 'John', instrument: 'guitar'}, {name: 'Paul', instrument: 'bass'}, {name: 'George', instrument: 'guitar'}, {name: 'Ringo', instrument: 'drums'} ]; const element = ( <ul> {members.map(member => ( <li key={member.name}> {member.name} plays {member.instrument} </li> ))} </ul> );
### コンポーネントを定義
Reactでは独自要素を作ることができ、独自要素はコンポーネントと呼ばれ、関数として定義します。
関数名はネイティブと区別するため必ず大文字で始め、React要素を返却する
function Sample(props){ return <p id={props.id} className="text">{props.children}</p> } const root = document.getElementById('root'); ReactDOM.render(<Sample id="the-text">Props Test</Sample>, root);
DOM操作のロジック部分と、表示部分を明示的に分けて記述してるのか
なるほど、良く考えられてて面白いですね。
最初ちょっと抵抗感ありましたけど、仕組みを理解すると分かりやすいです。