当前位置: 首页 > news >正文

Vue3项目基本知识点

vue 文件基本结构

<template></template>
<script setup></script>
<style lang="less">

vue 常用插件

  • vuex 全局状态管理
  • vue-router 路由管理
  • vite 框架搭建
  • tailwind css 框架
  • axios 接口封装
  • element-pluse ui组件
  • leaflet 地图框架
  • qiankun 微前端
  • create-form 表单生成
  • mockm 前端接口自定义

Vue3 自定义指令

定义文件

export default{
  mounted(el,binding,vnode){
    const {value} = binding
    if(value){
      return true
    }
    return false
  }
}

使用 在mian.js 中引入定义好的文件

import XXX from "./XXX.js"
import {createApp} from "vue"
import App from './App'

const app = createApp(App)

app.directive('XXX',XXX)
app.mount("#app")

Vue3定义、获取全局函数

定义

import XXX from "./XXX.js"
import {createApp} from "vue"
import App from './App'
//创建
const app = createApp(App)

app.config.globalProperties.XXX = XXX

//挂载
app.mount("#app")

使用

//获取全局proxy

const {proxy} = getCurrentInstance()

proxy.XXX()

在Vue3 中使用element-pluse icon组件

//安装
yarn add @element-plus/icons-vue
//引入
import 'virtual:svg-icons-register'
import SvgIcon from '@/components/SvgIcon'
import elementIcons from '@/components/SvgIcon/svgicon'

app.use(elementIcons)
app.component('svg-icon', SvgIcon)

SvgIcon 封装

import * as components from '@element-plus/icons-vue'

export default {
    install: (app) => {
        for (const key in components) {
            const componentConfig = components[key];
            app.component(componentConfig.name, componentConfig);
        }
    },
};

在Vue3中封装Axios

errorCode.js

export default {
  '401': '认证失败,无法访问系统资源',
  '403': '当前操作没有权限',
  '404': '访问资源不存在',
  'default': '系统未知错误,请反馈给管理员'
}

request.js

import axios from 'axios'
import store from '@/store'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'


axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: import.meta.env.VITE_APP_BASE_API,
  // 超时
  timeout: 10000
})


service.interceptors.request.use() //请求拦截
service.interceptors.response.use()//响应拦截

文件下载

file-saver

//安装file-saver  
npm instal file-saver
yarn add file-saver


//引入
import {saveAs} from "file-saver"

saveAs(blob,fileName)

Vue Hooks使用方法

Hooks 是做什么的
通俗讲就是钩子

一.在父组件生命周期中使用

在组件内部使用

import {ref,onMounted} from "vue"
export const useName=()={
  const name:string = ref("name")
  
  const getName=():string=>{
    return name.value
  }
  
  const setName = (value:string):void=>{
    name.value = value
  }
onMounted(()=>{
  console.log(name.value)
})
  return {name,getName,setName}
}

在组件外部使用

<template>
  <child @hook:></child>
 </template>
<script>
export default{
  setup(props){
  
    
  }
}  
</script>

二.在组件中使用

新建hooks文件

import {ref,onMounted} from "vue"
export const useName=()={
  const name:string = ref("name")
  
  const getName=():string=>{
    return name.value
  }
  
  const setName = (value:string):void=>{
    name.value = value
  }
  return {name,getName,setName}
}

在文件中使用

import {useName} from "@/hooks/useName"
export default{
  setup(props){
    const {name,getName,setName} = useName()
    return {name,getName,setName}
  }
}

Vue 父组件向子组件传值

props

import {defineProps} from "vue"
const time = defineProps({
  time:Object
})
<children :time="time"></children>


import children form './children'
import {ref} from 'vue'
const time = ref(new Date())



provide

import {inject} from 'vue'
const sub = inject("upperComp")//获取
sub.changeParams("你好")
import {provide,reactive} from "vue"
const params = reactive({
  title:"你好"
})
provide("upperComp",{
  params,
  changeParams:(value)=>{
    params.title = value
  }
})

Vue 子组件向父组件传

defineEmits

const emit = defineEmits(["changeTime"])

const changeTime=()=>{
  emit('changeTime',value)
}
<children @changeTime></children>

const changeTime=(value)=>{
  console.log(value)
}

