添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

之前一直使用的react框架,利用业余时间了解了vue的源码及Vue3的原理。更是巧合的是工作中要开发一个简单的移动端页面,所以借此机会调研了Vue3+Vant+Ts,算是第一次比较正式的使用Vue框架吧,同时也想让自己养成记录的好习惯,欢迎大家提意见哈!!!!

首先要确保全局安装

npm install -g @vue/cli-service-global

创建一个项目

vue create

运行以下命令来创建一个新项目:

vue create hello-world

为了项目配置的灵活性,这里选择第三项,回车

根据自己情况选择要配置的内容(点击空格为选择),回车

选择Vue版本3.x

项目中使用-组件类样式的语法

与TypeScript一起使用Babel

hash路由还是history路由

css预处理器的选择

ESLint标准选择

校验规则的保存方式

node_modules    ---依赖文件夹
public          ---公共文件夹
src  					   ---项目主要文件夹
.gitignore  		---排除git提交配置文件
babel.config.js ---babel配置文件
package.json  	---模块描述文件
tsconfig.json  	---ts配置文件
.eslintrc.js  	---eslint规范配置文件

开发前配置

vant UI配置

# Vue 3 项目,安装 Vant 3:
npm i vant@next -S

自动按需引入组件

babel-plugin-import 是一款 babel 插件,它会在编译过程中将 import 的写法自动转换为按需引入的方式。

# 安装插件
npm i babel-plugin-import -D

在babel.config.js中添加vant配置

// 对于使用 babel7 的用户,可以在 babel.config.js 中配置
module.exports = {
  presets: ['@vue/cli-plugin-babel/preset'],
  plugins: [
      'import',
      { libraryName: 'vant', libraryDirectory: 'es', style: true },
      'vant',
浏览器适配

添加meta配置

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

Rem布局适配,根据官网提供方式进行配置

如果需要使用 rem 单位进行适配,推荐使用以下两个工具:

  • postcss-pxtorem 是一款 PostCSS 插件,用于将 px 单位转化为 rem 单位
  • lib-flexible 用于设置 rem 基准值
  • //.postcssrc.js
    module.exports = {
      plugins: {
        'autoprefixer': {
          overrideBrowserslist: [
            'Android 4.1',
            'iOS 7.1',
            'Chrome > 31',
            'ff > 31',
            'ie >= 8'
        'postcss-pxtorem': {
          rootValue: 37.5,//因为vant的根字体大小是37.5
          propList: ['*']
    

    国际化配置

    yarn add vue-i18n
    

    在main.ts中进行注册

    import { createApp } from "vue";
    import App from "./App.vue";
    import router from "./router";
    import store from "./store";
    import i18n from "./language/i18n";
    const app = createApp(App);
    app.use(i18n);
    app.use(store).use(router).mount("#app");
    

    在src下创建language文件夹,及以下文件

    language   	---国际化根文件夹
        cn.ts  	---中文
        cn.ts  	---英文
        i18n.ts	---配置文件
        index.ts    ---国际化创建
    
    //src/language/i18n.ts
    import { createI18n } from "vue-i18n";
    import messages from "./index";
    const il8n = createI18n({
      locale: "cn",
      messages,
    export default il8n;
    
    //src/language/index.ts
    import cn from "./cn";
    import en from "./en";
    export default {
    
    //src/language/en.ts
    const en = {
      message:'Hello'
    export default en;
    
    //src/language/cn.ts
    const cn = {
      message:'你好'
    export default cn;
    
    <!--vue页面中使用-->
    <template>
      <van-popup
        v-model:show="_show"
        closeable
        <div class="header">
          <span class="text">{{$t('message')}}</span>
      </van-popup>
    </template>
    

    src文件夹

    assets   					---静态文件夹
    components  			                ---组件文件夹
    router  					---路由,这里使用的是vue-router 4.x
    store  						---vuex,这里使用的是4.x
    views  						---页面文件
    App.vue  					---页面入口文件
    main.ts  					---项目入口文件
    shims-vue.d.ts                                  ---类型定义文件(描述文件)
    

    路由文件--自动创建,并且会在main.ts中进行注册

    //router/index.ts
    import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
    import Home from '../views/Home.vue'
    const routes: Array<RouteRecordRaw> = [
        path: '/',
        name: 'Home',
        component: Home
        path: '/about',
        name: 'About',
        // route level code-splitting
        // this generates a separate chunk (about.[hash].js) for this route
        // which is lazy-loaded when the route is visited.
        component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
    const router = createRouter({
      history: createWebHistory(process.env.BASE_URL),
      routes
    export default router
    
    //main.ts
    import { createApp } from 'vue'
    import App from './App.vue'
    import router from './router'
    import store from './store'
    createApp(App).use(store).use(router).mount('#app')
    

    store文件--自动创建,同样会在main.ts中进行注册,如上

    import { createStore } from 'vuex'
    export default createStore({
      state: {
      mutations: {
      actions: {
      modules: {
    

    vue-class-component与defineComponent

    <!-- views/Home.vue -->
    <template>
      <div class="home">
        <img alt="Vue logo" src="../assets/logo.png">
        <HelloWorld msg="Welcome to Your Vue.js + TypeScript App"/>
    </template>
    <script lang="ts">
    import { Options, Vue } from 'vue-class-component';
    import HelloWorld from '@/components/HelloWorld.vue'; // @ is an alias to /src
    @Options({
      components: {
        HelloWorld,
    export default class Home extends Vue {}
    </script>
    

    你会发现自动创建的vue文件中使用了vue-class-component,网址:class-component.vuejs.org/

    Vue Class Component is a library that lets you make your Vue components in class-style syntax

    对于vue3使用Vue Class Component v8

    yarn add [email protected]
    defineComponent最重要的是:在TypeScript下,给予了组件 正确的参数类型推断 。 
    <template>
    	<van-skeleton title :row="3" :loading="loading" class="carSke">
    		<van-cell-group class="card">
    			<van-cell class="van-cell-top">
    				<template #title>
    					<div class="van-cell-title">{{requirementName}}</div>
    				</template>
    			</van-cell>
    		</van-cell-group>
    	</van-skeleton>
    </template>
    <script lang="ts">
    import { defineComponent,onMounted, reactive, computed, toRefs } from 'vue';
    import { Cell, CellGroup, Skeleton } from 'vant';
    export default defineComponent({
      name: 'ListRequirements',
    	components: {
    		VanCellGroup: CellGroup,
    		VanCell: Cell,
    		VanSkeleton: Skeleton,
    	setup() {
    		const state = reactive({
    			requirementName: '',
    		return {
    			...toRefs(state),
    </script>
    
    /*shims-vue.d.ts*/
    /* eslint-disable */
    declare module '*.vue' {
      import type { DefineComponent } from 'vue'
      const component: DefineComponent<{}, {}, any>
      export default component
    复制代码
    • 886
  • 私信