<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JavaScript | リューブログ</title>
	<atom:link href="https://ryuusan.com/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>https://ryuusan.com</link>
	<description>就活生だった時の気づきや日常の発信のほか、技術ブログとしても運用しています。</description>
	<lastBuildDate>Thu, 08 Oct 2020 04:19:38 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://ryuusan.com/wp-content/uploads/2020/03/cropped-logo-32x32.png</url>
	<title>JavaScript | リューブログ</title>
	<link>https://ryuusan.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Reactについて -Reactの基本と備忘録</title>
		<link>https://ryuusan.com/react/</link>
					<comments>https://ryuusan.com/react/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Tue, 06 Oct 2020 04:11:13 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[フロントエンド]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=329</guid>

					<description><![CDATA[目次 はじめにReactについてReactの特徴React要素とは？コンポーネントとは？仮想DOMについてJSXについてJSXとはJSXの中でループや条件分岐を行う方法keyについてJSXのその他の役割JSXを使う際の注 [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">Reactについて</a><ol><li><a href="#toc3" tabindex="0">Reactの特徴</a></li><li><a href="#toc4" tabindex="0">React要素とは？</a></li><li><a href="#toc5" tabindex="0">コンポーネントとは？</a></li><li><a href="#toc6" tabindex="0">仮想DOMについて</a></li></ol></li><li><a href="#toc7" tabindex="0">JSXについて</a><ol><li><a href="#toc8" tabindex="0">JSXとは</a></li><li><a href="#toc9" tabindex="0">JSXの中でループや条件分岐を行う方法</a></li><li><a href="#toc10" tabindex="0">keyについて</a></li><li><a href="#toc11" tabindex="0">JSXのその他の役割</a></li><li><a href="#toc12" tabindex="0">JSXを使う際の注意点</a></li></ol></li><li><a href="#toc13" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p class="wp-block-paragraph">今までDjangoアプリを開発するときは基本的に生のjavascriptかjQueryを使っていたのですが、どうやら少し前から脱jQueryが叫ばれているようですし、実現したい機能を実装する際に便利そうだったのでReactを学習することにしました。</p>



<p class="wp-block-paragraph">間違っていたら教えてください。(小声)</p>



<div class="wp-block-image is-style-default"><figure class="aligncenter size-large"><img fetchpriority="high" decoding="async" width="267" height="189" src="https://ryuusan.com/wp-content/uploads/2020/10/React.png" alt="" class="wp-image-330"/></figure></div>



<h2 class="wp-block-heading"><span id="toc2">Reactについて</span></h2>



<h3 class="wp-block-heading"><span id="toc3">Reactの特徴</span></h3>



<p class="wp-block-paragraph">Reactはユーザインタフェースを構築するためのJavaScriptライブラリです。Reactの特徴は以下の3点です。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size wp-block-paragraph"><strong>宣言的なView</strong></p>
</div>



<p class="wp-block-paragraph">Reactはデータの変更を検知し、関連するコンポーネントだけ効率的に更新・描画を行います。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size wp-block-paragraph"><strong>コンポーネントベース</strong></p>
</div>



<p class="wp-block-paragraph"><strong>Reactは<span class="marker-under">自分自身の状態を管理するカプセル化されたコンポーネントを作成します。</span></strong>コンポーネントはJavaScriptで書くことができるので、DOMに状態を持たせることなく様々なデータを扱うことができるようになります。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size wp-block-paragraph"><strong>どこでも使える</strong></p>
</div>



<p class="wp-block-paragraph">Reactを使って新たな機能を実装する際に、既存のソースコードを書き換える必要はありません。また、Nodeを使ったサーバー上やモバイルアプリケーションの中でも動きます。</p>



<h3 class="wp-block-heading"><span id="toc4">React要素とは？</span></h3>



<p class="wp-block-paragraph">React要素とは、下で説明している<strong>JSX</strong>などで構成されるJavaScriptのオブジェクトです。ブラウザのDOM要素とは異なり、低コストで生成することができます。<strong><span class="marker-under">React DOMがReact要素に合致するようにDOM要素を更新します。</span></strong></p>



<p class="wp-block-paragraph">例えば、HTMLファイルに以下のように記述するとします。</p>



<pre class="wp-block-code"><code>&lt;div id="root">&lt;/div></code></pre>



<p class="wp-block-paragraph">次にReactで以下のように記述していきます。この時HTMLファイルの中に記述したdivの中はReact DOMで管理されています。このdivのことを<strong>ルートDOMノード</strong>と呼びます。このルートDOMノードの数に制限はありませんが、Reactだけでアプリケーションを構成している場合は通常ひとつだけ持たせるようにします。</p>



<pre class="wp-block-code"><code>const element = &lt;h1>Hello World!&lt;/h1>
ReactDOM.render(element, document.getElementById('root'));</code></pre>



<p class="wp-block-paragraph">このコードはページに<strong>Hello World!</strong>と見出しで表示します。</p>



<p class="wp-block-paragraph">React要素はイミュータブルでなければなりません。一度要素を作成すると子要素や属性を変更することは出来ません。そこで、Reactを使ってUIを更新するためには新しい要素を作成してReact DOMに渡す必要があります。ただ、その方法は少し不便であるため、Reactには以下で紹介する<strong><span class="marker-under">ステート付きコンポーネント</span></strong>があり、より簡単にUIを更新することができます。</p>



<h3 class="wp-block-heading"><span id="toc5">コンポーネントとは？</span></h3>



<p class="wp-block-paragraph">以下は簡単なコンポーネントです。&#8221;test&#8221;という文字を受け取り、描写しています。</p>



<p class="wp-block-paragraph">returnの内部を見てください。HTMLのように書いていますが、これはJSXと呼ばれる構文です。このように、{ }で囲った部分にJavaScriptの式を入れることができます。(<strong>JSXの中ではfor文やif文などは使えません</strong>)</p>



<p class="codepen" data-height="342" data-theme-id="dark" data-default-tab="js,result" data-user="ryuji-commit" data-slug-hash="KKMPpab" style="height: 342px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="KKMPpab">
  <span>See the Pen <a href="https://codepen.io/ryuji-commit/pen/KKMPpab">
  KKMPpab</a> by Ryuji Okura (<a href="https://codepen.io/ryuji-commit">@ryuji-commit</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async="" src="https://static.codepen.io/assets/embed/ei.js"></script>



<p class="wp-block-paragraph">このコードではExampleコンポーネントがデータを受け取り、描画しているだけですが、以下のように<strong><span class="marker-under">コンポーネント内部で状態(state)を保持することも出来ます。その状態が変化するとrender()が再実行され、</span><span class="marker-under">必要な箇所のみ</span><span class="marker-under">再描画されます。</span></strong></p>



<p class="wp-block-paragraph">右側の入力欄に適当な文字を入力して、エンターやボタンで送信してみてください。入力した値が表示されるはずです。このコードでは、handleSubmit関数で送信された値をstateにセットしています。そうすることで状態が変化し、render()が再実行されて入力値が表示されているのです。</p>



<p class="codepen" data-height="576" data-theme-id="dark" data-default-tab="js,result" data-user="ryuji-commit" data-slug-hash="dyXbVPG" style="height: 576px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="React Example(State)">
  <span>See the Pen <a href="https://codepen.io/ryuji-commit/pen/dyXbVPG">
  React Example(State)</a> by Ryuji Okura (<a href="https://codepen.io/ryuji-commit">@ryuji-commit</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async="" src="https://static.codepen.io/assets/embed/ei.js"></script>



<p class="wp-block-paragraph">handleChange関数を見てください。</p>



<pre class="wp-block-code"><code>this.setState({
  text: e.target.value,
})</code></pre>



<p class="wp-block-paragraph">このように入力された値をstateのtextにセットし、そのtextをinputのvalueにすることで入力を反映させています。この関数が無ければ入力ができません。JSXの中でinputタグを使うときには注意してください。</p>



<p class="wp-block-paragraph">次にhandleSubmit関数について説明します。この関数は入力値が送信された際に動作し、<strong>setState</strong>を行う関数ですが、最初に<strong>e.preventDefault();</strong>と記述されています。</p>



<p class="wp-block-paragraph">入力値はReactで制御しているためサーバに送信する必要はないのですが、ReactではJavaScriptとは違い、<strong>false</strong>を返してもイベントを止めることができません。そこでpreventDefaultを呼び出し、submitイベントを止めています。</p>



<p class="wp-block-paragraph">また、これらの関数を<strong>constructor</strong>内で以下のようにbindしていますが、JavaScriptの仕様上メソッドの末尾に()をつけずに参照するために必要なことです。</p>



<pre class="wp-block-code"><code>this.handleSubmit = this.handleSubmit.bind(this);
this.handleChange = this.handleChange.bind(this);</code></pre>



<p class="wp-block-paragraph">この方法の他にクラスフィールド構文やアロー関数を使用する方法もありますが、個人的にはbindする方が好きです。(個人の感想です)</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size wp-block-paragraph"><strong>子要素の出力</strong></p>
</div>



<p class="wp-block-paragraph">コンポーネントの中にはSidebarやDialogのように事前に子要素を知らないものもあります。このようなコンポーネントでは以下のように<strong><span class="marker-under">children</span></strong>という特別なpropsを使い、子要素を受け取って出力することができます。</p>



<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="js,result" data-user="ryuji-commit" data-slug-hash="WNxNYGP" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="WNxNYGP">
  <span>See the Pen <a href="https://codepen.io/ryuji-commit/pen/WNxNYGP">
  WNxNYGP</a> by Ryuji Okura (<a href="https://codepen.io/ryuji-commit">@ryuji-commit</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size wp-block-paragraph"><strong>まとめ</strong></p>
</div>



<p class="wp-block-paragraph">Reactは上の<strong>Example</strong>や<strong>MyName</strong>などの状態(state)を持つ<strong><span class="marker-under">クラスコンポーネント</span></strong>や、状態(state)を持たず、propsを受け取って描画するだけの<strong><span class="marker-under">関数コンポーネント</span></strong>を組み合わせることによってUIを構築します。</p>



<h3 class="wp-block-heading"><span id="toc6">仮想DOMについて</span></h3>



<p class="wp-block-paragraph">仮想DOMとは、今までブラウザが持っていたDOMツリーをJavaScriptのオブジェクトとして仮想的に表現し、差分だけリアルDOMに反映させることでレンダリングコストを下げるという技術です。</p>



<p class="wp-block-paragraph">ReactではReact DOMと呼ばれるライブラリを用いて実装されています。そのため、Reactは必要な箇所のみリアルDOMの更新を行う事ができます。</p>



<h2 class="wp-block-heading"><span id="toc7">JSXについて</span></h2>



<h3 class="wp-block-heading"><span id="toc8">JSXとは</span></h3>



<p class="wp-block-paragraph">Exampleクラスコンポーネントのコードを見てください。コードの下の方に以下のように書いていると思います。</p>



<pre class="wp-block-code"><code>const text = "Hello World";
const element = &lt;h1>{text}&lt;/h1>

ReactDOM.render(
  element,
  document.getElementById('example2')
);</code></pre>



<p class="wp-block-paragraph">この<strong>&lt;h1>{text}&lt;/h1></strong>が<strong>JSX</strong>と呼ばれる構文です。上でも軽く触れましたが、{}の中にはあらゆるJavaScriptの式を使用することができます。例えば、関数はもちろんJSXの外でfor文やif文を使って配列を作って、その配列を呼び出したり、計算したり、stateやpropsを参照したりと様々な用途があります。ただし、<span class="marker-under-red">JSXの<strong>中で</strong>for文やif文を使う場合はひと工夫必要です。</span></p>



<h3 class="wp-block-heading"><span id="toc9">JSXの中でループや条件分岐を行う方法</span></h3>



<p class="codepen" data-height="324" data-theme-id="dark" data-default-tab="js,result" data-user="ryuji-commit" data-slug-hash="VwjZrMd" style="height: 324px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="VwjZrMd">
  <span>See the Pen <a href="https://codepen.io/ryuji-commit/pen/VwjZrMd">
  VwjZrMd</a> by Ryuji Okura (<a href="https://codepen.io/ryuji-commit">@ryuji-commit</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async="" src="https://static.codepen.io/assets/embed/ei.js"></script>



<p class="wp-block-paragraph">JSXでfor文やif文を使う方法の１つとして、上のように<span class="marker-under"><strong>即時関数を使う方法</strong></span>が挙げられます。JSXの内部で即時関数を作り、その中でforを回したり、if文で分岐させたりして結果をreturnで返却させます。</p>



<p class="wp-block-paragraph">また、ループさせたい場合は即時関数を作る以外に<span class="marker-under"><strong>mapを使う方法</strong></span>もあります。例えば配列を既に持っていて、その中の値を順番に表示させたいときなどはmapを使うと便利です。</p>



<p class="wp-block-paragraph">条件分岐させたい場合は、論理演算子を使う方法や三項演算子を使う方法もあります。</p>



<h3 class="wp-block-heading"><span id="toc10">keyについて</span></h3>



<p class="wp-block-paragraph">このようにループなどでリストをレンダリングするときは、<strong>key</strong>を設定することが推奨されています。例えば、上のコードでは<strong>&lt;li key={i}&gt;{i}&lt;/li&gt;</strong>のように指定しています。keyにはその配列の中で<strong><span class="marker-under">ユニークな値</span></strong>をセットする必要があります。今回の場合は添字ですね。keyを利用することで、Reactはどの要素が変更されたのかを識別できるようになります。</p>



<p class="wp-block-paragraph">keyは兄弟要素の中で一意であればよく、全体の中でユニークである必要はありません。そのため、今回の例は2つともkeyに同じ値を指定しています。</p>



<h3 class="wp-block-heading"><span id="toc11">JSXのその他の役割</span></h3>



<p class="wp-block-paragraph">JSXはそれ自体もJavaScriptの式のため、if文やfor文の中で使ったり、変数に代入したり、関数から返したりすることができます。さらに、JSXにはインジェクション攻撃を防ぐという役割もあります。</p>



<h3 class="wp-block-heading"><span id="toc12">JSXを使う際の注意点</span></h3>



<p class="wp-block-paragraph">最後にJSXを使うときの注意点です。<span class="marker-under">JSXはHTMLにとても似ていますが、実際はJavaScriptに近い構文です。</span>そのため、React DOMはHTMLの属性(例えば&#8221;class&#8221;など)ではなく、キャメルケースの命名規則(例えば&#8221;className&#8221;など)を使用しています。</p>



<p class="wp-block-paragraph">ついつい&lt;div class=&#8221;hogehoge&#8221;&gt;と書いてしまうので、気をつけてください。</p>



<h2 class="wp-block-heading"><span id="toc13">おわりに</span></h2>



<p>まだ学習している最中なので、新たなことを学び次第追記していきます。もし間違えている個所や改善点などありましたら、<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>まで連絡いただければ幸いです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/react/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
