基于react-router-dom和TypeScript搭建本地mock项目
发布于 4 年前 作者 tanwei 2462 次浏览 来自 分享

创建项目

首先使用create-react-app脚手架,并指定参数typescript,创建一个基于TypeScript项目

$ npx create-react-app myproject --typescript


注:使用npx可以避免程序安装,npx会将脚手架下载至一个临时目录,使用完毕会进行删除,这样可以保证每次使用的脚手架都是最新的

创建页面

在 src文件夹下创建一个pages目录,在pages下创建两个页面pageA和pageB

import React from 'react'

class PageA extends React.Component{
    render(){
        return(
            
PageA
) } } export default PageA


import React from 'react'

class PageB extends React.Component{
    render(){
        return(
            
PageB
) } } export default PageB

使用路由

先安装react-router-dom [@types](/user/types)/react-router-dom

npm install  react-router-dom [@types](/user/types)/react-router-dom


在src下的App.tsx中从react-router-dom中引入BrowserRouter和Route,并引入页面,再配置对应路由与对应页面组件

import React from 'react'
import {BrowserRouter,Route} from 'react-router-dom'
import PageA from './pages/pageA'
import PageB from './pages/pageB'
const Root=()=>{
    
    return <BrowserRouter>
        <Route path='/' component={PageA} exact>Route>

<Route path=’/pageA’ component={PageA} >Route> <Route path=’/pageB’ component={PageB} >Route> BrowserRouter> }

export default Root

在页面从react-router-dom中引入Link就可以实现路由跳转

import React from 'react'
import {Link} from 'react-router-dom'
class PageA extends React.Component{
    render(){
        return(
            <div>
                <div>PageAdiv>

<Link to=’/pageB’ >跳转pageBLink> div> ) } }

export default PageA


import React from 'react'
import {Link} from 'react-router-dom'

class PageB extends React.Component{
    render(){
        return(
            <div>
                <div>pageBdiv>

<Link to=’/pageA’ >跳转pageALink> div> ) } }

export default PageB


此时运行npm start启动项目,就可以访问对应路由的页面并实现页面间的跳转

接口定义

在src下新建一个interface文件夹,用于管理所有接口定义,在interface文件夹中创建对应接口文件,在这里定一个后端接口请求的入参和返回数据出参数据类型,后续相关数据会根据这个定义来进行约束

export interface userInfoRequest{ //请求入参
    name:string | undefined,
    id:number | undefined
}
interface userInfo{ 
    id:number,
    key:number,
    name:string,
    sexy:string,
    adderss:string,
    level:string
}
export type userInfoResponse=userInfo[] | undefined  //请求返回


搭建mock环境

在src同级目录下新建文件夹mock,在mock文件夹中新建目录user,在user目录下新建json文件,将mock数据写入

安装http-server,在package.json中配置运行脚本mock

在终端运行npm run mock就能运行mock服务

请求数据

安装axios,并在src下创建一个constan,用于存放常量,在constant目录下新建urls.ts文件,将接口路径配置进去

//urls.ts
export const GET_USERINFO_URL='/api/user/getUserInfo'

在页面中使用axios请求接口,此时会出现接口404,因为此时我们访问的本地端口是3000,而mock服务是http://localhost:4001,所以需要将接口请求代理到http://localhost:4001,使用npm安装http-proxy-middleware,在src下新建setupProxy.js,将接口请求代理到http://localhost:4001

//setupProxy.js
const proxy= require('http-proxy-middleware').createProxyMiddleware;

module.exports=function(app){
    app.use(proxy('/api/**',{
        target:'http://localhost:4001',
        pathRewrite(path){
            return path.replace('/api','/')+'.json'
        }
    }))
}

重新启动项目,接口请求正常

页面数据展示

安装antd UI库,使用antd库中的Table组件展示接口请求返回的mock数据

而此刻编译器报错,因为组件的state中没有定义userList这个字段,于是使用ts中的接口对state进行定义

import React from 'react'
import {Link} from 'react-router-dom'
import {Table} from 'antd'
import axios from 'axios'
import {GET_USERINFO_URL} from '../../constant/urls'
import {userColumns} from './columns'
import {userInfoResponse} from '../../interface/user'
interface State{ //定义一个State接口
    userList:userInfoResponse
}
class PageA extends React.Component<State>{
    state:State={ //使用State接口约束state
        userList:[]
    }
    componentWillMount(){

        axios.get(GET_USERINFO_URL).then((res)=>{
            this.setState({
                userList:res.data.data
            })
        })
    }
    render(){
        return(
            <div>
                <div>PageAdiv>

<Link to=’/pageB’ >跳转pageBLink> <Table columns={userColumns} dataSource={this.state.userList} className=‘table’>Table> div> ) } }

export default PageA

于是页面就能正常显示数据了~

1 回复

My dear dalao please daidaiwo

回到顶部