使用vue3 + TS + Pinia + Vant4 + vite搭建商城H5项目框架

这篇具有很好参考价值的文章主要介绍了使用vue3 + TS + Pinia + Vant4 + vite搭建商城H5项目框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要将如何利用搭建一个初始化的商城H5项目框架。初始化阶段使用的技术栈有:vue3.2、vue-router、 TS 、 Pinia 、 Vant4、Less、vite

1. 环境检测:

                        node -v 检测是否有安装node.js,未安装请先去官网安装node.js

2. 创建初始化项目: 

        终端输入: npm init vite

        自定义项目名称project name:demodemo

        依次选择Vue + TypeScript创建项目

       启动项目:   cd demodemo

                                npm install

                                npm run dev

3. 初始化项目文件

删除style.css文件,清空assets文件和components文件

新增request文件(配置网络请求和集中存储请求API),文件下新建index.ts和api.ts两个空文件 

新增store文件(数据共享仓库),文件下新建index.ts和order.ts和address.ts三个空文件 

新增views文件(集中存放各页面),文件下新建Home.vue和Login.vue和404.vue等空文件 

新增types文件(声明TS类型),文件下新建api.d.ts一个空文件

使用vue3 + TS + Pinia + Vant4 + vite搭建商城H5项目框架,vue.js,前端,typescript,less

 处理App.vue文件

//App.vue

<script setup lang="ts">

</script>

<template>
  //路由占位符
  <router-view />
</template>

<style scoped lang="less">

</style>

 处理main.ts文件

import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)

app.mount('#app')

4. 样式初始化,引入vant组件库,浏览器适配

1)样式初始化

        npm i reset-css

//在main.ts中引入

import "reset-css"       //样式初始化

2)引入vant组件库

        npm i vant

//在main.ts中引入vant
import vant from "vant"
import "../node_modules/vant/lib/index.css"

3)浏览器适配

        npm i postcss-px-to-viewport --save -dev

新建文件postcss.config.cjs,配置设计稿的视口宽度:viewportWidth: 375,其余可选配置

//postcss.config.cjs文件
module.exports = {
    plugins: {
      'postcss-px-to-viewport': {
        viewportWidth: 375, // 设计稿的视口宽度
        unitPrecision: 5, // 单位转换后保留的精度
        propList: ["*"], // 能转化为vw的属性列表
        viewportUnit: "vw", // 希望使用的视口单位
        fontViewportUnit: "vw", // 字体使用的视口单位
        selectorBlackList: [], // 需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位。
        minPixelValue: 1, // 设置最小的转换数值,如果为1的话,只有大于1的值会被转换
        mediaQuery: false, // 媒体查询里的单位是否需要转换单位
        replace: true, //  是否直接更换属性值,而不添加备用属性
        exclude: undefined, // 忽略某些文件夹下的文件或特定文件,例如 'node_modules' 下的文件
        include: undefined, // 如果设置了include,那将只有匹配到的文件才会被转换
        landscape: false, // 是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape)
        landscapeUnit: "vw", // 横屏时使用的单位
        landscapeWidth: 568, // 横屏时使用的视口宽度
      },
    },
  };

5. 自动导入常用的使用的第三方库的 API

npm i -D unplugin-auto-import

//在vite.config.ts中配置
import AutoImport from "unplugin-auto-import/vite"

export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      imports: [ 'vue', 'vue-router'] //自动导入相关函数
    })
  ],
})

6. 配置网络请求,全局配置请求的参数和返回值TS类型

        npm i axios

//在request文件下的index.ts配置

import axios from "axios"

const instance = axios.create({
    baseURL: "https://XXXXXX.com",
    timeout: 20000
})

//请求拦截器
instance.interceptors.request.use(
    config => {
        if(localStorage.getItem('token')){
            config.headers.Authorization = localStorage.getItem('token')
        }
        return config
    },
    err => {
        return Promise.reject(err)
    }
)

// 响应拦截器
instance.interceptors.response.use(
    res => {
        return res.data
    },
    err => {
        return Promise.reject(err)
    }
)

export default instance

//在request文件下的api.ts配置

import request from "./index"

export const helpCenterRes = () => request.get('/helpcenter')

