当前位置:   article > 正文

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

vite setup

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

效果图:

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

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

欧克,面来说一下流程:

首先的话,要初始化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

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/227605
推荐阅读
相关标签
  

闽ICP备14008679号