The first use of vue3.0

Routing configuration

The routing configuration is basically the same, but the following example needs to be introduced in the routing guard

import {
    
     createWebHashHistory, createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import Home from '../views/Home.vue'
import Layout from "../views/Layout/Layout.vue"
      // 路由正常配置
  {
    
    
    path: '',
    component: Layout,
    children: [
      {
    
    
        path: '',
        name: 'Home',
        component: Home,
        meta: {
    
    
          title: "首页",
          parentpath: '/'
        }
      },
      {
    
    
        path: '/',
        redirect: '/home'
      }, {
    
    
        path: '/Strategy',
        name: 'Strategy',
        component: () => import('../views/Strategy/Strategy.vue'),
        meta: {
    
    
          title: "旅游攻略",
          parentpath: '/Strategy'
        }
      }, {
    
    
        path: '/hotel',
        name: 'hotel',
        component: () => import('../views/Hotel/Hotel.vue'),
        meta: {
    
    
          title: "酒店",
          parentpath: '/hotel'
        }
      },],
  },
//决定路由模式
const isPro: boolean = process.env.NODE_ENV === 'production'

const router = createRouter({
    
    
  //history是路由模式
  history: isPro ? createWebHashHistory(process.env.BASE_URL) : createWebHistory(process.env.BASE_URL),
  routes
})
router.beforeEach((to, from, next) => {
    
    
  document.title = to.meta.title
  next()
})

Package request

import {
    
     message } from 'ant-design-vue'  //按需引入(提示)
import axios, {
    
     AxiosInstance, AxiosRequestConfig, AxiosError, AxiosResponse } from 'axios'
import nprogress from 'nprogress' //请求进度条(动画效果)
import 'nprogress/nprogress.css'

const service: AxiosInstance = axios.create({
    
    
    baseURL: '/api',
    timeout: 10000
})

service.interceptors.request.use((config: AxiosRequestConfig): AxiosRequestConfig => {
    
    
    nprogress.start()
    return config
}, (err: AxiosError) => {
    
    
    nprogress.done()
    console.log(err)
    return Promise.reject(err)
})


service.interceptors.response.use((res: AxiosResponse): AxiosResponse => {
    
    
    nprogress.done()
    return res.data
}, (err: AxiosError) => {
    
    
    nprogress.done()
    if (err.response && err.response.status) {
    
    
        let status = err.response.status
        console.log(err.response, "7877789");
        if (status === 400) {
    
      //如果请求错误为400的话会有提示
            message.error(err.response.data.message)
        }

    }
})

export default service

Package api

import service from './index'  //引入封装的axios文件
const token = localStorage.getItem('token')  //按需使用


export default {
    
    
  //文章列表  
    articleList({
    
     city }: {
    
     city: number | string }) {
    
      //没个参数都需要定义类型
        if (city) {
    
     return service.get(`posts?city=${
      
      city}`) }
        else {
    
     return service.get(`posts`) }
    },
  //验证码
    Accont({
    
     tel }: {
    
     tel: string | number }) {
    
    
        return service.post(`captchas`, {
    
     tel })
    },

}

Define the received data type of axios

Define an axios.d.ts file in the src root directory, the content of which is as follows, which contains the data types of all the data obtained after the request

import * as axios from 'axios'
declare module 'axios' {
    
    
    interface AxiosResponse<T> {
    
    
        data?: T,
        total?: number,
        code?: string,
        token?: string,
        user?: any,
        message?: string,
        data?: object,
        total?: number,
    }
}

Use of Ant icon

The code in main.ts is as follows

import {
    
     createApp } from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';
import * as Icons from '@ant-design/icons-vue';  //全局引入

const app = createApp(App);
app.use(store);
app.use(router).mount('#app');
app.use(Antd)
const icons: any = Icons;  
for (let i in icons) {
    
       //循环注册
    app.component(i, icons[i]);
}

Note when using

import api from "../../http/api";
import {
    
     Form } from "ant-design-vue/types/form/form";
import {
    
    defineComponent,reactive,toRefs,SetupContext,onMounted} from "vue";
import {
    
     message } from "ant-design-vue";
import {
    
     useRoute, useRouter } from "vue-router";  
interface Data {
    
      //定义data中的数据类型
  form: formitem;
  SpecialAir: [];
  addomg: additem[];
  data: [];
  data1: [];
}
    onMounted(() => {
    
      //同2.0中的mounted
    });
  let back = () => {
    
    
      message.warning("目前暂不支持往返,请使用单程选票!");
    };
Every event needs to be returned
 return {
    
    
      ...toRefs(data),
      back,
    };
Jump route
import {
    
     useRoute, useRouter } from "vue-router"; //先引入


    let router = useRouter();
    let buy = (item: any) => {
    
    
      console.log(item);
      router.push({
    
    
        path: "/ticket",
        query: {
    
    
          item: JSON.stringify(item), //如果不是字符串类型的话需要转换一下
        },
      });
Jump routing (accept the value passed)
    data.departCity = JSON.parse(route.query.item as string).departCity;

    });