export const bannerAPIRes = ( params: BannerAPIReq ):Promise<BannerAPIRes> => request.get('/banner', {params})

在types文件下api.d.ts,配置各个请求接口的参数类型和返回值类型,并在api.ts中应用

interface BannerAPIReq {
    title: string;
}

interface BannerListType {
    detail_url: string;
    picture: string;
    url: string;
}

interface BannerAPIRes {
    code: number;
    message: string;
    banner: BannerListType[];
}
//在Index.vue中使用封装的接口

<script setup lang="ts">
import { ref,onMounted } from "vue"
import { bannerAPIRes } from '../request/api'
onMounted( () => {
    getBannerRes()
})
interface BannerListType {
    detail_url: string;
    picture: string;
    url: string;
}
const bannerList = ref<BannerListType[]>([])

const getBannerRes = async() => {
    const res:any = await bannerAPIRes({
        title: 'newapp'
    })
    console.log(res)
    if(res.code == 200){
        bannerList.value = res.banner
    }
}
</script>

<template>
  <van-swipe :autoplay="3000" :height="420" lazy-render>
    <van-swipe-item v-for="item in bannerList">
      <img style="width: 100%;height: 419.4px;" :src="item.picture" />
    </van-swipe-item>
  </van-swipe>
</template>

<style scoped lang="less">

</style>

7.  配置路由

npm i vue-router          //下载vue-router插件第四版本

//main.ts中引入和挂载路由

import router from './router'

app.use(router) 
//router/index.ts

import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";
import Home from "../views/Home.vue"
import Index from "../views/Index.vue"

const routes: Array<RouteRecordRaw> = [
    {
        path: '/',
        component:  Home,
        redirect: '/index',   //路由重定向
        children: [           //路由嵌套
            {
                path: 'index',
                name: 'Index',
                component: Index
            },
            {
                name: 'Wash',
                path: 'wash',
                component: () => import('../views/Wash.vue')
            },
            {
                name: 'Order',
                path: 'order',
                component: () => import('../views/Order.vue')
            },
            {
                name: 'My',
                path: 'my',
                component: () => import('../views/My.vue')
            }
        ]
    },
    {
        name: 'Login',
        path: '/login',
        component: () => import('../views/Login.vue')
    },
    {
        name: "404",
        path: "/:pathMatch(.*)*",
        component: () => import('../views/404.vue')
    }
]

const router = createRouter({
    history: createWebHistory(),
    routes
})

router.beforeEach( ( news,old,next ) => {
    next()
})

export default router

8. 配置pinia,并做持久化存储

npm i pinia

npm i pinia-plugin-persist

//在store/index.ts配置pinia和共享数据持久化处理

import { createPinia } from "pinia";
import piniaPluginPersist from "pinia-plugin-persist"

const store = createPinia()
store.use(piniaPluginPersist)

export default store

//在mian.ts中引入并挂载pinia

import store from "../src/store/index"

app.use(store)

为了避免共享的数据混乱放在一个文件下,因此需模块化处理不同页面的共享数据

order.ts表示订单页面涉及到的共享数据及数据的处理方法

address.ts表示地址页面涉及到的共享数据及数据的处理方法

以order.ts为示例

import { defineStore } from "pinia";

export const orderStore = defineStore( "order", {
    //存放需要共享的数据
    state: () => {
        return {
            orderType: "takein",
            count: 1
        }
    },
    //Store 状态的计算值
    getters: {
        doubleCount: (state) => state.count  * 2
    },
    //存放同步和异步方法
    actions: {
        countAdd(num: number){
            this.count = this.count + num
        }
    },
    //开启数据持久化存储
    persist: {
        enabled: true
    }
})
//在页面使用store中的数据
<script setup lang="ts">
  import { storeToRefs } from 'pinia';
  import { orderStore } from '../store/order'; //引入order模块数据
  
  const orderstore = orderStore()
  const {count, doubleCount} = storeToRefs(orderstore) //解构成响应式数据
  const addNum = (num: number) => {
    orderstore.countAdd(num)  //用actions中的方法
  }
</script>

