v3--3

116 阅读2分钟

26.elementPlus的使用

// 安装
npm install element-plus --save


// 配置
main.ts中:
import ElementPlus from "element-plus"
import "element-plus/dist/index.css"
app.use(ElementPlus)


// 配置提示
tsconfig.json中:
{
  "compilerOptions": {
    "types": ["element-plus/global"]
  },
}

27.样式穿透

v2中用的::v-deep

v3中用:deep(放入,如.el-input__inner) // 暂时没有用过,利用了覆盖

28. 插槽选择器/全局选择器/动态css

插槽选择器:slotted()


// 写一个插槽A,放入app中,注意定义了class为aa
<template>
  <div>
    <A>
      <div class="aa">定制div</div>
    </A>
  </div>
</template>

<script setup lang="ts">
import A from './components/A/index.vue'
</script>



// 插槽A中,使用:slotted设置样式
<template>
    <div>
        <slot></slot>
    </div>
</template>
:slotted(.aa) {
    color: red;
}
</style>
全局选择器:global

// 例
:global(div) {
    color: red;
}
动态css
// v-bind
<template>
    <div class="aa">--A--</div>
</template>

<script setup lang="ts">
import { ref } from "vue"
const style = ref("red")
</script>
<style lang="scss" scoped>
.aa {
    color: v-bind(style);
}
</style>
动态css--对象写法
// 如果是对象的话,要加上''
<script setup lang="ts">
import { ref } from "vue"
const style = ref({
    color: "red",
})
</script>
<style lang="scss" scoped>
.aa {
    color: v-bind("style.color");
}
</style>
CSSmodule:常用于TSX/render函数

// 用法一:module+$style
<template>
    <div :class="$style.aa">--A--</div>
    <div :class="[$style.aa, $style.bb]">--B--</div>
</template>

<style lang="scss" module>
.aa {
    color: red;
}

.bb {
    border: 1px solid red;;
}
</style>



// 用法二:自定义名字
<template>
    <div :class="cc.aa">--A--</div>
    <div :class="[cc.aa, cc.bb]">--B--</div>
</template>

<style lang="scss" module="cc">
$border: 1px solid red;
.aa {
    color: red;
}
.bb {
    border: $border;
}
</style>



// 用法三:自定义hooks--useCssModule
// useCssModule + module="cc"
<template>
    <div :class="cc.aa">--A--</div>
    <div :class="[cc.aa, cc.bb]">--B--</div>
</template>

<script setup lang="ts">
    import { useCssModule } from "vue"
    const css = useCssModule("cc")
</script>
<style lang="scss" module="cc">
$border: 1px solid red;

.aa {
    color: red;
}

.bb {
    border: $border;
}
</style>

29.tailWind试用

30.event loop

1.机制

同步任务
    代码从上到下按顺序执行

异步任务
    1.宏任务
        script(整体代码)、setTimeoutsetIntervalUI交互事件、postMessage、Ajax
    2.微任务
        Promise.then/catch/finally
        MutaionObserver
        process.nextTick(Node.js 环境)

运行机制
    所有的同步任务都是在主进程执行的形成一个执行栈,
    主线程之外,还存在一个"任务队列",
    任务队列中先执行宏任务,然后清空当次宏任务中的所有微任务,然后进行下一个tick如此形成循环

2.实例

async function Prom() {
    console.log("y")
    await Promise.resolve()
    console.log("x")
}
setTimeout(() => {
    console.log(1)
    Promise.resolve().then(() => {
        console.log(2)
    })
}, 0)
setTimeout(() => {
    console.log(3)
    Promise.resolve().then(() => {
        console.log(4)
    })
}, 0)
Promise.resolve().then(() => {
    console.log(5)
})
Promise.resolve().then(() => {
    console.log(6)
})
Promise.resolve().then(() => {
    console.log(7)
})
Promise.resolve().then(() => {
    console.log(8)
})
Prom()
console.log(0)


// y 0 
// 5 6 7 8 x
// 1 2 3 4

3.nextTick原理

源码里flushJobs函数维护三个队列
    一个flush配置为pre的watch
    一个queue保证父组件在子组件之前
    一个flush配置为post的watch
nextTick始终返回一个Promise,把同步任务改为微任务

31.unocss原子化/tailwind

---作了解---

基础用法

// 安装
npm i -D unocss


// 配置vite.config.js
import unocss from 'unocss/vite'
plugins: [
    vue(),
    unocss({
      rules: [
        ["flex", { display: "flex" }],
        ["red", { color: "red" }],
      ],
    }),
],


// 配置main.ts
import 'uno.css'


// 使用
<div class="flex red">
    ---A---
</div>

32.函数式编程h函数的基本了解

33.electron的基本了解

34.环境变量

// 开发环境
创建.env.development

// 生产环境
创建.env.production

// 使用
在app中:
const env = import.meta.env
console.log('env', env);

35.webpack打包相关

36.vue3性能优化

// 按需引入elementPlus/antd


// PWA离线存储技术


// 相关配置优化
build:{
       chunkSizeWarningLimit:2000,
       cssCodeSplit:true, //css 拆分
       sourcemap:false, //不生成sourcemap
       minify:false, //是否禁用最小化混淆,esbuild打包速度最快,terser打包体积最小。
       assetsInlineLimit:5000 //小于该值 图片将打包成Base64 
}


// 图片懒加载vue3-lazy


// 虚拟列表


// 其他:多线程useWebWorker,防抖节流:useDebounceFn

37.Web Components了解

38.跨域

常见的三种解决方法

// 1.jsonp,动态产生script
function clickButton() {
    let obj, s
    obj = { "table":"products", "limit":10 }; //添加参数
    s =  document.createElement("script"); //动态创建script
    s.src = "接口地址xxxxxxxxxxxx"  + JSON.stringify(obj);
    document.body.appendChild(s);
 }
//与后端定义callback名称
function myFunc(myObj)  {
    //接受后端返回的参数
    document.getElementById("demo").innerHTML = myObj;
}



// 2.cors
{
  "Access-Control-Allow-Origin": "http://web.xxx.com" //可以指定地址
}


// 3.配置跨域
vite.config.ts中:
  server: {
    proxy: {
      "/api": {
        target: "http://localhost:9001/",
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, ""), //重写路径,替换/api
      },
    },
  },