タグ: Javascript

  • プログラミングスキルアップ|Next.jsを学ぶ#03

    プログラミングスキルアップ|Next.jsを学ぶ#03

    Youtube動画を見ながらNext.jsの学習を進めようの記事、第三弾となります。

    1回目の記事はこちら

    2回目の記事はこちら

    今回の対象ファイル

    今回の3回目ではログインページのフォーム追加であったり、サインアップ・ログインボタンの実装をしていってます。

    主に編集を加えていってるのは以下のファイル

    src/app/page.tsx
    src/components/forms/PatientForm.tsx
    src/components/CustomFormField.tsx
    src/components/SubmitButton.tsx

    これに新しく、validation.tsを作成しています。

    src/lib/validation.ts

    コンポーネント部分の調整と、フォーム入力の際のバリデーションに関する実装、という感じですね。

    フックの利用

    PatientForm.tsxの編集では、フックと呼ばれるものが出てきました。

    いまいち理解していなかったので、例のごとくChatGPTに質問。

    useStateは状態管理に関するもので、useRouterはルーティング機能に関するものなんですね。

    現在の情報、状態の更新、状態の初期値を指定することで、レンダリングするたびに更新されるというのがuseStateだと。

    そしてuseRouterは

    useRouter は Next.js のフックで、ページのルーティング(URL の遷移やクエリパラメータの取得など)に関する情報やメソッドにアクセスするために使用されます。Next.js はページベースのルーティングシステムを提供しており、useRouter はこのシステムと連携するための強力なツールです。

    と書かれていますので、オブジェクトを作った上で以下メソッドを利用してページ遷移の実装をしているんですね。

    この辺はWordPress(PHP)での扱いに近いなぁと思いながらコーディングを進めていきます。

    フォームフィールドに関するコンポーネントの編集

    フォーム入力部分については、テキスト形式(名前など)なのか、数字形式(電話番号)なのかの条件分けが必要になるので、今回はswitch文を利用して作成していきます。

    const RenderField = ({field, props}: {field: any; props:CustomProps}) => {
      const {fieldType, iconSrc, iconAlt, placeholder} = props;
    
      switch (fieldType){
        case FormFieldType.INPUT:
          return(
            <div className="flex rounded-md border border-dark-500 bg-dark-400">
              {iconSrc && (
                <Image
                  src = {iconSrc}
                  height = {24}
                  width= {24}
                  alt = {iconAlt || "icon"}
                  className = "ml-2"
                />
              )}
              <FormControl>
                <Input 
                  placeholder={placeholder}
                  {...field}
                  className="shad-input border-0"
                />
              </FormControl>
            </div>
          )
        case FormFieldType.PHONE_INPUT:
          return(
            <FormControl>
              <PhoneInput 
                defaultCountry="JP"
                placeholder = {placeholder}
                international
                withCountryCallingCode
                value = {field.value as E164Number | undefined}
                onChange={field.onChange}
                className="input-phone"
              />
            </FormControl>
          )
        default:
          break;
      }
    }

    ここで太字にしているPhoneInputというのがnpmでインストールする必要がありました。

    React-phone-number-inputというものが用意されているようで、これをnpmで実行すれば使えるようになりました。

    属性値には国名を入れることになりますが、日本の場合は『JP』と入力すればOK。

    これを入れることで、入力フォームによくある国旗と+●●みたいなのが出てくるようになりました。

    実際のフォームフィールドについて項目を追加

    今回は、氏名・メールアドレス・電話番号が必要になるフォームの実装でしたので、コードはこんな感じになっています。

    <Form {...form}>
        <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6 flex-1">
          <section className="mb-12 space-y-4">
            <h1 className=" header ">Hi there ✊</h1>
            <p className="text-dark-700">schedule your first appointment.</p>
          </section>
    
          <CustomFormField 
            fieldType = {FormFieldType.INPUT}
            control = {form.control}
            name="name"
            label="Full name"
            placeholder = "サンプル太郎"
            iconSrc = "/assets/icons/user.svg"
            iconAlt = "user"
          />
    
          <CustomFormField 
            fieldType = {FormFieldType.INPUT}
            control = {form.control}
            name="email"
            label="Email"
            placeholder = "sampletaro@test.com"
            iconSrc = "/assets/icons/email.svg"
            iconAlt = "email"
          />
          
          <CustomFormField 
            fieldType = {FormFieldType.PHONE_INPUT}
            control = {form.control}
            name="phone"
            label="Phone number"
            placeholder = "01234567890"
            iconSrc = "/assets/icons/phone.svg"
            iconAlt = "phone"
          />

    このCustomFormFieldひとつひとつが入力欄になっているわけですね。

    そしてSubmitボタンを作成していくことになります。

    Validationの実装

    バリデーションはzodを利用して簡潔に書いていきます。

    これ、すごく便利ですね。フォームのバリデーションって結構めんどいイメージでしたけど、zod利用するとかなり簡潔に記載することができました。

    export const UserFormValidation = z.object({
      username: z.string()
      .min(2, "ユーザー名は2文字以上入力してください")
      .max(50, "ユーザー名は50文字以内で入力してください"),
      email: z.string().email("無効なアドレスです"),
      phone: z.string().refine((phone) => /^\+\d{1,14}$/.test(phone), "無効な電話番号です")
    })

    動画ではエラーメッセージも英語で書いてますが、ここは自分の学習目的なので日本語で置き換えてます。

    まとめ

    こんな感じで、やっとこ動画の進捗が1時間を超えてきました(実際は5時間以上ある)

    今のところはこんな感じ。左側のフォームが増えているのがわかります。

    さぁ引き続き頑張っていきます!

  • プログラミングスキルアップ|Next.jsを学ぶ#01

    プログラミングスキルアップ|Next.jsを学ぶ#01

    プログラミング言語はいろいろあって、その中でも流行り廃りがありますが、フロントエンドエンジニアとしての最近のトレンドの一つに、Next.jsがありますね。

    Next.js(ねくすとじぇいえす)はJavascriptのフレームワークの一つで、ReactやTypescriptを利用して構築していきます。
    おしゃれなサイトができやすい、最近流行りの他のライブラリやツールとも互換性があるのも魅力でしょう。

    プログラミングを学びはじめると、HTML・CSSからいってみよー!というのがどのサイトや本でも書かれているのですが
    なかなかその2つだけだと効率的にお仕事に結びつきません。

    そうすると新しいスキルを身につけようという動きになって、JavascriptやPHPといった言語を扱い、WordPressでホームページ制作ができるようになっていくというのがメジャーなロードマップになります。

    そのJavascriptもいろんなライブラリ・フレームワークがあるわけですが、最近はもっぱらTypescriptを利用しつつReactを使ってNext.jsでサイトを構築していくのが主流でしょう。むしろこれら使わないとフロントエンドエンジニアとしての未来が閉ざされるんじゃ無いかってくらいです。

    じゃあどうやって学んでいくかという話になりますが、書籍・学習サイトとありますが私がお勧めするのはYoutubeです。それも英語のチャンネルがおすすめ。一連の動きをまとめた動画で、数時間に及ぶものがゴロゴロ公開されていますので、それを見ながら手を動かしていくのがスキル定着にはもってこいです。

    まずは手を動かしつつ、何をやっているのかわからない部分があればChatGPTなどに聞いてみるのが効率の良い勉強になるでしょう。

    というわけで、私も動画を見つつサイトを構築していってます。

    参考にしている動画はこちら。

    そしてつくっているコードはこちらです(随時更新予定)

    https://github.com/takumakoike/nextjs-careplus/tree/main/careplus

    ここではどんなことを学んだのか、アウトプットとして記事を用意していこうと思います。
    まずは第一弾としてやったことを。

    環境設定

    ターミナルを開いて、新規にnext.jsのappを作成します。

    npx create-next-app@latest アプリ名

    この後に出てくる設定はすべてデフォルトのまま進めています。

    必要なもののインストール

    今回はTailwindcssやTypescriptは最初から入れてましたのでそんな必要となるものはなかったですが、UI構築のためにShadcnというのを利用しています

    npx shadcn-ui@latest init

    そしてTailwindのアニメーションも追加しているので

    npm install tailwindcss-animate

    あとはダークモードの設定やらで

    npm install next-themes

    といった感じでインストールをしています。現時点では。

    それぞれの公式サイトはこちら。

    Tailwindcss

    Shadcn/ui

    こうみると、『必要なものをインストール』と『インストールしたものを利用してコーディング』を行き来している感じがあります。

    page.tsxの作成

    トップページ、今回はログインをするようなページになるのですが、これを作成していきます。

    詳しいコードはGithubを参考にという感じですが、やっていることは、Formのコンポーネントを用意して表示することと、簡単なレイアウトとしてロゴ画像だったり画面右側に画像を表示させることをやっています。

    componentsの作成

    コンポーネントはFormコンポーネントを用意しています。
    現時点ではUsernameを入れられるフォームを作り、それが規定文字数以下だったらエラーになるように作ってます。

    いやー、これを一からフォームタグ使って実装しようとすると既に辛い未来が見えるので、こういった時にライブラリをすっと利用できるっていうのは本当にありがたいですね。

    現状

    現時点ではレスポンシブ対応がまだなので、画像もずれるし、実際のログイン認証なんかも実装はできてない状態。

    英語の動画ってどうなの?

    英語版の動画を見ていて、本当に理解しているの?と質問が来そうですが、言葉を全て理解しているわけではありません。
    大事なのは、画面で何をしているのかがわかることであったり、推測しながら手を動かすことです。

    確かに日本の動画の方がわかりやすいですが、海外の動画の方がおしゃれなサイトを作る動画が多かったりして作っていく楽しみは大きいんですよね。

    意外と言葉がわからなくても何とかなるもんだと、HTMLの学習時代から感じているので、日本の動画で参考にするものが見つからない方はチャレンジしてみることがおすすめです!

    そんな感じで引き続き頑張っていきたいたいと思います。

    Instagramではプログラミング初学者向けに情報発信をしています。気軽にフォロー・コメント待ってます🎵

    https://www.instagram.com/takuma.internet.skill/?hl=ja