<template>
  <div>state中的数据响应式展示: {{ count }} </div>
  <div>getters中的数据响应式展示: {{ doubleCount }} </div>  
  <button @click="addNum(10)">点击操作state中的数据</button>
</template>

<style scoped lang="less">

</style>

使用vue3 + TS + Pinia + Vant4 + vite搭建商城H5项目框架,vue.js,前端,typescript,less

使用vue3 + TS + Pinia + Vant4 + vite搭建商城H5项目框架,vue.js,前端,typescript,less

 开启数据持久化存储后,刷新页面,数据不会变成原始数据

9. 设置网站logo和网站名称

在index.html文件配置网站logo和网站名称

网站logo的是.ico格式,其他格式图片需要转成.ico文件

<head>
    <meta charset="UTF-8" />
    <link rel="icon" href="/tidylogo.ico" />    //配置logo
    <title>XXXXX有限公司官方网站</title>          //配置网站名称
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>

10. 配置less

        npm i less -D

<style scoped lang="less">
@color: pink;   //定义一个颜色变量

//类名嵌套
.title{
  div{
    color: @color;   //使用变量
  }
}
</style>

11. 首页配置自定义tabbar底部栏

//Home.vue中配置tabbar栏数据和跳转路由等,同时在router/index.ts中配置相应的路由

<script setup lang="ts">
  import { ref,reactive,onMounted } from "vue"
  onMounted( () => {
    
  })

  const active = ref(0)

  const tabbarList = reactive([
    {
      title: '首页',
      path: '/index',
      inactive: 'https://tidyimages.oss-cn-hangzhou.aliyuncs.com/newh5/home.png',
      active: 'https://tidyimages.oss-cn-hangzhou.aliyuncs.com/newh5/home_active.png'
    },
    {
      title: '洗衣',
      path: '/wash',
      inactive: 'https://tidyimages.oss-cn-hangzhou.aliyuncs.com/newh5/wash.png',
      active: 'https://tidyimages.oss-cn-hangzhou.aliyuncs.com/newh5/wash_active.png'
    },
    {
      title: '订单',
      path: '/order',
      inactive: 'https://tidyimages.oss-cn-hangzhou.aliyuncs.com/newh5/order.png',
      active: 'https://tidyimages.oss-cn-hangzhou.aliyuncs.com/newh5/order_active.png'
    },
    {
      title: '我的',
      path: '/my',
      inactive: 'https://tidyimages.oss-cn-hangzhou.aliyuncs.com/newh5/my.png',
      active: 'https://tidyimages.oss-cn-hangzhou.aliyuncs.com/newh5/my_active.png'
    }
  ])
  const onChangeTab = (index: number | string) => {
    console.log(index)
  }
</script>

<template>
  <router-view></router-view>
  <van-tabbar v-model="active" active-color="#26D7CC" route @change="onChangeTab">
    <van-tabbar-item replace :to="item.path" v-for="(item,index) in tabbarList" :key="index">
      <span :class="active === index ? active : ''">{{ item.title }}</span>
      <template #icon="props">
        <img :src="props.active ? item.active : item.inactive" />
      </template>
    </van-tabbar-item>
  </van-tabbar>
</template>

<style scoped lang="less">

</style>

效果图如下:

使用vue3 + TS + Pinia + Vant4 + vite搭建商城H5项目框架,vue.js,前端,typescript,less
​​​​​​​文章来源地址https://www.toymoban.com/news/detail-655491.html

