使用Vite创建React + TypeScript(pro和mobile,含完整的空项目结构资源可供下载)

news/2024/6/1 20:40:12 标签: react.js, typescript

PC端

安装指令:
npm create vite@latest react-ts-pro -- --template react-ts



Vite是一个框架无关的前端工具链,可以快速的生成一个React + TS的开发环境,并且可以提供快速的开发体验

说明:
1. npm create vite@latest固定写法(使用最新版本vite初始化项目)
2. react-ts-pro  项目名称(自定义)
3. -- --template react-ts   指定项目模板为react+ts



移动端(mobile)

1. 安装:
npm create vite@latest react-jike-mobile -- --template react-ts

2. 安装Ant Design Mobile
npm i --save antd-mobile

初始化路由(react-router-dom, 使用与我另一篇文章一模一样直接参考即可,ReactRouter使用详解(react-router-dom))

1. 安装
npm i react-router-dom




配置路径别名@(使用CRA可参考:cra(create-react-app)配置别名路径@ 以及Vscode联想路径配置)

1. 安装插件:
npm i @types/node -D


2. 修改vite.config.ts

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// 配置别名路径,安装插件后才有path
import path from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
    
  // 配置别名路径
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src')
    }
  }
})


3. 修改tsconfig.json

{
  "compilerOptions": {
    // vscode联想配置
    "baseUrl": "./",
    "paths": {
      "@/*": [
          "src/*"
      ]
    }
  }
}



安装插件axios

npm i axios

http.ts封装代码如下:

// 封装axios

import axios from 'axios';

const httpInstance = axios.create({
    baseURL: 'http://geek.itheima.net',
    timeout: 5000
});


// 拦截器
httpInstance.interceptors.request.use(
    config => {
        return config
    },
    error => {
        return Promise.reject(error)
    }
)


httpInstance.interceptors.response.use(
    response => {
        return response
    },
    error => {
        return Promise.reject(error)
    }
)

export default httpInstance;


封装API模块-axios和ts的配合使用

场景:axios提供了request泛型方法,方便我们传入类型参数推导出接口返回值的类型
说明:泛型参数Type的类型决定了res.data的类型


具体演示代码如下:

import { http } from '@/utils';

// 假设后端返回的类型结构是这个
// {
//     data: {
//         channels: [
//             {
//                 id: 1,
//                 name: ''
//             }
//         ]
//     },
//     nessage: ""
// }

/**
 * channel列表查询
 */

// 1. 定义通用泛型(根据后端接口返回的数据来定义)
// data不是写死的,因此用通用的T(T代表泛型)
export type ResType<T> = {
    message: string
    data: T
}



// 2. 子项,定义具体特有的接口类型
type ChannelItem = {
    id: number
    name: string
}

// 整体类型:ChannelRes是data特有的类型
type ChannelRes = {
    channels: ChannelItem[]
}

// 请求频道列表
export function fetchChannelAPI() {
    http.request<ResType<ChannelRes>>({
        url: '/channels'
    })
}

/**
 * 文章列表查询
 */

type ListItem = {
    is_top: string,
    cover: {
        type: number
        image: string[]
    }
}

type ListRes = {
    results: ListItem[]
    pre_timestamp: string
}

// 传参类型
type ReqParams = {
    channel_id: string
    timestamp: string
}

export function fetchListAPI(params: ReqParams) {
    return http.request<ResType<ListRes>>({
        url: '/articles',
        params
    })
}





组件内使用代码如下:

方案一:
fetchChannelAPI().then(res => {
  console.log(res.data)
})

方案二(建议写法):
useEffect(() => {
    const getLists = async () => {
        try {
            const res = await fetchListAPI();
            setLists(res.data);
        } catch (error) {
            throw new Error('fetch channel error')
        }
    }

    getLists();
}, [])


ts基础数据渲染写法

import { useEffect, useState } from 'react';
import { fetchChannelAPI, ChannelItem } from '@/apis/user';

type ChannelItem = {
    id: number
    name: string
}

function Home() {
  const [channels, setChannels] = useState<ChannelItem[]>([]);

  useEffect(() => {
    // const getChannels = async() => {
    //   try {
    //     const res = await fetchChannelAPI();
    //     setChannels(res.data);
    //   } catch (error) {
    //     throw new Error('fetch channel error')
    //   }
    // }

    // getChannels();
  }, [])

  return (
    <div>
      Home
    </div>
  )
}

export default Home;


ts基础数据渲染写法(自定义hook优化)

1. index.tsx代码如下:

import { useTabs } from './useTabs';

