react-redux-express异步先后端数据交互(面向初学者,高手勿进)

花了整整三天的时间来解决一个很是很是小的问题.想要把一点心得体会记录下来.
首先是问题的提出:前端若是是react,后端是express,如何进行数据的交互.html

1.整体思路

之前接触express的时候前端模板用的是ejs,那时候就有些不理解的地方.最为不理解的几个问题是:前端和后端怎么配合?特别是前端特别复杂的时候,难道仍是全用模板吗?若是前端用了框架呢?这些问题对于大部分开发者或者非初级学习者来讲都不算问题,可是对于初学者来讲,若是不能完整地知道这些概念和数据流动的方式,学起来就会有些"心虚".前端

因此在接触了expressreact 以后,我强烈地想知道二者是怎么进行数据的交互的.我想要的技术栈是:react-redux-webpack-express .在google和github上找了好久都没有找到合适的,最后才发现,其实官网的那个已是最好的例子Async.react

目前获得的比较好的方式是用异步的方式,经过前端ajax来发出请求,后端接收并处理请求,返回相应的数据(在这里不讲述服务器渲染).在这里的ajax若是引入jq会显得太笨重,因此按照官网的方法用 isomorphic-fetchwebpack

而由于引入了redux,因此要把ajax写在哪里是一个问题. google了一下,发现你们都认为写在action里面最好(官网也是这么作的),因此就直接这么作吧.(跟着官网没错)git

下面就以一个很是很是简单的例子为切入点,功能以下:有一个input和一个button,在input里面输入,点击按钮,把input的内容上传服务器(POST). 同时下面有一个列表,从服务器上获取数据并在react中渲染(GET). 很是很是很是简单.es6

2.GET方法

把ajax所有写在action里面, 异步action须要用到中间件. 有关中间件最好的文章我认为是这一篇, 里面讲了applyMiddleware 的实现原理和例子(其实有点像俄罗斯套娃,把本来的dispatch慢慢增强,好比能够用logger加一点日志辅助找bug) 这里要用到一个叫作thunk的中间件(实现原理很简洁,能够本身找来琢磨)github

下面的代码从服务器中获取列表. 其中的fetch的用法能够看这里, 这里也用到了promise对象用于处理异步事件,这个能够看阮一峰大神的这篇文章.web

export const fetchList = () => {
    return dispatch => {
        dispatch({ type:"REQUEST_LIST" })
        return fetch(`/list`, {
            header: {
                "dataType": "json"
            }
        })
            .then(response => {
                return response.json()
            })
            .then(json => {
                dispatch(receiveList(json.items))
            }
        )
    }
}

3.POST方法

POST方法与GET大同小异,不过在server写代码的时候要用上body-parser, 否则有可能请求会变成undefined,写法是这样的. ajax

具体的代码以下: POST方法相对复杂一点点.express

export const postAddItem = (text) => {
    return dispatch => {
        dispatch({type: "loadAddItem", text})
        fetch('/send', {
            method: 'POST',
            headers: {
                'Content-Type': "application/json",
                'Accept': "application/json",
                'Content-Type': "application/json"
            },
            body: JSON.stringify({ item: text })
        }).then(res => {
            if(res.ok) {
                dispatch({ type: "ADD_ITEM", text })
                console.log("POST SUCCESS");
            } 
        }, e => {
            dispatch({type: "loadAddItem", text})
            alert("POST ERROR");
        })
    }
}

这些代码都是根据官网上Async的代码改的.
因此要真正掌握redux, 官网文档和例子要熟读啊...

4.关于调试

关于调试我没有什么值得分享的(我也在找比较方便的调试方法TAT,跪求推荐!!), 不过一个这几天下来总结了"肉眼debug"的思路就是: 看数据怎么流,从哪里开始变得不符合要求.以前在写的时候就是connect的地方开始有问题,结果死活找不出为何渲染不出来...明明在logger上看到已经获取到了数据...

5.总结

我的感受若是要"打通先后端"(起码理解吧),必定要认真理解redux,基本概念,异步,中间件(整个官网的内容很丰富,要多读..) 不过基础也很重要!最基础的es6,ajax等必定要会...
本身写的粗糙的例子代码在此

(第一次写文章,本人是小白,有什么说得不对的很差的,感谢提出!)

相关文章
相关标签/搜索