Vue 中RouterView使用方法

<router-view v-slot="{Component}">
  <keep-alive>
    <component :is="Component">
  </keep-alive>
</router-view>

vite 中定义文件别名设置跨域代理

import {resolve} from "path"
import {defineConfig} from 'vite'
import WindiCSS from 'vite-plugin-windicss'
import vue from '@vitejs/plugin-vue'
export dafault defineConfig({
  plugins:[vue(),WindiCSS()],
  //设置文件别名
  resolve:{
    alias:{
      "@":reslove(__dirname,'src')
    }
  },
  server:{
    //设置跨域代理
    proxy:{
      '/api':{
        target:"",
        changeOrigin:true,
        rewrite:(path)=>path.replace(/^\/api/,"")
      }
    }
  }
})

Vite使用外部变量

VITE_TITLE="我是vite"
VITE_APP_ENV=dev
VITE_BASE_URL="http://localhost:9000/"
VITE_APP_ENV=production
import.meta.env.VITE_BASE_URL

Vite 中动态引入组件

const modules = import.meta.glob("/src/views/**/**.vue") //引入全部组件
modules[`/src/views${item.url}/index.vue`] //使用组件

Vue3 使用ts 解决未定义interface 报错

在根目录定义env.d.ts

declare module 'js-cookie'
declare module 'nprogress'
declare module '*.vue' {
    import { DefineComponent } from 'vue'
    // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
    const component: DefineComponent<{}, {}, any>
    export default component
}

ref、reactive、toRef与toRefs 的区别

ref

用于为数据添加响应状态,因为reactive只能传入对象类型的参数,对于基本类型只能用ref,同样返回一个具有响应式状态的副本

  • 获取数值时需要加.value
  • 参数可以传递任意数据类型,传递对象类型时也能保持深度响应式
  • Vue3.0 setup里面定义数据时优先使用ref,方便逻辑拆分和业务解耦
import {ref} from "vue"

const name = ref("Tom")

const state = ref({
  count:0
})



reactive

reactive 用于为对象添加响应式状态
接受一个js对象作为参数,返回一个具有响应式状态的副本

  • 获取数值时直接获取,不需要添加.value
  • 参数只能传递对象类型
import {reactive} from "vue"

const state = reactive({
  count:0
})

console.log(state.count)

toRef

toRef用于为原响应式对象上的书香新建一个ref,从而保持对其源对象属性的响应式链接,
接受两个参数:源响应式对象和属性名称,返回一个ref数据
列如:使用父组件传递的props数据时,需要引入props的某一个属性且需要保持响应式连接时就很有用

  • 获取数据时需要添加.value
  • toRef后的ref数据如果是复杂类型数据时,不是原始数据的拷贝而是引用,改变结果也会导致原始数据的改变
import {toRef,defineProps} from 'vue'
const title = defineProps({
  title:{
    type:string,
    default:"Tom"
  }
})

const myTitle = toRef(title,"title")

相关文章:

  • 中国晶振市场规模将增长至2026年的263.21亿元,国产市场未来可期
  • C 语言的编译,干货有点多!
  • set(关联性容器)
  • python中的% 是什么意思, 起到什么作用?
  • vue+antd搭建后台管理界面模版(PC端),适配中文、英文、日文 mock数据,开箱即用
  • php项目管理系统 。集产品管理、项目管理、质量管理、文档管理、 组织管理和事务管理于一体,是一款专业的研发项目管理软件
  • java 三级缓存
  • 记一次简单的白加黑测试
  • 【关于时间序列的ML】项目 7 :使用机器学习进行每日出生预测
  • 马斯克辞任CEO,产品经理如何用项目协作软件武装自己?
  • 106. 从中序与后序遍历序列构造二叉树
  • 让人恶心的多线程代码,性能怎么优化
  • 「PAT乙级真题解析」Basic Level 1096 大美数 (问题分析+完整步骤+伪代码描述+提交通过代码)
  • 使用Anaconda安装TensorFlow详细教程
  • wifi热点setting
  • stable diffuison论文阅读
  • 开源工具系列1:Cloud Custodian
  • Java 的三种技术架构
  • 智能表格软件-FineReport JS实现自定义按钮快速给参数赋指定范围值
  • CSDN第17次竞赛题解与总结