iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 27
0
Modern Web

使用 React 製作簡易專案管理網站:從基礎到實戰系列 第 27

[Day 27] React 攻城戰 - 顯示看板

  • 分享至 

  • xImage
  •  

顯示看板

我們要將 useReducer 中看板的 state 顯示出來。首先在 src/components 資料夾中新增 Board 資料夾,然後在 Board 資料夾底下新增名稱為 Board.js 的檔案以及 Board.module.scss 的樣式檔案:

import React from "react";

import styles from "./Board.module.scss";

const Board = props => {
  return (
    <div className={styles.board}>
      <h2 className={styles.name}>
        {props.name}
      </h2>
    </div>
  );
};
.board {
  margin-right: 8px;
  border-radius: 4px;
  width: 320px;
  background-color: darkgray;
  display: flex;
  flex-direction: column;
  padding: 8px;
  flex-shrink: 0;
  position: relative;

  .name {
    padding: 8px;
    cursor: pointer;
    width: 50%;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;

    &:hover {
      text-decoration: underline;
    }
  }
}

其中先準備好從 props 中取得看板的名稱 name 並且顯示出來。

建好 Board 元件之後,我們就可以在 App 元件中來使用它,並且傳入看板名稱:

import React from "react";
import { reducer, initialState } from "./reducer";
import AddBoard from "../AddBoard/AddBoard";
import styles from "./App.module.scss";

// 引用 Board 元件
import Board from "../Board/Board";

const App = () => {
  const [state, dispatch] = React.useReducer(reducer, initialState);
  
  const [isEditingTitle, setIsEditingTitle] = React.useState(false);
  
  React.useEffect(() => {
    document.title = state.title;
  }, [state.title]);
  
  return (
    <div className={styles.app}>
      {isEditingTitle ? (
        <input
          className={styles.titleInput}
          value={state.title}
          onChange={e => {
            dispatch({
              type: "CHANGE_TITLE",
              payload: {
                title: e.target.value
              }
            });
          }}
          onKeyPress={e => {
            if (e.key === "Enter") {
              setIsEditingTitle(false);
            }
          }}
          autoFocus
        />
      ) : (
        <h1 className={styles.title} onClick={() => setIsEditingTitle(true)}>
          {state.title}
        </h1>
      )}
      <div className={styles.boards}>
        {state.boards.ids.map((id, index) => (
          <Board
            key={id}
            // 傳入看板名稱
            name={state.boards.byId[id].name}
          />
        ))}
        <AddBoard />
      </div>
    </div>
  );
};

export default App;

成果畫面

下集預告

加入刪除看板與編輯看板名稱的功能。


上一篇
[Day 26] React 攻城戰 - 加入新增看板功能
下一篇
[Day 28] React 攻城戰 - 加入刪除看板與編輯看板名稱功能
系列文
使用 React 製作簡易專案管理網站:從基礎到實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言