371
153

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

宣言的UIって何なん? 〜日本昔ばなし「やめ太郎」〜

Last updated at Posted at 2020-01-05
1 / 47

昔々、あるところに「やめ太郎」と言う中年ザコーダーがおったそうじゃ。


ある日、やめ太郎はこんな画面をコーディングしておったそうじゃ。

hello.gif


  • テキストフォームに文字を入力すると、それと連動して下の文字列も変わる。
  • 一番下の行には、それを大文字にしたものが表示される。

という仕組みだったそうじゃ。


HTMLでいうと、こんなイメージじゃ。

<main>
    <input type="text" value="hello!">
    <!-- ↑入力フォーム -->

    <p><!-- 上のフォームに入力した文字列がここに表示される --></p>
    <p><!-- それを大文字にした文字列がここに表示される --></p>
</main>

コードは次のような感じだったそうじゃ。


「大枠となるmain要素を作っておくれ」

const main = document.createElement("main");

「messageの初期値はhello!にしておくれ」

let message = "hello!";

「次はinput要素を作っておくれ」

const input = document.createElement("input");

 

「そのinput要素のvalueにはさっきの`message`、つまり`hello!`を入れておいておくれ」
input.value = message;

「そのinput要素に何か入力するたびにinputHandlerという関数が実行されるようにしておくれ」

input.addEventListener("input", inputHandler);

 

「そのinput要素を、大枠となるmain要素の中に入れてやっておくれ」

main.appendChild(input);

「次はp要素を1つ作っておくれ」

const p1 = document.createElement("p");

 

「そのp要素の中身は、さっきの`message`を入れておいておくれ」
p1.innerHTML = message;

「このp要素も、大枠となるmain要素の中に追加しておくれ」

main.appendChild(p1);

「次は、p要素をもう1つ作っておくれ」

const p2 = document.createElement("p");

 

「そのp要素の中身は、さっきの`message`を大文字にしたものを入れておくれ」
p2.innerHTML = message.toUpperCase();

「このp要素も、大枠となるmain要素の中に入れてやっておくれ」

main.appendChild(p2);

 

「そして、その大枠のmain要素をbodyタグにぶち込んでやっておくれ」
document.body.appendChild(main);

この様に「〇〇しておくれ。次は〇〇しておくれ」と言う、いわゆる「命令的な」コードを書いておったそうじゃ。


面倒くさがりなやめ太郎は、こう思ったそうじゃ。


ワイ「欲しいUI書くコードが掛け離れてるから、ややこしいなぁ」


ワイ「このUIを構築するためには、こんな命令たちを書いていかなアカンな!」
ワイ「って感じで、頭の中で変換してからコードを書くのがちょっと億劫やな」


ワイ「これくらいシンプルなUIならそれほど苦にならへんけど」
ワイ「もっと複雑な画面を作ることになったら大変そうやなぁ」


ワイ「もっと、求めているUIをそのままコードとして書けたらいいのになぁ」


ワイ「つまり、欲しいパーツ書くべきコードが」
ワイ「もっと対になっている感じだったらええのになぁ・・・」


時は流れ・・・


ある日、やめ太郎は、おじいさんとおばあさんからもらったVue.jsを使って同じUIを作ってみたそうじゃ。


Vue.jsの場合は、次のようなコードだったそうじゃ。


テンプレート部分

<template>
  <main>
    <input type="text" v-model="message">
    <p>{{ message }}</p>
    <p>{{ message.toUpperCase() }}</p>
  </main>
</template>

{{ message }}の部分は変数の中身が表示されるんやで」


JavaScript部分


<script>
export default {
  data() {
    return {
      message: "hello!"
    };
  }
};
</script>

messageの値が変わったら、それと連動して画面上の文字列も変更するんやで」


先ほどの命令的なコードに比べると、欲しいUIを比較的そのまま書くことができたため、


ワイ「欲しいUIはこんな感じやで!」


・・・みたいに、宣言する感じで書けてええやん!


「今まで↓こんな感じのコードだったのが・・・」

const main = document.createElement("main");

let message = "hello!";

const input = document.createElement("input");
input.value = message;
input.addEventListener("input", inputHandler);

main.appendChild(input);

const p1 = document.createElement("p");
p1.innerHTML = message;

main.appendChild(p1);

const p2 = document.createElement("p");
p2.innerHTML = message.toUpperCase();

main.appendChild(p2);

document.body.appendChild(main);

「↓こうやもんな!!!」

<template>
  <main>
    <input type="text" v-model="message">
    <p>{{ message }}</p>
    <p>{{ message.toUpperCase() }}</p>
  </main>
</template>

これはええで!!!


やめ太郎は、そんな風に思ったそうな。


欲しいUIを頭の中で一度整理して、

「〇〇しておくれ」
「次は〇〇しておくれ」

という命令に変換しなくても、
Vue.jsのおかげで宣言的にUIを書くことができたやめ太郎。


そのおかげで、コーディングもサクッと終えることができたそうじゃ。


空いた時間で、鬼退治もできたそうな。


めでたしめでたし


まとめ


宣言的UIのメリット

  • 「どうやってやるか」じゃなくて「どんなのが欲しいか」で書ける。
  • Vueを使うと、htmlのタグっぽく書けるので更にそこが強まる。

おまけ


よめ太郎「Vueだけじゃなくて、ReactだってJSX使えばhtmlっぽく書けるじゃねぇか!」


よめ太郎「Angularだって宣言的じゃねえか!」


よめ太郎「お前の好きなElmだって宣言的じゃねえか!」


ワイ「せやで」


ワイ「でもこのお話は、Vueのイベント用に作ったから」


ワイ「こうするしかなかったんや・・・」


〜完〜

371
153
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
371
153

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?