---
# System prepended metadata

title: 再續Redux
tags: [React]

---

# 再續Redux	

###### tags: `React`

## 2018 12 17 redux part1

這個筆記會提到`API`的分離, 然後把`API`也透過Redux的方法搞出來

首先老師先示範把檔案分離, 分成`container`和`component`
這邊我就不贅述了, 注意相對路徑不要寫錯而已.


### 有串redux的app長什麼樣子?

- actionTypes

- action => pure JavaScript object

- action creator => 幫助產生action的helper function

```javascript=
// 整組叫做action creator
export const updateNavTab = (tab) => {
	// action是指下面這些
    return {
        type: actionTypes.UPDATE_NAV_TAB,
        name: tab
    }
}
```

- reducer.js(當一個action進來時,我要怎麼update state)

- index.js中的<Provider /> => 有provider是為了可以傳store, store又是靠reducers建立, 而reducers又是靠combinReducers而來.

- containers (知道有redux的存在)

- components (不知道有redux的存在)

- withRouter要放在container哪一層

### API的部分 

原本是這樣
```javascript=
    componentDidMount(){
		axios.get('https://qootest.com/posts')
		....
    }
```
但是如果有其他地方也要用的話, 那我這個API就要重複了
所以這樣做不如, 我在開一個`WebAPI`的文件, 把所有會用到的API
都寫在文件裡面. 

```javascript=
export const getPosts = () => axios.get('https://qootest.com/posts')

export const getPost = postId =>
 axios.get('https://qootest.com/posts/' + postId)

export const deletePost = postId => axios.delete('https://qootest.com/posts/' + postId)
```

那這樣在post_list的頁面就會變成
```javascript=
    componentDidMount(){
		getPost()
		.then(res => this.setState({
			posts: res.data
		}))
    }
```

### API 的response都放在state裡面 => 優化

-> 改成redux, 那這樣我的state就要變成放在store裡面

那就要新的action...

---
額外補充, 何時export的時候要加上大括號?
ans:當你的文件裡面有很多東西要回傳時...

---

### action完成後就要更新reducer

```javascript=
case actionTypes.GET_POSTS:
// 代表說現在要抓這個posts
    return {
        ...globalState,
        isLoadingGetPosts: true,
    }

case actionTypes.GET_POSTS_SUCCESS:
    return {
        ...globalState,
        isLoadingGetPosts: false,
        posts:action.data
    }
```

### 接下來是container

這邊在新創一個`postListContainer`

在這邊準備好兩個=> `mapStateToProps`, `mapDispatchToProps`

這邊就是在設定state和設定傳給他的props. 