9
4

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.

Alpine.jsを始めよう!

Last updated at Posted at 2021-09-19

はじめに

みなさま、Alpine.jsをご存知でしょうか?
まあ、ものすごく簡単に言うと かんたんなVue.js です。
ただでさえJSフレームワークの中では比較的簡単目なVue.jsですが、さらにかんたんです。
どんぐらいかんたんかというと jQueryと同じかそれ以上 ってレベルです。
しゅごい!
今回はこれを紹介していこうと思います。

JSフレームワークとは

SPAとかJSでなんかすごいことやりたいときに入れるやつ 、くらいの雑な認識で大丈夫です。
いわゆる3大フレームワークと言われているのがお互い影響し合いつつ、競い合っている感じです。
概ねデータバインディング(JS内の変数の値をそのまま出したり、formから書き込んだり)がしたいときに使われることが多いかと思います。

  • Angular
    • おそらく一番初めに出たJSフレームワーク
    • Google製で、Google内で燃えに燃えている案件を鎮火させる過程で生まれたリアル銀の弾丸
    • ver1の頃は「AngularJS」だったが、2以降ほぼ別物になったので「JS」が名前から外れた
  • React
    • Facebook製
    • プログラマライクな作りなおかげか、おそらく最も人気がある
    • ふだんJSを書かない人には死ぬほど敷居が高い
  • Vue.js
    • GoogleでAngularを使っていたエヴェン・ヨーによって開発された
    • 感覚的にはAngularとReactのいいとこ取りって感じ
    • .vueファイルにhtmlもjsもcssもまとめて書いちゃう

Vue.jsと違うところ、同じところ

v2の日本語版ドキュメントでも白状されていますが、

このツールのシンタックスは、ほぼ完全に Vue(それと、Angular による拡張)から借用しています。

ということで、結構シンタックスが似ています。
普段Vue.jsを使っている、あるいは挫折してしまったという人には朗報な気がします。

違うところ

マスタッシュ記法 {{ }} でデータバインディングをしない

Vue.jsでは

hoge.vue
<template>
  <div>
    <p>{{ hoge }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {hoge: 'ほげ'};
  }
}
</script>

みたいに書くと

ほげ

って表示されます。 scriptdata のところで返している hogetemplate の {{ hoge }} のところに当てはめています。
これがいわゆるマスタッシュ記法なんですが、これがAlpine.jsだとできません。

ちなみにAlpine.jsで同じことやると

hoge.blade.php
<div x-data="{hoge: 'ほげ'}">
  <p x-text="hoge"></p>
</div>

だけでいいのです。すごくないですか?

ディレクティブのprefixが違う

上の例でもチラチラ出てますが、 x-data とか x-text ってところですね。
Vue.jsに v-data はないのですが、 v-text はありますよね。
そう、Vue.jsで v- にしていたところが x- になっています。
Vue.js脳の人はそのままxにしていただければいいってことですね。
なんでXなのかは知りません。エェーックス!!

.vueファイルを作らなくていい

Vue.jsでも.vueファイル作ることが必須ではないのですが、作らずにコンポーネントを作ろうとすると大きな困難に立ち向かうことになるので、だいたい作ると思います。
Alpine.jsはhtmlソースに直接ガンガン書けるので大体のケースでは外部ファイルでわざわざJS書く必要すらありません。

同じところ

シンタックスシュガーがほぼそのまま使える

まあ、とくに onbind のところですね。
こいつらは @: でいけます。おかげさまでVue.js書いてる感が出て楽しいです。

タブインターフェースを作ってみよう!

Alpine.jsをつかってよくあるタブインターフェースを作ってみましょう!
Alpine.jsは今流行りの tailwindcss とセットで語られることが多いので、それも使ってみましょう。

土台のHTMLをつくる

tailwindcssのドキュメントHTML starter template とかちょうど良さそうなのがあるので、これを引っ張って、そこにtailwindcssとAlpine.jsをCDNから引っ張ってくるコードを足してみました。

index.html
<!doctype html>
<html>
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
  <script defer src="https://unpkg.com/alpinejs@3.3.4/dist/cdn.min.js"></script>
  <title>Alpine tab sample</title>
</head>
<body>

</body>
</html>

次に tailwindcomponents というサイトに良さげなタブの作例があるのでこちらを参考にさせてもらいます。今回はこちらを使用させていただきました。
https://tailwindcomponents.com/component/simple-tab

これらを使って桃太郎と浦島太郎を切り替えるタブを作ってみました。
htmlだけだとこんな感じです。

index.html
<!doctype html>
<html>
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <script defer src="https://unpkg.com/alpinejs@3.3.4/dist/cdn.min.js"></script>
  <link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
  <title>Alpine tab sample</title>
