react16+项目练习
用到了react17,跟ts,功能不难,主要采取了hooks来写,对一些常用操作进行了封装,基础逻辑都不难,重点都在初始化,一些请求东西的封装。
1.封装错误处理组件。
getDerivedStateFromError:state中标记这个错误,如果子组件渲染报错,父组件中会触发getDerivedStateFromError,并通过返回对象修改错误标记,最后父组件根据这个错误标记,决定渲染哪个页面
<ErrorBoundary fallbackRender={FullPageErrorFallback}>
{/* <ProjectListScreen/> */}
{ user? <Auth/> :<Unauth/>}
</ErrorBoundary>
import React, { ReactNode } from 'react'
type FallbackRender = (props: {error: Error| null}) => React.ReactElement
export class ErrorBoundary extends React.Component<{children: ReactNode,fallbackRender: FallbackRender},{error: Error|null}>{
state = {
error: null
}
static getDerivedStateFromError(error: Error){
return {error}
}
render(){
const {error} = this.state
const {fallbackRender, children} = this.props
if(error){
return fallbackRender({error})
}
return children
}
}
2.封装http请求,主要是加上一些验证信息,响应处理,错误处理。
import qs from "qs";
import * as auth from "auth-provider";
import { useAuth } from "context/auth-context";
const apiUrl = process.env.REACT_APP_API_URL;
interface Config extends RequestInit {
token?: string;
data?: object;
}
export const http = async (
endpoint: string,
{ data, token, headers, ...customConfig }: Config = {}
) => {
const config = {
method: "GET",
headers: {
Authorization: token ? `Bearer ${token}` : "",
"Content-Type": data ? "application/json" : "",
},
...customConfig,
};
if (config.method.toUpperCase() === "GET") {
endpoint += `?${qs.stringify(data)}`;
} else {
config.body = JSON.stringify(data || {});
}
return window
.fetch(`${apiUrl}/${endpoint}`, config)
.then(async (response) => {
if (response.status === 401) {
await auth.logout();
window.location.reload();
return Promise.reject({ message: "请重新登陆" });
}
const data = await response.json();
if (response.ok) {
return data;
} else {
return Promise.reject(data);
}
});
};
export const useHttp = () => {
const { user } = useAuth();
return (...[endpoint, config]: Parameters<typeof http>) =>
http(endpoint, { ...config, token: user?.token });
};
3.

浙公网安备 33010602011771号