spirita1204 / IGS_WebSite

0 stars 0 forks source link

Demo Link : https://igs-website.onrender.com (Render.com雲端部屬 免費版 啟動要稍等片刻50秒左右)

plot plot
plot plot plot

專案架構圖

src
├── Components // 組件
    ├── [Wrapper]
        └── ViewPortWrapper.jsx // 重複Wrapper拉出共用
    ├── Navbar.jsx 
    ├── Sidebar.jsx
    └── ToDiListBtn.jsx // 代辦事項組件
├── Css 樣式
    ├── NavBar.css  
    ├── SideBar.css
    └── ToDoListBtn.css
├── i18n // 多語系設定檔
    └── i18n.js 
├── locales // 多語系
    ├── [zh-TW] // 根據語系做切包
        ├── common.json // 共用組件多語系
        └── toDoList.json   // 代辦事項多語系
    └── [zh-US]
        ├── common.json
        └── toDoList.json   
├── Pages // 畫面
    ├── App.jsx // 共用畫面 路由
    └── ToDoList.jsx // 代辦事項畫面     
└── index.js // 根結點(進入點)

建置 啟動 build

npx create-react-app igs_simple_website_project
npm start
npm run build

頁面路由(頁面錯誤url redirect) 避免無效訪問

npm i react-router-dom

<Routes>
    {/* 當初使載入 重定向到ToDoList */}
    <Route path="/" element={<Navigate to="/ToDoList" />} />
    {/* 設定路由 */}
    <Route path='/ToDoList' element={<ToDoList />}></Route>
    {/* 匹配到未定義的路徑時,自動重定向 */}
    <Route path="*" element={<Navigate to="/" />}/>
    ...
    ...
</Routes>

多語系

npm i react-i18next i18next
npm i i18next-browser-languagedetector

const { t } = useTranslation('toDoList');
t('COMPLETED')// 完成

uuid 作用於分辨每項代辦事項

npm i uuid

 addToDoList({
     title: inputValue,
     checked: false,
     **uuid: uuidv4(),**
     createdAt: new Date().toLocaleString(),
     date: new Date().toString()
 });

icon 控制排序方向

npm i react-icons
import { HiArrowDown, HiArrowUp  } from "react-icons/hi";

{/* 控制箭頭方向 作用排序(新增時間) */}
{dir === -1 && <HiArrowDown />}

LocalStorage 無後端 暫且keep資料在前端

localStorage.setItem('key', 'value'):塞資料進去
localStorage.getItem('key'):取得資料這個key的資料
localStorage.key():取得指定位置的key
localStorage.removeItem('key'):移除指定key的資料
localStorage.clear():清除所有localStorage的資料

addLstener “Enter” 鍵自動新增 增加使用體驗

  useEffect(() => {
    // 監聽enter時自動新增代辦事項
    const handleKeyDown = (event) => {
      if (event.keyCode === 13) {// Enter鍵觸發
        addToDoList({ title: inputValue, checked: false, uuid: uuidv4() });
      }
    }
    document.addEventListener('keydown', handleKeyDown);
    // 移除監聽事件
    return () => {
      document.removeEventListener('keydown', handleKeyDown);
    }
  }, [addToDoList, inputValue]);

雲端部屬 Render.com(free mode startup may delay requests by 50 seconds)

https://igs-website.onrender.com