对于任何一个有form(register, createProfile 一行一行的)的Component,提前写好一个onChange函数,对于form里的任何一行东西只要触发onChange,React Component 的state对应的变量就会改变
点击Submit按钮会调用onSubmit函数,调用 createProfile/register这些个 action,把Component里面的formData都传到action里 ,action用这些formData去做post,如果成功,就dispatch REGISTER_SUCCESS,相应的reducer会改变state里面的profile/auth 数据,有了数据,我们就可以在component里编写layout把这些数据漂亮的展示出来了;如果失败,就dispatch REGISTER_FAIL,相应的reducer会先把errors一个个alert出来(call setAlert),然后把erros放到state 里
1. JSON Web Token
用于用户认证,为了代替session,把用户数据都保存在客户端。
用户登录,服务器认证后生成一个JWT发回给用户,用户把JWT存到localStorage(或cookie)里面。从此客户端每一次与服务器通信,都要带上这个JWT。
为什么用JWT代替session?
使用session时对服务器集群和跨域服务的架构影响很大。因为cookie是不支持跨域的,如果是集群,就要共享session数据,让每台服务器都能读取session。
为了解决这个问题,我们引入JWT。用户信息都存储在前端,服务器就不需要存储session了,不管是跨域还是集群的,都能获取用户信息。
JWT三部分
1)Header:JSON对象,有签名的算法alg和token 类型 typ
2)Payload:JSON对象,存放实际需要传递的数据。有官方字段 iat exp… 可存放私有字段 “user”: { “id”: “nlnlknkn”}
- Signature: 对前两部分的签名,防止用户篡改数据。
我写了一个middleware,每次调用API的时候(GET, POST,等等)都带上这个middleware,把JWT解析成req.user.id给组件使用
2. Redux
Store: 存放state
Action: 在React Component里call action, 做HTTP request,根据不同的结果 dispatch 到不同的reducer
Reducer:根据action返回的类型,return 不同的state(如果成功,把payload放进state的相应位置;如果失败,把payload(一般是error的信息)写到state里面的error object)
a. Private route :
在 Dashboard, createProfile, EditProfile 这些Route,我都加上了PrivateRoute。在redux state的auth里有isAuthenticated,如果isAuthenticated, 如果是true就去普通的dashboard/profile/createProfile… component;如果是false,就redirect到login
- 用react 和 redux 做一个页面的过程:
1)(先处理好state): 先写action和reducer ,确保在页面上call action的时候此页面能获取到state里的相应信息
2)(再写component): 再根据获得的state里的信息,把它们呈现到页面上,做到美观
3. Responsive design
- 在css里创建一个className叫.hide-sm,当宽度低于某个值时就display:none
- 百分比布局
- rem布局
- 设置meta标签
- media query + 条件判断
4. React
a. 其实所有真正去到的route都是在App.js里定义的,backend里的route只是用来做http request
b. Hook
1) useState,当这个component 里有一个表格,我们需要component level state 来维护这个表格里的信息
2) useEffect,当我们需要一加载到这个component就需要get 点什么的时候(getProfile(s), getPost(s)),需要useEffect,就像componentDidMount一样
c. showActions
在PostItem.js,加一个 showActions,在Posts的页面使用PostItem这个组件时设成true(这是default),点赞评论那一行显示;在单独的post页面也使用PostItem这个component,不过showActions设成false,那一行不显示
5. Express & Node.js
用 Express & Node.js 创建服务器。
1. 创建路由处理器。HTTP动词,路径,中间件,回调函数。
2. 使用中间件。创建中间件auth,为特定的HTTP动词和路由添加该函数。
3. 错误处理。res.status(500).send('Server Error')。
4. 使用数据库。连接MongoDB,在数据库进行增删改查。
小tips:
1)Express-validator里面的check 和 result 检查 post的时候 body里面json格式内容是否有效
2)用 bcrypt 里面的salt和hash 对用户密码进行encrypt