到了这里,关于使用vue3 + TS + Pinia + Vant4 + vite搭建商城H5项目框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3+vite+vant4手机端项目实录

    目录 一、项目介绍 二、项目的搭建 1.vite的安装 2.启动vite项目  3.vant4的引入与使用 3.1安装指令 npm i vant 3.2引入vant4 4.路由router的引入 4.1安装指令 4.2路由配置 5.路径别名设置 6.json-server 6.1json-server安装 6.2json-server启动项配置 6.3启动命令:npm run mock 7.axios请求数据 7.1安装axios依

    2024年02月03日
    浏览(48)
  • Vite4+Typescript+Vue3+Pinia 从零搭建(2) - ts配置

    项目代码同步至码云 weiz-vue3-template 关于tsconfig的配置字段可查看其他文档,如 typeScript tsconfig配置详解 文件修改如下: 修改文件如下: 新建文件夹 types ,用来存放类型定义。比如新建 index.d.ts : 后续也可以新增其他文件,比如 global.d.ts 存放全局定义, router.d.ts 存放路由定

    2024年02月05日
    浏览(49)
  • 从0开始搭建一个vue3+vite+ts+pinia+element-plus的项目

    前言:vue3+ts+vite大家已经都开始用了,最近也在学习,基本上是零基础开始ts的学习,很多语法知识是边写边查,没有系统的学习ts。此处展示从零开始,搭建的一个框架,方便拿来即用! 其中框架选择vue,语言选择typeScript 项目启动成功以后如下所示: 为了方便日常工作中

    2024年02月06日
    浏览(46)
  • Vite + Vue3 +Vant4构建项目时,按需引入使用Toast组件,引用 showToast 时出现编译报错的解决方案

    一.问题定位 在Vite + Vue3 +Vant4构建项目时,需要使用Toast组件显示提示信息,按照官方文档使用函数调用 使用后直接报错,说是找不到对应的样式文件(如下图): 在项目中查找node-moudles文件,确实没有找到,只有一个toast文件(如下图): 在百度搜索解决方法,说是需要单

    2024年01月17日
    浏览(47)
  • 【Vue3+Ts project】vant4 实现触发指定表单 rules校验、setTimeout和 setInterval 区别

      一.使用 vant组件  validate属性 实现 触发指定输入框rules校验 ,满足校验通过否则失败  1. 给form表单绑定 ref并定义值名称 ,然后为你想校验的表单绑定 name值 2.为ref的值名称定义变量名 ,然后 ref值名称.value.validate(\\\'name值名称\\\'),.then接收成功 , .catch 接收失败   二. setT

    2024年02月11日
    浏览(41)
  • 分析 vant4 源码,学会用 vue3 + ts 开发毫秒级渲染的倒计时组件,真是妙啊

    2022年11月23日首发于掘金,现在同步到公众号。 11. 前言 大家好,我是若川。推荐点右上方蓝字若川视野把我的公众号 设为星标 。我倾力持续组织了一年多源码共读,感兴趣的可以加我微信 lxchuan12 参与。另外,想学源码,极力推荐关注我写的专栏《学习源码整体架构系列》

    2024年02月05日
    浏览(80)
  • vue3+ts+pinia+vite一次性全搞懂

    前提是所处vue环境为vue3,如果失败就查看一下环境是否为vue2,然后删除vue2,安装vue3 这是我报过的错

    2024年02月01日
    浏览(30)
  • 前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十一章 基础界面开发 (组件封装和使用)

    Vue 是前端开发中非常常见的一种框架,它的易用性和灵活性使得它成为了很多开发者的首选。而在 Vue2 版本中,组件的开发也变得非常简单,但随着 Vue3 版本的发布,组件开发有了更多的特性和优化,为我们的业务开发带来了更多便利。本文将介绍如何使用 Vue3 开发业务组件

    2024年02月19日
    浏览(47)
  • Vue3+Vite+Pinia+Naive项目搭建之二:scss 的安装和使用

    前言 如果对 vue3 的语法不熟悉的,可以移步 Vue3.0 基础入门,快速入门。 github 开源库:Vue3-Vite-Pinia-Naive-Js gitee   开源库:Vue3-Vite-Pinia-Naive-Js 1. 安装依赖  2. 新增 src/assets/style/reset.scss 页面样式初始化 3. 新增 src/assets/style/common.scss 共用样式 4. 新增 src/assets/style/utils.scss 工

    2024年02月12日
    浏览(44)
  • Vue3 Vite4 ElementPlus TS模板(含Vue-Router4+Pinia4)

    手动安装配置Vue3 ElementPlus模板比较繁琐,网上寻找一些模板不太符合自己预期,因此花点精力搭建一个符合自己需求的架子 采用最新的组件,版本如下: vite 4.3.9 vite-plugin-mock 2.9.8 vue 3.3.4 pinia 2.1.3 vue-router 4.2.2 element-plus 2.3.6 满足自己以下功能: Vite工具热启动速度快,修改后

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包