iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

我最近剛好有個想做的sideProject

第一件事我想先做一個登入的地方

我們先做一個Login 的,我是用shadcn+tailwind css做的

import React, { useState } from 'react'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import useLogin from './useLogin'

export default function Login() {
    const [account, setAccount] = useState("")
    const [password, setPassword] = useState("")
    const { login, loading, error } = useLogin()

    if (error) return <div>Error: {error}</div>
    if (loading) return <div>loading...</div>
    return (
        <div className='w-screen h-screen flex flex-col justify-center items-center'>
            <h1 className='text-2xl'>Login</h1>
            <Input className='w-[200px] my-2' type='text' placeholder="Account" value={account} onChange={(e) => setAccount(e.target.value)} />
            <Input className='w-[200px] my-2' type='password' placeholder="password" value={password} onChange={(e) => setPassword(e.target.value)} />
            <Button size="sm" onClick={() => login(account, password)}>Login</Button>
        </div>
    )
}

寫完Login發現我們需要login function, loading, error這三個東西

了解需求後我們就能開始寫hook了

useLogin

import axios from "axios";
import React, { useState } from "react";

export default function useLogin() {
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");

  async function login(account: string, password: string) {
    if (!account) return setError("請輸入帳號");
    if (!password) return setError("請輸入密碼");
    try {
      setLoading(true);
      await axios.post("apiUrl", {
        account,
        password,
      });
			// 導去別頁
    } catch (err) {
      setError(String(err));
    } finally {
      setLoading(false);
    }
  }

  return { login, loading, error };
}

api因為我還沒開始寫資料跟後端,所以先放一個假的,我們要先判斷使用者有沒有輸入account與password,如果沒有就要回傳錯誤,有的話先跑loading,成功的話可能要導去別頁,明天要把這個測試寫完,並且不只hook測試,也會講如何寫頁面的測試


上一篇
[Day 25] useInterval測試
下一篇
[Day 27] useLogin test
系列文
React進階班,用typescript與jest製作自己的custom hooks庫30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言