JavaScript 開発

ちょいたしフレームワーク

投稿日:

CDNでjQueryを利用して、HTMLでちょっとした処理をするのは、とても便利です。

ですが、今さらjQueryって……というのもあるので、ReactやVueでも、ちょろっとできないかな? と思い、トライしてみました。

サンプルなので、簡単なJSONレコードをループで表示しているだけですが、jQuery、React、Vueで、それぞれ同じ挙動ができました。

jQuery

まずは、ベースとなるjQuery版です。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JQuery</title>
</head>
<body>

    <!-- JSファイル読み込み -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

    <!-- スクリプト -->
    <script>

        // JSONレコード作成
        const recs = [
            {id: 1, value: "Test1"},
            {id: 2, value: "Test2"},
            {id: 3, value: "Test3"},
            {id: 4, value: "Test4"},
            {id: 5, value: "Test5"},
        ];

        // 変数の宣言
        let reactMessage = "";
        let reactRecs = [];

        // マウント時
        $(function(){

            // 変数の初期化
            initReactVariables();

            // 変数の表示
            dispReactVariables();

        })

        // 変数の初期値を設定
        const initReactVariables = () => {

            // メッセージ設定
            reactMessage = "Test CDN JQuery";
                            
            // JSONレコード設定
            reactRecs = recs;

        }

        // DOM作成と表示
        const dispReactVariables = () => {

            // メッセージ作成
            const divMessage = $("<div></div>");
            divMessage.text(reactMessage);

            // JSONレコード作成
            const divRecs = $("<div></div>");

            // レコード数分ループ
            reactRecs.forEach(it => {

                // DOM作成
                const pRow = $("<p style='margin: 0'></p>");
                const spanId = $(`<span>ID: ${it.id}</span>`);
                const spanValue = $(`<span style='margin-left: 10px;'>Value: ${it.value}</span>`);
                pRow.append(spanId, spanValue);
                divRecs.append(pRow);

            })

            // Appに追加
            const divApp = $("#app");
            divApp.append(divMessage);
            divApp.append(divRecs);

        }

    </script>

    <!-- HTML -->
    <div id="app"></div>

</body>
</html>

これ実行すると、下記が表示されます。

React

次はReact版です。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>React</title>
</head>
<body>

    <!-- JSファイル読み込み -->
    <script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

    <!-- スクリプト -->
    <script type="text/babel">

        // JSONレコード作成
        const recs = [
            {id: 1, value: "Test1"},
            {id: 2, value: "Test2"},
            {id: 3, value: "Test3"},
            {id: 4, value: "Test4"},
            {id: 5, value: "Test5"},
        ];

        // モジュール取得
        const { useEffect, useState } = React;

        // Reactインスタンス作成
        const App = () => {

            // リアクティブ変数の宣言
            const [ reactMessage, setreactMessage ] = useState("");
            const [ reactRecs, setreactRecs ] = useState([]);

            // ライフサイクルフック(マウント)
            useEffect(() => {

                // リアクティブ変数の初期化
                initReactVariables();

            }, [])

            // リアクティブ変数の初期値を設定
            const initReactVariables = () => {

                // メッセージ設定
                setreactMessage("Test CDN React");
                                
                // JSONレコード設定
                setreactRecs([...recs]);

            }

            // 戻り値の設定(JSX)
            return(
                <>
                    <div>{reactMessage}</div>
                    <div>
                        { reactRecs.map(it => {
                            return(
                                <p style={{ margin: 0 }}>
                                    <span>ID: { it.id }</span>
                                    <span style={{ marginLeft: '10px' }}>Value: { it.value }</span>
                                </p>
                            )
                        }) }
                    </div>
                </>
            );

        }

        // Appに追加
        const app = document.querySelector("#app");
        ReactDOM.render(<App />, app);

    </script>

    <!-- HTML -->
    <div id="app"></div>

</body>
</html>

これを実行すると、下記が表示されます。jQuery版と同じですねw

Vue

最後はVue版です。こちらは、Vue3のCompositionAPIです。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue</title>
</head>
<body>

    <!-- JSファイル読み込み -->
    <script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>

    <!-- スクリプト -->
    <script type="module">

        // JSONレコード作成
        const recs = [
            {id: 1, value: "Test1"},
            {id: 2, value: "Test2"},
            {id: 3, value: "Test3"},
            {id: 4, value: "Test4"},
            {id: 5, value: "Test5"},
        ];

        // モジュール取得
        const { createApp, ref, reactive, onMounted } = Vue;

        // Vueインスタンス作成
        const App = createApp({
            setup() {

                // リアクティブ変数の宣言
                const reactMessage = ref("");
                const reactRecs = reactive([]);

                // ライフサイクルフック(マウント時)
                onMounted(() => {

                    // リアクティブ変数の初期化
                    initReactVariables();

                })

                // リアクティブ変数の初期値を設定
                const initReactVariables = () => {

                    // メッセージ設定
                    reactMessage.value = "Test CDN Vue3 with Composition API";

                    // JSONレコード設定
                    reactRecs.push(...recs);

                }

                // 戻り値の設定
                return {

                    reactMessage,
                    reactRecs,

                };

            },

        });

        // Appに追加
        App.mount("#app");

    </script>

    <!-- HTML -->
    <div id="app">

        <div>{{ reactMessage }}</div>

        <div>
            <p style="margin: 0" v-for="it in reactRecs" :key="it.id">
                <span>ID: {{ it.id }}</span>
                <span style="margin-left: 10px;">Value: {{ it.value }}</span>
            </p>
        </div>

    </div>

</body>
</html>

これを実行すると、下記が表示されます。見た目は変わらないですねw

この程度ですと、どれを使ってもコード量は、それほど変わりません。

であれば、jQueryでも全然良いのかもしれませんw

ただし、jQueryだと、動的なDOM作成がちょっと面倒な部分があり……

Reactは、useStateとJSXが、微妙に気持ち悪いんだよな……

そして、Vueは、refとreactiveが、少し分かりずらいし……

と、それぞれの愚痴をこぼしつつ、まあ、できたから良いかな? という感じです。

たぶん、慣れなんだと思います……

というわけで、一応githubにも公開しておきましたので、興味があれば覗いてみてください。

-JavaScript, 開発
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

ec_kidoilog

Kido iLog

忘れられない、その気持ち、その痛みを残しておきませんか? Kido iLog は、そんな心のログを記録するアプリです。 と言うことで、Google Play 2つ目です!! こちらも約5年振りの公開で …

PREV
SurfaceOS