关于axios和fetch,axios和fetch的区别这个很多人还不知道,今天小乐来为大家解答以上的问题,现在让我们一起来看看吧!

axios和fetch axios和fetch的区别axios和fetch axios和fetch的区别


axios和fetch axios和fetch的区别


1、取消请求这次给大家带来怎样使用React 端渲染,使用React 端渲染的注意事项有哪些,下面就是实战案例,一起来看一下。

2、React 提供了两个方法 renderToString 和 renderToStaticMarkup 用来将组件(Virtual DOM)输出成 HTML 字符串,这是 React 端渲染的基础,它移除了端对于浏览器环境的依赖,所以让端渲染变成了一件有吸引力的事情。

3、端渲染除了要解决对浏览器环境的依赖,还要解决两个问题:前后端可以共享代码前后端路由可以统一处理React 生态提供了很多选择方案,这里我们选用 Redux 和 react-router 来做说明。

4、ReduxRedux 提供了一套类似 Flux 的单向数据流,整个应用只维护一个 Store,以及面向函数式的特性让它对端渲染支持很友好。

5、2 分钟了解 Redux 是如何运作的关于 Store:整个应用只有一个的 StoreStore 对应的状态树(State),由调用一个 reducer 函数(root reducer)生成状态树上的每个字段都可以进一步由不同的 reducer 函数生成Store 包含了几个方法比如 dispatch, getState 来处理数据流Store 的状态树只能由 dispatch(action) 来触发更改Redux 的数据流:action 是一个包含 { type, payload } 的对象reducer 函数通过 store.dispatch(action) 触发reducer 函数接受 (state, action) 两个参数,返回一个新的 statereducer 函数判断 action.type 然后处理对应的 action.payload 数据来更新状态树所以对于整个应用来说,一个 Store 就对应一个 UI 快照,端渲染就简化成了在端初始化 Store,将 Store 传入应用的根组件,针对根组件调用 renderToString 就将整个应用输出成包含了初始化数据的 HTML。

6、react-routerreact-router 通过一种声明式的方式匹配不同路由决定在页面上展示不同的组件,并且通过 props 将路由信息传递给组件使用,所以只要路由变更,props 就会变化,触发组件 re-render。

7、设有一个很简单的应用,只有两个页面,一个列表页 /list 和一个详情页 //:id,点击列表上的条目进入详情页。

8、可以这样定义路由,./routes.jsimport React from 'react';import { Route } from 'react-router';import { List, Item } from './components';// 规则匹配到的组件作为 `props.children` 传入const Container = (props) => {return ({props.children});};// route 规则:// - `/list` 显示 `List` 组件// - `//:id` 显示 `Item` 组件const routes = ();export default routes;从这里开始,我们通过这个非常简单的应用来解释实现端渲染前后端涉及的一些细节问题。

9、ReducerStore 是由 reducer 产生的,所以 reducer 实际上反映了 Store 的状态树结构./reducers/index.jsimport listReducer from './list';export default function rootReducer(state = {}, action) {return {list: listReducer(state.list, action),: Reducer(state., action)};}rootReducer 的 state 参数就是整个 Store 的状态树,状态树下的每个字段对应也可以有自己的reducer,所以这里引入了 listReducer 和 Reducer,可以看到这两个 reducer的 state 参数就只是整个状态树上对应的 list 和 字段。

10、具体到 ./reducers/list.jsconst initialState = [];export default function listReducer(state = initialState, action) {switch(action.type) {case 'FETCH_LIST_SUCCESS': return [...action.payload];default: return state;}}list 就是一个包含 s 的简单数组,可能类似这种结构:[{ id: 0, name: 'first '}, {id: 1, name: 'second '}],从 'FETCH_LIST_SUCCESS' 的 action.payload 获得。

11、const initialState = {};export default function listReducer(state = initialState, action) {switch(action.type) {case 'FETCH_ITEM_SUCCESS': return [...action.payload];default: return state;}}Action./actions/index.jsimport fetch from 'isomorphic-fetch';export function fetchList() {return (dispatch) => {return fetch('/api/list').then(res => res.json()).then(json => dispatch({ type: 'FETCH_LIST_SUCCESS', payload: json }));}}export function fetchItem(id) {return (dispatch) => {if (!id) return Promise.resolve();return fetch(`/api//${id}`).then(res => res.json()).then(json => dispatch({ type: 'FETCH_ITEM_SUCCESS', payload: json }));另外因为涉及到异步请求,这里的 action 用到了 tk,也就是函数,redux 通过 tk-middleware 来处理这类 action,把函数当作普通的 action dispatch 就好了,比如 dispatch(fetchList())Store我们用一个的 ./store.js,配置(比如 Apply Middleware)生成 Storeimport { createStore } from 'redux';import rootReducer from './reducers';// Apply middleware here// ...export default function configureStore(initialState) {const store = createStore(rootReducer, initialState);return store;}react-redux接下来实现 components: {, 组件,然后把 redux 和 react 组件关联起来,具体细节参见 react-redux./app.jsimport React from 'react';import { render } from 'react-dom';import { Router } from 'react-router';import createBrowserHistory from 'history/lib/createBrowserHistory';import routes from './routes';import configureStore from './store';// `INITIAL_STATE` 来自端渲染,下一部分细说const initialState = window.INITIAL_STATE;const store = configureStore(initialState);const Root = (props) => {return ({routes});}render(, document.getElementById('root'));至此,客户端部分结束。

12、 Rendering接下来的端就比较简单了,获取数据可以调用 action,routes 在端的处理参考 react-router server rendering,在端用一个 match 方法将拿到的 request 匹配到我们之前定义的 routes,解析成和客户端一致的 props 对象传递给组件。

13、./server.jsimport express from 'express';import React from 'react';import { renderToString } from 'react-dom/server';import { RoutingContext, match } from 'react-router';import routes from './routes';import configureStore from './store';const app = express();function renderFullPage(html, initialState) {return `${html}window.INITIAL_STATE = ${JSON.stringify(initialState)};`;}app.use((req, res) => {match({ routes, location: req. }, (err, redirectLocation, renderProps) => {res.status(500).end(`Internal Error ${err}`);} else if (redirectLocation) {res.redirect(redirectLocation.pathname + redirectLocation.search);} else if (renderProps) {const store = configureStore();const state = store.getState();Promise.all([store.dispatch(fetchList()),store.dispatch(fetchItem(renderProps.params.id))])const html = renderToString();res.end(renderFullPage(html, store.getState()));});} else {res.status(404).end('Not found');}});});端渲染部分可以直接通过共用客户端 store.dispatch(action) 来统一获取 Store 数据。

14、另外注意 renderFullPage 生成的页面 HTML 在 React 组件 mount 的部分(),前后端的 HTML 结构应该是一致的。

15、然后要把 store 的状态树写入一个全局变量(INITIAL_STATE),这样客户端初始化 render 的时候能够校验生成的 HTML 结构,并且同步到初始化状态,然后整个页面被客户端接管。

16、关于页面内链接跳转如何处理?react-router 提供了一个 组件用来替代 标签,它负责管理浏览器 history,从而不是每次点击链接都去请求,然后可以通过绑定 onClick 来作其他处理。

17、比如在 /list 页面,对于每一个 都会用 绑定一个 route ://:id,并且绑定 onClick 去触发 dispatch(fetchItem(id)) 获取数据,显示详情页内容。

18、相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!阅读:怎样使用JS实现计算圆周率到小数点后100位怎样使用vue axios 给生产与发布环境配置接口地址。

本文到这结束,希望上面文章对大家有所帮助。