function Home() {
  const {channels} = useTabs();

  return (
    <div>
      Home
      <ul>
        {channels.map(item => <li key={item.id}>{item.name}</li>)}
      </ul>
    </div>
  )
}

export default Home;


// 抽离出业务部分封装成useTab
2. useTabs.tsx代码如下:

import { useEffect, useState } from 'react';
import { fetchChannelAPI, ChannelItem } from '@/apis/user';

function useTabs() {
    const [channels, setChannels] = useState<ChannelItem[]>([]);

    useEffect(() => {
        const getChannels = async () => {
            try {
                const res = await fetchChannelAPI();
                setChannels(res.data);
            } catch (error) {
                throw new Error('fetch channel error')
            }
        }

        getChannels();
    }, [])

    return {
        channels
    }
}

export { useTabs };


详情模块 - 路由跳转

1. Home组件代码如下:

// import { useTabs } from './useTabs';

import { useNavigate } from "react-router-dom";

function Home() {
  // const {channels} = useTabs();

  const navigate = useNavigate();
  const goDetail = () => {
    navigate('/detail?id=159')
  }

  return (
    <div>
      Home
      {/* <ul>
        {channels.map(item => <li key={item.id}>{item.name}</li>)}
      </ul> */}
      <hr />
      <button onClick={goDetail}>Detail</button>
    </div>
  )
}

export default Home;



2. Detail组件代码如下:

import { useEffect } from "react";
import { useSearchParams } from "react-router-dom";

function Detail() {
  const [params] = useSearchParams();

  useEffect(() => {
    const id = params.get('id');
    console.log(id);
  }, [])
  return (
    <div>
      Detail
    </div>
  )
}

export default Detail;



http://www.niftyadmin.cn/n/5290099.html

相关文章

【力扣题解】P404-左叶子之和-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P404-左叶子之和-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x1f30f;总结…

Windows/Linux环境登入mysql、mysqldump命令等多方式解决方案之简易记录

Windows/Linux环境登入mysql、mysqldump命令等多方式解决方案之简易记录 之前发布过Window方式,这次结合以上主题,完善下Linux相关登入方式过程,纯属做个记录,有需要的朋友可以做个学习参考。 一、Windows环境提示“‘mysql’ 不是内部或外部命令,也不是可运行的程序或批…

matlab列优先与高维矩阵重构

由于matlab在列化a(:)以及reshape(a)等操作中是列优先的&#xff0c;所以要重构出新的高维度矩阵&#xff0c;通常要把reshape和permute结合起来使用。 先到 http://caffe.berkeleyvision.org/ 下载 训练好的model bvlc_reference_caffenet.caffemodel; 更多caffe使用也请参看…

[C/C++]排序算法 快速排序 (递归与非递归)

目录 &#x1f6a9;概念: &#x1f6a9;实现: ⚡1.hoare ⚡2.挖坑法 ⚡3.双指针法 &#x1f6a9;快速排序递归实现 &#x1f6a9;快速排序非递归实现 &#x1f6a9;概念: 通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据比另一部分的所有…

提升数据库性能的关键所在!Mysql执行计划解析

目录 ​编辑 简介 使用 执行计划信息 id select_type table partitions type possible_keys key key_len ref rows filtered Extra 简介 在MySQL中&#xff0c;执行计划是指数据库系统根据查询语句和相关数据表的统计信息&#xff0c;预先计算出最优的执行方式…

仓储革新:AR技术引领物流进入智慧时代

根据《2022年中国物流行业研究&#xff1a;深度探析行业现状&#xff08;智能设备及智能软件&#xff09;》&#xff0c;报告中提及&#xff1a;“中国社会物流总额依然保持着较为良好的增长态势&#xff0c;年增速已恢复至常年平均水平。2021年社会物流总额细分中工业物流总额…

Leetcode—2660.保龄球游戏的获胜者【简单】

2023每日刷题&#xff08;七十二&#xff09; Leetcode—2660.保龄球游戏的获胜者 实现代码 class Solution { public:int isWinner(vector<int>& player1, vector<int>& player2) {long long sum1 0, sum2 0;int n player1.size();for(int i 0; i &…

企业私有云容器化架构运维实战

什么是虚拟化: 虚拟化&#xff08;Virtualization&#xff09;技术最早出现在 20 世纪 60 年代的 IBM 大型机系统&#xff0c;在70年代的 System 370 系列中逐渐流行起来&#xff0c;这些机器通过一种叫虚拟机监控器&#xff08;Virtual Machine Monitor&#xff0c;VMM&#x…