</head>
<body>
    <div class="p-8">
        <div style='border-bottom: 2px solid #eaeaea'>
            <ul class='flex cursor-pointer'>
              <li class='py-2 px-6 bg-white rounded-t-lg'>桃太郎</li>
              <li class='py-2 px-6 bg-white rounded-t-lg text-gray-500 bg-gray-200'>うらしまたろう</li>
            </ul>
        </div>
        <div>
          むかし、むかし、あるところに、おじいさんとおばあさんがありました。まいにち、おじいさんは山へしば刈かりに、おばあさんは川へ洗濯せんたくに行きました。
           ある日、おばあさんが、川のそばで、せっせと洗濯せんたくをしていますと、川上かわかみから、大きな桃ももが一つ、
          「ドンブラコッコ、スッコッコ。
          ドンブラコッコ、スッコッコ。」
           と流ながれて来きました。
        </div>
        <div>
          むかし、むかし、あるところに浦島太郎という心やさしい漁師が住んでいました。
          ある日のこと、浜辺を歩いていると一匹の亀が子供達にいじめられているのを見ました。
          「これこれ、かめをいじめたらかわいそうだよ。はなしておやり」
          そう言って浦島太郎は子供たちから亀を助けてやりました。
        </div>
    </div>
</body>
</html>

image.png

現状話が混ざってしまってますね。ここにAlpine.jsのロジックを入れていきましょう。

Alpine.jsの仕掛けをいれる

まずは x-data ディレクティブを入れます。
これは一番てっぺんのdivに入れてあげます。
x-dataとっておきたいデータを入れておく場所 です。
この辺に入れます

<body>
    <div class="p-8" x-data="{open: 1}">

x-data の値のところはまんまjsのobjectですね。

次にイベントハンドラを入れていきましょう。
タブのところですね。

        <div style='border-bottom: 2px solid #eaeaea'>
            <ul class='flex cursor-pointer'>
              <li class='py-2 px-6 bg-white rounded-t-lg' @click="open = 1">桃太郎</li>
              <li class='py-2 px-6 bg-white rounded-t-lg' @click="open = 2">うらしまたろう</li>
            </ul>
        </div>

@click ってところがイベントハンドラです。clickって言っているくらいなので ここをクリックしたら ってところです。
値のところはどんな動作をさせるか、なんですが、ここでは x-data に入れている open の値を変えているよーっていう動作を入れています。

これでタブをクリックすれば内容が切り替わるようになったのですが、タブの色が切り替わらないので、切り替わるロジックを入れてやります。

        <div style='border-bottom: 2px solid #eaeaea'>
            <ul class='flex cursor-pointer'>
              <li class='py-2 px-6 bg-white rounded-t-lg' @click="open = 1"
              :class="{'text-gray-500 bg-gray-200': open !== 1}">桃太郎</li>
              <li class='py-2 px-6 bg-white rounded-t-lg' @click="open = 2"
              :class="{'text-gray-500 bg-gray-200': open !== 2}">うらしまたろう</li>
            </ul>
        </div>

:class ってところが ロジックで適用するクラスを切り替えているところ になります。
値のobjectのvalueは判定式になっていて、そこが true のときにkeyに書いてあるクラスが適用されます。

できあがり

最終的なソースはこんな感じになります。

index.php
<!doctype html>
<html>
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <script defer src="https://unpkg.com/alpinejs@3.3.4/dist/cdn.min.js"></script>
  <link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
  <title>Alpine tab sample</title>
</head>
<body>
    <div class="p-8" x-data="{open: 1}">
        <div style='border-bottom: 2px solid #eaeaea'>
            <ul class='flex cursor-pointer'>
              <li class='py-2 px-6 bg-white rounded-t-lg' @click="open = 1"
              :class="{'text-gray-500 bg-gray-200': open !== 1}">桃太郎</li>
              <li class='py-2 px-6 bg-white rounded-t-lg' @click="open = 2"
              :class="{'text-gray-500 bg-gray-200': open !== 2}">うらしまたろう</li>
            </ul>
        </div>
        <div x-show="open === 1">
          むかしむかしあるところにおじいさんとおばあさんがありましたまいにちおじいさんは山へしば刈かりにおばあさんは川へ洗濯せんたくに行きました
           ある日おばあさんが川のそばでせっせと洗濯せんたくをしていますと川上かわかみから大きな桃ももが一つ
          ドンブラコッコスッコッコ
          ドンブラコッコスッコッコ。」
           と流ながれて来きました
        </div>
        <div x-show="open === 2">
          むかしむかしあるところに浦島太郎という心やさしい漁師が住んでいました
          ある日のこと浜辺を歩いていると一匹の亀が子供達にいじめられているのを見ました
          これこれかめをいじめたらかわいそうだよはなしておやり
          そう言って浦島太郎は子供たちから亀を助けてやりました
        </div>
    </div>
</body>
</html>

桃太郎時
image.png
うらしまたろう時
image.png

まとめ

以上、Alpine.jsのしょうかいでした!
こんな恐ろしく簡単に、サクッととんでもないことできちゃうの、熱くないですか?

9
4
0

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
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?