Get the content defined by meta in the route (usually used to set the sidebar)
 <a-menu id="dddddd" v-model:selectedKeys="selectedKeys" theme="light">
          <a-menu-item
            v-for="item in $router.options.routes[0].children"
            :key="item.path"
            @click="goto(item.path)"
          >
           <component :is="item.meta.icon"></component>  
            <span>{
    
    {
    
     item.meta.title }}</span>
          </a-menu-item>
        </a-menu>
import {
    
     useRoute, useRouter } from "vue-router";
  setup(props, ctx: SetupContext) {
    
    
      let router = useRouter();
      return {
    
    
      ...toRefs(data),
      goto,
    };
  }

Calculated attributes
    let userinfow = computed(() => {
    
    
      return store.state.userinfo;  //vuex中的数据
    });
Dynamic binding class
    <div
          class="left"
          :class="{shine:$route.meta.parentpath===item.path}"  //shine为类名
          v-for="(item,index) in top "
          :key="index"
          @click="goto(item)"
        >{
    
    {
    
    item.name}}</div>
Dynamic binding style
<div:style="`background: url(${item.url}) center center no-repeat`"></div>
Use vuex
import {
    
     useStore } from "vuex"; //引入

let store = useStore();  //创建实例

  let registeredall = () => {
    
    
      api
        .registered()
        .then((res: Res) => {
    
    
          if (res.token) {
    
    
            store.commit("setuserinfo", res.user);  //调用vuex中的方法去改变数据
          }
        })
        .catch((err: any) => {
    
    
          console.log(err);
        });
    };
vuex
import {
    
     createStore } from 'vuex'

export default createStore({
    
    
  state: {
    
    
    userinfo: null || JSON.parse(localStorage.getItem('user')!)
  },
  mutations: {
    
    
    setuserinfo(state, data) {
    
    
      state.userinfo = data
    }
  },
  actions: {
    
    
  },
  modules: {
    
    
  }
})
Register subcomponent
<template>
        <Top></Top>
        <Bottom></Bottom>
</template>



import Top from "../../components/layout/Top.vue";
import Bottom from "../../components/layout/Bottom.vue";

<script lang='ts'>
export default defineComponent({
    
    
  components: {
    
    
    Top,
    Bottom,
  },
Validate with ref form
<a-form
              name="custom-validation"
              style="margin-top: 20px"
              ref="shin"
              :model="ruleForm"
              :rules="rules"
            >
              <a-form-item
                required
                label="姓名"
                name="checkPass"
                style="display: flex; width: 80%"
              >
                <a-input
                  v-model:value="ruleForm.checkPass"
                  style="margin-right: 0px; width: 125%; margin-top: 15px"
                  autocomplete="off"
                />
              </a-form-item>
            </a-form>


import {
    
     Form } from "ant-design-vue/types/form/form";

setup(props, ctx: SetupContext) {
    
    
    let shin = ref<Form | null>(null);  //shin为ref的名字 创建实例
    let info = () => {
    
         
      shin.value!.validate().then((res: any) => {
    
      //当表单验证成功时才会执行后面then中代码
        router.push("/");
      });
    };
}

Guess you like

Origin blog.csdn.net/weixin_49866029/article/details/108942137