在 react 中怎么配合 ts 发请求呢?

827 阅读2分钟

在 react 中怎么配合 ts 发请求呢?

一般react 发thunk 请求的步骤流程是这样的: 为了方便理解我还画了一张图,就是有一丢丢的抽象.... 在这里插入图片描述 下面是具体的代码 首先在组件中通过 dispatch 来触发 异步的 actions 代码

dispatch (xxxaction())

然后就走到了action的具体模块里面

一般会先在store/index.ts文件里面定义数据类型

// 这里定义的是获取 reducer 里面的全部的数据
type RootState = ReturnType<typeof store.getState>
// 这里定义的是同步的
// 假如这是 xx 模块
export type xxxAction =
 {type: 'xxx/GET_LIST'. payload:string} |
 {type: 'xxx/CHANGE_LIST'. payload:string}
//这里是 yy 模块
export type yyyAction = 
{type: 'yyy/ADD_LIST'. payload:string} | 
{type: 'yyy/DEL_LIST'. payload:string}

// 然后把 各个模块合到一起
type rootActionType =  xxxAction | yyyAction 
// 这里划分了模块,是因为如果后面类型多了,都挤在一个里面,会很不方便,
//所以分模块划分,也是为了后续更好的查找数据

// 这里是异步的
// 这边的 ThunkAction 一共有 四个参数
// 类型参数1:ReturnType 用于指定函数的返回值类型 void
// 类型参数2: 指定RootState的类型
// 类型参数3: 指定额外的参数类型,一般为unkonwn或者any
// 类型参数4: 用于指定dispatch的Action类型
export type RootThunkAction = ThunkAction<void,RootState,unknown, rootActionType >

这里分发不发请求两种情况:

如果不发的话,如下

// 导入同步的 action 类型
import {xxxAction } from '../store.index'
import {Dispatch} from 'react'
export default xxxaction():xxxAction {
	//这边要指定dispatch 的类型,这样下面的type就会有提示
	return (dispatch:Diapatch<xxxAction>) =>{
		dispatch({
		type:'字面量类型',
		payload:数据
		})
	}
}

如果发请求的话,则是这样:

// 导入异步的 action 类型
import {RootThunkAction } from '../store.index'
import {Dispatch} from 'react'
export default xxxaction():RootThunkAction  {
	return (dispatch:Diapatch<RootThunkAction >) =>{
		// 这里先发异步请求
		const res = await axios.get('url')
		// 然后再触发 dispatch 到 reducer
		dispatch({
		type:string,
		payload:res.data
		})
	}
}

接下来就到了 reducer 里面 首先定义初始的数据类型

// 导入最开始在 store 里面定义的类型
import {xxxAction } from '../store.index'
// 定义初始值的数据类型
export type init = {id: number, name: string}
// 绑定到初始值数据上
const initstate:init = {}[] 
// s设置 state 的默认值
export default function xxx = (state= initstate, payload:xxxAction):initstate{
	 // 接下来就是判断数据类型了
	 if(action.type === 'xxx/GET_LIST') {
	 return xxx数据
	}
	// return 默认值
	return state
}

这些操作都做完之后,就可以在组件获取 reducer 的数据,来更新视图了

// 这里导入全部的类型
import {rootActionType } from '../store'
// 这里的 state 要定义数据类型,不然 下面reuren 数据是点(.)不出来的
const List = useSelcetor((state:rootActionType )=>{
// 接下来就可以愉快的用点(.)来找模块了
	return state.xxxaction
})
然后就可以通过 map 来循环创建页面数据啦!

今天的知识点就到这里,我们下期再见!