热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ReactHooks完成异步要求实例—useReducer、useContext和useEffect替代Redux计划

本文是进修了2018年新鲜出炉的ReactHooks提案以后,针对异步要求数据写的一个案例。注重,本文假设了:1.你已开端相识hooks的寄义了,假如不相识还请移步官方文档。(实在

本文是进修了2018年新鲜出炉的React Hooks提案以后,针对
异步要求数据写的一个案例。注重,本文假设了:

1.你已开端相识
hooks的寄义了,假如不相识还请移步
官方文档。(实在有过翻译的主意,不过印记中文一直在翻译,就是比较慢啦)

2.你运用
Redux完成过异步
Action(非必须,只是本文不触及该部份学问而直接运用)

3.你听说过
axios或许
fetch(假如没有,那末设想一下原生js的
promise完成异步要求,或许去进修下这俩库)

悉数代码拜见堆栈:
github | Marckon挑选
hooks-onlineShop分支以及
master分支检察

❗ 本文并不是最好实践,若有更好的要领或发明文中马虎,迎接斧正!

前序计划(不想看可以直接跳过)
  • 不斟酌引入Redux

经由过程进修React生命周期,我们晓得合适举行异步要求的处所是componentDidMount钩子函数内。因而,当你不须要斟酌状况治理时,以往的要领很简单:

class App extends React.Component{
componentDidMount(){
axios.get('/your/api')
.then(res=>/*...*/)
}
}

  • 引入Redux举行状况治理

当你决议运用Redux举行状况治理时,比方将异步猎取到的数据储存在store中,事变就最先庞杂起来了。依据Redux的官方文档案例来看,为了完成异步action,你还得须要一个类似于redux-thunk的第三方库来剖析你的异步action

requestAction.js: 定义异步要求action的处所

//这是一个异步action,分发了两个同步action,redux-thunk可以明白它
const fetchGoodsList = url => dispatch => {
dispatch(requestGoodsList());
axios.get(url)
.then(res=>{
dispatch(receiveGoodsList(res.data))
})
};

requestReducer.js: 处置惩罚同步action

const requestReducer=(state=initialState,action)=>{
switch (action.type) {
case REQUEST_GOODSLIST:
return Object.assign({},state,{
isFetching: true
});
case RECEIVE_GOODSLIST:
return Object.assign({},state,{
isFetching:false,
goodsList:action.goodsList
});
default:
return state;
}
};

App Component :你引入redux store和redux-thunk中间件的处所

import {Provider} from 'react-redux';
import thunkMiddleWare from 'redux-thunk';
import {createStore,applyMiddleware} from 'redux';
//other imports
let store=createStore(
rootReducer,
//这里要运用中间件,才可以完成异步要求
applyMiddleware(
thunkMiddleWare,
myMiddleWare,
)
);
class App extends React.Component{
render(){
return (



)
}
}

GoodsList Component :须要举行异步要求的组件

class GoodsList extends React.Component{
//...
componentDidMount(){
this.props.fetchGoodsList('your/url');
}
//...
}
const mapDispatchToProps={
fetchGoodsList
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(GoodsList);

完全代码:branch:master-onlineShop

运用Hooks–useReducer()useContext()

总之运用Redux很累,固然,你可以不运用Redux,直接经由过程props层层通报,或许运用context都可以。只不过本文我们学过了useReducer,运用到了Redux的头脑,总要试着用一下。

这里你不须要引入别的任何第三方库了,简简单单地运用React@16.7.0-alpha.2版本就好啦

很主要的一点就是——函数式组件,如今React引荐我们这么做,可以基本上替代class写法。

函数署名

  1. useReducer(reducer,initialState)
  2. useContext(ctxObj)
  3. useEffect(effectFunction,[dependencyValues])

概览-你须要编写什么

  1. action.js:

    • 我们还运用redux的头脑,编写action
  2. reducer.js:

    • 处置惩罚action,不同于reduxreducer,这里我们可以不必供应初始状况
  3. 根组件:

    • Provider供应给子组件context
    • useReducer定义的位置,引入一个reducer而且供应初始状况initialState
  4. 子组件:

    • useContext定义的位置,猎取先人组件供应的context
    • useEffect用于举行异步要求

完成

1.action.js:我们运用action建立函数

const REQUEST_GOODSLIST = "REQUEST_GOODSLIST";
const RECEIVE_GOODSLIST = "RECEIVE_GOODSLIST";
//最先要求
const requestGoodsList = () => ({
type: REQUEST_GOODSLIST
});
//接收到数据
const receiveGoodsList = json => ({
type: RECEIVE_GOODSLIST,
goodsList: json.goodsList,
receivedAt: Date.now()
});
export {
RECEIVE_GOODSLIST,
REQUEST_GOODSLIST,
receiveGoodsList,
requestGoodsList,
}

2.reducer.js:推断action的范例并举行响应处置惩罚,更新state

import {
RECEIVE_GOODSLIST,
REQUEST_GOODSLIST,
} from "../..";
export const fetchReducer=(state,action)=>{
switch (action.type) {
case REQUEST_GOODSLIST:
return Object.assign({},state,{
isFetching: true
});
case RECEIVE_GOODSLIST:
return Object.assign({},state,{
isFetching:false,
goodsList:state.goodsList.concat(action.goodsList)
});
default:
return state;
}
};

3.根组件:引入reducer.js

import React,{useReducer} from 'react';
import {fetchReducer} from '..';
//建立并export上下文
export const FetchesCOntext= React.createContext(null);
function RootComponent() {
//第二个参数为state的初始状况
const [fetchesState, fetchDispatch] = useReducer(fetchReducer, {
isFetching: false,
goodsList: []
});
return (
//将dispatch要领和状况都作为context通报给子组件

//...
//用到context的一个子组件


)
}

4.子组件:引入FetchesContext

import {FetchesContext} from "../RootComponent";
import React, {useContext, useEffect,useState} from 'react';
import axios from 'axios';
function GoodsList() {
//猎取上下文
const ctx = useContext(FetchesContext); //一个推断是不是从新猎取的state变量
const [reFetch,setReFetch]=useState(false);
//具有异步挪用副作用的useEffect
useEffect(() => {
//起首分发一个最先异步猎取数据的action
ctx.dispatch(requestGoodsList());
axios.get(proxyGoodsListAPI())
.then(res=>{
//猎取到数据后分发一个action,关照reducer更新状况
ctx.dispatch(receiveGoodsList(res.data))
})
//第二个参数reFetch指的是只有当reFetch变量值转变才从新衬着
},[reFetch]);
return (


{
//children
}

)
}

完全代码拜见:branch:hooks-onlineShop

目次构造

我的目次构造也许如许:

src
|- actions
|- fetchAction.js
|- components
|-...
|- reducers
|- fetchReducer.js
|- index.js

注重点

  1. 运用useContext()时刻我们不须要运用Consumer了。但不要遗忘exportimport上下文对象
  2. useEffect()可以看作是class写法的componentDidMountcomponentDidUpdate以及componentWillUnMount三个钩子函数的组合。

    • 当返回了一个函数的时刻,这个函数就在compnentWillUnMount生命周期挪用
    • 默许地,传给useEffect的第一个参数会在每次(包括第一次)数据更新时从新挪用
    • 当给useEffect()传入了第二个参数(数组范例)的时刻,effect函数会在第一次衬着时挪用,其他仅当数组中的任一元素发作转变时才会挪用。这相当于我们掌握了组件的update生命周期
    • useEffect()第二个数组为空则意味着仅在componentDidMount周期实行一次
  3. 代码堆栈里运用了Mock.js阻拦api要求以及ant-design第三UI方库。现在代码比较大略。

推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
author-avatar
大笨猫的男人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有