• vite(setup语法糖)+ts+vant+axios入门教程


    前言:因为我比较懒,就简单的用我之前的代码演示一下吧,如果有问题可以,进行代码的比对,仔细找找应该问题不大.

    效果图:

    (一个简单的移动端商城页面)

    (所需要的依赖也不是很多)

    欧克,面来说一下流程:

    首先的话,要初始化vite,官方也推荐使用这个,不会安装的话参考官网.(附带:官网截图)

     

    然后,进行配置的选择就行/

     最终,运行

     然后,配置main.ts文件

    1. import { createApp } from 'vue'
    2. import { createPinia } from 'pinia'
    3. import App from './App.vue'
    4. import router from './router'
    5. import axios from 'axios'
    6. // 1. 引入你需要的组件
    7. import vant from 'vant';
    8. // 2. 引入组件样式
    9. import 'vant/lib/index.css';
    10. const app = createApp(App)
    11. axios.defaults.baseURL = 'http://localhost:3000'
    12. app.config.globalProperties.$http = axios
    13. app.use(createPinia())
    14. app.use(router)
    15. app.use(vant)
    16. app.mount('#app')

     如果你想使用全局的axios的话 ,就像我上面那样引入axios,并且,配置全局根路径以及全局属性

    如果你想自己封装的话

    创建一个这样的文件夹和文件

    1. // axios的配置文件 配置好之后 项目中都用这个axios 不再用原生的了
    2. import axios from "axios";
    3. // 创建新的实例 修改他
    4. const http = axios.create({
    5. // 向新的实例中传参 来修改这个实例
    6. baseURL: '/api',
    7. timeout: 1000
    8. });
    9. // 添加请求拦截器 在发请求之前处理一下
    10. http.interceptors.request.use((config: any) => {
    11. // config 就是请求
    12. // token是用来校验当前用户是否登录的 token中包含用户信息以及过期时间等
    13. let info = JSON.parse(localStorage.getItem('userInfo') || '0') || {}; //这里加上0是为了防止ts报错
    14. if (config.url != "/userlogin") { // 有些接口不需要token 比如登录、注册、首页广告等
    15. config.headers.authorization = info.token; // 在请求头添加token
    16. }
    17. return config;
    18. }, (error: any) => {
    19. return Promise.reject(error);
    20. })
    21. // 添加响应拦截器 在得到数据之后处理一下
    22. http.interceptors.response.use((data: any) => {
    23. // console.log(data);
    24. // 返回的数据就是组件接受的数据 所以过滤一下
    25. // 在这里判断,接口是否返回登录过期,如果过期需要调转到登录页(先引入router,再router.push())
    26. return data.data;
    27. }, (error: any) => {
    28. return Promise.reject(error);
    29. })
    30. export default http;

     这样自己就封装了一个axios,我这里简单的用any类型定义了

    引入vant组件库中的tabbar组件  在vue中这样配置

    1. <template>
    2. <router-view></router-view>
    3. <van-tabbar v-model="active" Route>
    4. <van-tabbar-item replace to="/home" name="home" icon="home-o">首页</van-tabbar-item>
    5. <van-tabbar-item replace to="/category" name="category" icon="qr">分类</van-tabbar-item>
    6. <van-tabbar-item replace to="/shopping" name="shopping" icon="shopping-cart-o">购物车</van-tabbar-item>
    7. <van-tabbar-item replace to="/my" name="my" icon="friends-o">我的</van-tabbar-item>
    8. </van-tabbar>
    9. </template>
    10. <script lang="ts" setup>
    11. import { ref } from 'vue';
    12. const active = ref('home');
    13. </script>
    14. <style lang="less" scoped>
    15. .van-tabbar--fixed {
    16. bottom: -3px;
    17. }
    18. </style>

    配置router

    1. import { createRouter, createWebHistory } from 'vue-router';//上面导入使用模块
    2. import type { RouteRecordRaw } from 'vue-router';//这个是导入类型模块
    3. import Tabbar from '@/views/Tabbar.vue'
    4. const Home = () => import('@/components/HomeShow.vue')
    5. const Category = () => import('@/components/CategoryShow.vue')
    6. const Shopping = () => import('@/components/ShoppingShow.vue')
    7. const My = () => import('@/components/MyShow.vue')
    8. const routes: Array<RouteRecordRaw> = [
    9. {
    10. path: '/',
    11. redirect: '/home'
    12. },
    13. {
    14. path: '/',
    15. component: Tabbar,
    16. children: [
    17. {
    18. path: 'home',
    19. component: Home
    20. },
    21. {
    22. path: 'category',
    23. component: Category
    24. },
    25. {
    26. path: 'my',
    27. component: My
    28. },
    29. {
    30. path: 'shopping',
    31. component: Shopping
    32. }
    33. ]
    34. }
    35. ]
    36. const router = createRouter({
    37. history: createWebHistory(),
    38. routes
    39. })
    40. export default router

     配置home首页

    首页中,在setup语法糖环境下,有 上面咱们做的全局axios和自己封装的axios 的用法,

    另外还有,对象,数组的类型声明

    以及 vant 组件的引用

    父子传参

    等这些.

    1. <script lang="ts" setup>
    2. import { ref, reactive, onServerPrefetch, getCurrentInstance, nextTick } from 'vue'
    3. // ref声明响应式数据,用于声明基本数据类型
    4. // reactive声明响应式数据,用于声明引用数据类型
    5. import http from '../utils/request' //导入我们封装的axios 进行获取数据
    6. //导入GoodsItem模块
    7. import GoodsItem from "@/components/GoodsItem.vue"
    8. const images: string[] = reactive([]);//轮播图数据
    9. //第一种数据获取的写法
    10. // onServerPrefetch(async () => {
    11. // const res = await http.get("/catelist");
    12. // // console.log(res);
    13. // let newList = res.list
    14. // newList.forEach((item: any) => {
    15. // images.push(`http://localhost:3000${item.img}`)
    16. // })
    17. // // console.log(images);
    18. // });
    19. //第二种数据获取的写法
    20. const { proxy } = getCurrentInstance() as any
    21. // console.log(images);
    22. proxy.$http({
    23. url: '/api/bannerlist',
    24. method: 'get',
    25. }).then((res: any) => {
    26. // console.log(res.data.list);
    27. let newList: Object[] = res.data.list
    28. newList.forEach((item: any) => {
    29. images.push(`http://localhost:3000${item.img}`)
    30. })
    31. // console.log(images);
    32. })
    33. //以上是 轮播图的渲染业务逻辑
    34. interface workLinkArrType {
    35. title: string
    36. img: string
    37. path?: string
    38. }
    39. const navImg: workLinkArrType[] = reactive([
    40. {
    41. img: 'https://fastly.jsdelivr.net/npm/@vant/assets/apple-1.jpeg',
    42. title: ' 限时抢购',
    43. },
    44. {
    45. img: 'https://fastly.jsdelivr.net/npm/@vant/assets/apple-2.jpeg',
    46. title: ' 积分商城',
    47. },
    48. {
    49. img: 'https://fastly.jsdelivr.net/npm/@vant/assets/apple-3.jpeg',
    50. title: ' 联系我们',
    51. },
    52. {
    53. img: 'https://fastly.jsdelivr.net/npm/@vant/assets/apple-4.jpeg',
    54. title: '商品分类',
    55. }
    56. ])
    57. interface IpropTwo {
    58. id: number,
    59. img: string,
    60. catename: string,
    61. [propName: string]: any
    62. }
    63. interface IpropOne {
    64. children: IpropTwo[],
    65. img: string,
    66. [propName: string]: any //这个 的话 是 如果我们这个对象中 实在有很多东西 我们剩下的也不关心 但是 需要声明 就可以这样写
    67. }
    68. //这个是 子组件 GoodsItem的数据
    69. let PropsList: IpropOne[] = reactive([])
    70. let PropsListTwo: IpropTwo[] = reactive([])
    71. proxy.$http({
    72. url: '/api/catelist?istree=1',
    73. method: 'get',
    74. }).then((res: any) => {
    75. PropsList = res.data.list
    76. PropsList.forEach(item => {
    77. // console.log(item.children);
    78. if (item.children) {
    79. item.children.forEach(item => {
    80. let str = `http://127.0.0.1:3000${item.img}`
    81. // console.log(str);
    82. // console.log(item.img);
    83. item.img = str
    84. // console.log(item);
    85. })
    86. PropsListTwo.push(...(item as IpropOne).children)
    87. }
    88. })
    89. // console.log(PropsListTwo);
    90. // console.log(images);
    91. })
    92. </script>
    93. <template class="HomeContainer">
    94. <div class="topBox">
    95. <van-nav-bar title="首页" fixed>
    96. <template #right>
    97. <van-icon name="search" size="18" />
    98. </template>
    99. </van-nav-bar>
    100. <van-swipe class="my-swipe" :autoplay="3000" indicator-color="#39a9ed">
    101. <van-swipe-item v-for="image in images" :key="image">
    102. <img :src="image" />
    103. </van-swipe-item>
    104. </van-swipe>
    105. </div>
    106. <div class="middleBox">
    107. <div class="navBoxOne">
    108. <div v-for="(item, index) in navImg " :key="index">
    109. <img :src="item.img" alt="">
    110. <span>{{ item.title }} </span>
    111. </div>
    112. </div>
    113. <div class="navBoxTwo">
    114. <span class="active">热门推荐</span>
    115. <span>发现新品</span>
    116. <span>所有商品</span>
    117. </div>
    118. </div>
    119. <!-- 商品购物页面 -->
    120. <div class="lastBox">
    121. <GoodsItem v-for=" item in PropsListTwo " :key="(item as IpropTwo).id" :imgSrc="(item as IpropTwo).img"
    122. :title="(item as IpropTwo).catename" />
    123. </div>
    124. </template>
    125. <style lang="less" scoped>
    126. .topBox {
    127. margin-top: 58px;
    128. }
    129. .my-swipe .van-swipe-item {
    130. color: #fff;
    131. font-size: 20px;
    132. width: 100%;
    133. height: 150px;
    134. line-height: 0;
    135. text-align: center;
    136. background-color: #39a9ed;
    137. img {
    138. width: 100%;
    139. height: 100%;
    140. }
    141. }
    142. .middleBox {
    143. .navBoxOne {
    144. width: 100vw;
    145. height: 100px;
    146. display: flex;
    147. div {
    148. flex: 1;
    149. padding: 10px 10px;
    150. display: flex;
    151. flex-direction: column;
    152. img {
    153. width: 100%;
    154. height: 70%;
    155. flex: 9;
    156. }
    157. span {
    158. flex: 1;
    159. font-size: 16px;
    160. }
    161. }
    162. }
    163. .navBoxTwo {
    164. width: 100%;
    165. height: 50px;
    166. display: flex;
    167. align-items: center;
    168. justify-content: center;
    169. .active {
    170. background-color: red !important;
    171. color: #fff !important;
    172. }
    173. span {
    174. width: 30%;
    175. height: 60%;
    176. text-align: center;
    177. line-height: 30px;
    178. border: 1px solid red;
    179. }
    180. .navBoxTwo:nth-child(2),
    181. .navBoxTwo:nth-child(3) {
    182. border-left: 0 !important;
    183. }
    184. }
    185. }
    186. .lastBox {
    187. margin-bottom: 52px;
    188. }
    189. </style>

    上面home页面的子组件

    1. <script lang="ts" setup>
    2. defineProps({
    3. imgSrc: {
    4. type: String,
    5. required: true
    6. },
    7. title: {
    8. type: String,
    9. required: true
    10. }
    11. })
    12. </script>
    13. <template class="GoodsItemBox">
    14. <van-card price="3999.00" desc="描述信息" v-bind:title="title" v-bind:thumb="imgSrc" style="{backgroundColor:#fff}">
    15. <template #footer>
    16. <van-button size="small" color="green" type="primary" icon="cart-o"></van-button>
    17. </template>
    18. </van-card>
    19. </template>
    20. <style>
    21. </style>

    基本上,看完上面的就入门了vite(setup语法糖)+ts+vant+axios

    时间内有限,先这样写吧.

     

  • 相关阅读:
    温泉镇旅游微信小程序的设计与实现(论文+源码)_kaic
    3D视觉 之 线激光3D相机
    CUDA C编程权威指南:1-基于CUDA的异构并行计算
    浅谈UI自动化测试
    Node+koa之目录优化和sequelize的使用(五)
    Linux·驱动中的异步
    使用Python的turtle模块绘制花形图案(含详细Python代码与注释)
    通付盾Web3专题 | SharkTeam:2023年加密货币犯罪分析报告
    基于html5的网上书店系统
    Eliminate the Conflict(2-sat)
  • 原文地址:https://blog.csdn.net/VVVVV16/article/details/127712203