---
# System prepended metadata

title: Todo-List By React (二) sort important

---

# Todo-List By React (二) sort important
[Todo-List By React (一) 增加 todo](https://hackmd.io/@AlbusFu/rkjlmMDWj)
**[Todo-List By React (二) sort important](https://hackmd.io/9l5glQL5Sey2i16Qw9RcBA)**
[Todo-List By React (三) router and decoration](https://hackmd.io/Cf0LAxJUQRiybV-eh6ucWw)

參考[前端修練精神時光屋 2018 - 第一週 - todolist](https://hexschool.github.io/THE_F2E_Design/todolist/)的版型，可以點進去看看設計稿

今天在要加入 completed, important 兩個勾選欄，資料不那麼單純了，要把 useState 換成 useReducer

也會有對資料有越來越多的操作，所以做一個 hook 來放置資料，跟做一些操作。

useTodoList架構大概長這樣
```
const [todoList, dispatch] = useReducer(reducer, initTodoList)

// reducer 的 action.type 目前有 'ADD', 'UPDATE'

// 把渲染資料跟資料庫本身分開
// 一來不會直接接觸到，比較安全
// 二來之後對資料做操作(排序、篩選)，也不會動到原檔
const renderTodoList = todoList

return {renderTodoList, dispatch}
```

把資料串一串......

確認一下功能是不是跟之前一樣，能新增新的事項，能修改事項。

## 接下來，先處理簡單的部分
在 Form 元件加上 completed, important 兩個勾選欄
```
// 空的資料
cosnt initTodo = {
    completed: false,
    title: '',
    checked: '',
}

const [todo, setTodo] = useState(initTodo)

// 兩個 checkbox 長得差不多，名字不一樣而已
<input type='checkbox' 
    onChange={e => {setTodo({
        ...todo,
        completed: e.target.checked
    })}}
/>
```

再來處理 Todo 元件
```
const todo = props.todo

// 兩個 checkbox 長得差不多，名字不一樣而已
<input type='checkbox'
    checked={todo.completed}
    onChange={e => {
        todo.completed = e.target.value
        dispatch({
            action: 'UPDATAE',
            payload: todo,
        })
    }}
```

## 時間還夠，把 important 排序吧
回到 useTodoList，這時候 renderTodoList 派上用場了。
```
function importantSorter(todoList) {
    const important = []
    const unimportant = []
    
    todoList.forEach(todo => {
        if(todo.important){
            important.push(todo)
        }else{
            unimportant.push(todo)
        }
    })
    
    return [...important, ...unimportant]
}

const renderTodoList = importantSorter(todoList)
```

今天差不多就這樣，中途還大大卡關，只好上網求助，結果是 checkbox 值搞錯位置，它是放在 checked 而不是 value =3=

明天來弄 Router。
    
[GitHub version-1 程式碼](https://github.com/GeminiFu/todo-list-2/tree/master/version/version1/src)

[GitHub最新進度](https://geminifu.github.io/todo-list-2/dist/index.html)
<iframe src="https://geminifu.github.io/todo-list-2/dist/index.html" width="650px" height="600px"></iframe>

參考範本：
[前端修練精神時光屋 2018 - 第一週 - todolist](https://challenge.thef2e.com/news/1)