1. tkymgr

    Posted

    tkymgr
Changes in title
+SPA!温泉!(行きたい...
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,172 @@
+## 温泉へ行こう!
+
+いや、行きません。SPAなアプリを作ってみようかと...
+とりあえず、人数と金額を入れたら一人当たりの金額を計算してくれるという優れもの!
+割り勘電卓を作ってみる!!(いや、通常の電卓なら最低でも四則演算してくれるので、電卓を名乗るとはおこがましいやつよ!
+
+とりあえず、こんなイメージで
+
+![スクリーンショット 2018-12-01 15.46.45.png](https://qiita-image-store.s3.amazonaws.com/0/105644/8b0b5dd5-2de6-37d7-4ef1-b326be9828a0.png)
+
+## サンプルのソースからの脱却
+
+というか、綺麗にしていく。
+
+```jsx:index.js
+import React from 'react';
+import ReactDOM from 'react-dom';
+import App from './components/App';
+import * as serviceWorker from './serviceWorker';
+
+const element = <App />;
+
+ReactDOM.render(element, document.getElementById('root'));
+
+serviceWorker.unregister();
+```
+
+Appコンポーネントにとりあえず見た目だけでもイメージ通りのパーツを入れていく。
+App.scssは空っぽにする。
+
+```jsx:conponents/App.js
+import React, { Component } from 'react';
+import './App.scss';
+
+class App extends Component {
+ render() {
+ return (
+ <div>
+ <input type="text" placeholder="人数を入力" />
+ </div>
+ <div>
+ <input type="text" placeholder="合計金額を入力" />
+ </div>
+ <div>
+ <button>割り勘計算</button>
+ </div>
+ <div>結果</div>
+ );
+ }
+}
+
+export default App;
+```
+
+だが、しかし...
+
+![スクリーンショット 2018-12-01 15.52.10.png](https://qiita-image-store.s3.amazonaws.com/0/105644/b4072dc7-1d4f-6a6c-36a7-cd4ae9af21b6.png)
+
+エラーメッセージをGoogle翻訳してみると、
+
+> 隣接するJSX要素は、1つの閉じタグで囲む必要があります。
+
+ということらしい。つまり、今回の場合だと、4つも並んでる...
+
+> JSXフラグメント<> ... </>が必要でしたか?
+
+???
+
+ReactにはFragments APIなるものがあるそうな。これを使うと
+
+```jsx
+<Fragment>
+ <div>
+ <input type="text" placeholder="人数を入力" />
+ </div>
+ <div>
+ <input type="text" placeholder="合計金額を入力" />
+ </div>
+ <div>
+ <button>割り勘計算</button>
+ </div>
+ <div>結果</div>
+</Fragment>
+```
+
+ただし、importしておかないと、エラーになる
+
+```jsx
+import React, { Component, Fragment } from 'react';
+```
+
+出力結果(HTMLソース)を見てみると、確かに何のタグも付いてない
+
+![スクリーンショット 2018-12-01 16.12.30.png](https://qiita-image-store.s3.amazonaws.com/0/105644/3edcb70a-ed9f-013f-02bf-3fb68def99bb.png)
+
+で、これの省略形が<>と</>だそうな。これだと、importもいらない。
+
+```jsx
+<>
+ <div>
+ <input type="text" placeholder="人数を入力" />
+ </div>
+ <div>
+ <input type="text" placeholder="合計金額を入力" />
+ </div>
+ <div>
+ <button>割り勘計算</button>
+ </div>
+ <div>結果</div>
+</>
+```
+
+そして、ブラウザに現れたのがこれだ!
+
+![スクリーンショット 2018-12-01 16.16.47.png](https://qiita-image-store.s3.amazonaws.com/0/105644/7e5e9970-dab9-68b4-84e0-75cf45085b04.png)
+
+なんか違う...orz せめて、センタリングしよう!
+ということで、フラグメントではなく、divタグを使います。
+
+center的なcssクラスを作っておきます。
+
+```scss:components/App.scss
+.center {
+ text-align: center;
+}
+```
+
+そして、divタグで囲んでみる。
+
+```jsx
+ <div class="center">
+ <div>
+ <input type="text" placeholder="人数を入力" />
+ </div>
+ <div>
+ <input type="text" placeholder="合計金額を入力" />
+ </div>
+ <div>
+ <button>割り勘計算</button>
+ </div>
+ <div>結果</div>
+ </div>
+```
+
+> 公式サイトより
+>
+>> 警告:
+>> JSXはHTMLよりもJavaScriptに近いので、React DOMはHTML属性名の代わりにcamelCaseプロパティ命名規則を使用します。たとえば、「class」はJSXでは「className」になり、「tabindex」は「tabIndex」になります。
+>>
+>
+
+まぁ、上ではclassと書いているけれども、classNameと書くべきだということなのか...
+ちなみに、どっちで書いてもHTMに展開されたとき同じ結果になってた。
+
+```jsx
+ <div className="center">
+ <div>
+ <input type="text" placeholder="人数を入力" />
+ </div>
+ <div>
+ <input type="text" placeholder="合計金額を入力" />
+ </div>
+ <div>
+ <button>割り勘計算</button>
+ </div>
+ <div>結果</div>
+ </div>
+```
+
+まだ、まだ、温泉にはつかれそうにない今日この頃...
+
+[この記事](https://qiita.com/tkymgr/items/12a2791e3659e28fe6ad)のつづきでした。