ssr:false 时,UIcon 会提示没有找到图标。因为图标默认是从服务端渲染弄出来的。需要设置 provider 为 none 或者 iconify建议设置为 iconify ,不然nuxt ui的图标会显示不出来相关 issue https://github.com/nuxt/icon/issues/178// nuxt.config.ts
icon: {
provider: "none",
customCollections: [
{
prefix: "ai",
dir: "./app/assets/icons"
}
]
},




export default defineConfig({
// 生产环境打包配置
build: {
chunkSizeWarningLimit: 1000,
rollupOptions: {
// 将打包出来的文件,拆分成多个小文件
output: {
manualChunks(id) {
if (id.includes("node_modules")) {
return id
.toString()
.split("node_modules/")[1]
.split("/")[0]
.toString();
}
}
}
}
}
});
const formData = new FormData();
formData.append("scene", "sqlite");
formData.append("file", chunk);
formData.append("index", `${index}`);
formData.append("total", `${total}`);
formData.append("name", name);
formData.append("ext", "db");
formData.forEach((value, key) => {
console.log(key, value);
});
window 新增 tinyMce 属性 ts 报错:类型“Window & typeof globalThis”上不存在属性 ‘tinyMce’声明 Window ,在根目录下新建一个 xxx.d.ts 文件(ts 会自动读取全局的 .d.ts 文件)declare interface Window {
tinyMce: any;
}
"suppressImplicitAnyIndexErrors": true
interface Myobject {
[key: string]: boolean; // 字段扩展声明
}
// vant
import "vant/es/button/style";
// element-plus
import "element-plus/es/components/button/style/css";
// 删除以下打包拆分
build: {
rollupOptions: {
// 将打包出来的文件,拆分成多个小文件
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
return id.toString().split('node_modules/')[1].split('/')[0].toString()
}
}
}
}
}
div {
-webkit-user-select: none; /*谷歌 /Chrome*/
-moz-user-select: none; /*火狐/Firefox*/
-ms-user-select: none; /*IE 10+*/
user-select: none;
}
new URL,写相对路径。<template>
<van-image src="url" class="w-full" />
</template>
<script setup lang="ts">
const url = new URL("./assets/image.png", import.meta.url).href;
</script>
require<template>
<van-image :src="require('./image.png')" />
</template>
<script setup> 中可以直接使用 Vant 组件,不需要进行组件注册。官方文档的示例中加了 van ,如<van-count-down :time="time" />, 在 setup 中不需要。
有些特殊的组件必须要 van,如 dialog。
具体情况见每个组件的组件调用(setup)部分。<template>
<count-down time="60000" />
<van-dialog v-model:show="show" title="标题" show-cancel-button>
<img src="https://fastly.jsdelivr.net/npm/@vant/assets/apple-3.jpeg" />
<van-dialog>
</template>
<script lang="ts" setup>
import { CountDown,Dialog } from 'vant';
const VanDialog = Dialog.Component;
const show = ref(true);
</script>
.el-button--success.is-disabled {
--el-button-disabled-bg-color: #fff;
--el-button-disabled-border-color: #ccc;
}
<template>
<el-tree
:data="departmentTree"
show-checkbox
ref="treeRef"
@check-change="handleCheckChange"
node-key="sid"
default-expand-all
:expand-on-click-node="false"
:props="{ class: customNodeClass, label: customLabel }"
/>
</template>
<script lang="ts" setup>
import type Node from "element-plus/es/components/tree/src/model/node";
// 根据数据:如果当前节点的数据有staffId 表示当前节点应该渲染员工名字,否则渲染部门名字
const customLabel = (data: any) => {
if (data.staffId) {
return data.staffName;
}
return data.name;
};
// 根据层级:如果当前节点属于第一级,...
const customLabel = (data: any, node: Node) => {
if (node.level === 1) {
return "xxx";
}
};
</script>

<template>
<!-- value用reactive定义好像有问题? -->
<el-select v-model="value" value-key="id">
<el-option
v-for="item in options"
:key="item.id"
:label="item.label"
:value="item"
/>
</el-select>
</template>
el-form-item 上要写 prop,对应得是 rules 对象内的规则
callback() 表示校验通过,否则校验不会出结果
@click="toggleDark 没有加 (),不加括号时该方法的第一个参数是 event而不是 isDark<template>
<!-- toggleDark() -->
<button @click="toggleDark">
{{ isDark ? "Dark" : "Light" }}
</button>
</template>
<script setup lang="ts">
import { useDark, useToggle } from "@vueuse/core";
const isDark = useDark();
const toggleDark = useToggle(isDark);
</script>

原因是 AxiosResponse 上并没有自己规定返回的一些字段,所以 ts 会报错,所以我们要定义一下类型// compiler-vue.d.ts
import { AxiosRequestConfig } from "axios";
declare module "axios" {
interface AxiosInstance {
(config: AxiosRequestConfig): Promise<any>;
}
}
next() : 放行next('/login') : 中断当前路由去 login在 addRoutes()之后第一次访问被添加的路由会白屏,这是因为刚刚 addRoutes()就立刻访问被添加的路由,然而此时 addRoutes()没有执行结束,因而找不到刚刚被添加的路由导致白屏。因此需要从新访问一次路由才行。
解决方法:next({...to,replace:true})
next({...to,replace:true}) :...to 如果 addRoutes 并未完成,路由守卫会重复执行去,直到 addRoutes 完成,找到对应的路由replace:true 在 to 执行的时候不允许用户点击回退,防止产生异常
routes: [
{
path: "/",
redirect: "/login"
},
{
path: "/login",
name: "login",
component: () => import("@/views/login/login.vue")
},
// url为 /map 会显示PageLayout及子路由map
// 虽然输入 / 重定向到 login ,但是输入 /map 会进入map
{
path: "/",
component: PageLayout,
redirect: "/map",
children: [
{
path: "map",
component: () => import("@/views/map/index.vue")
}
]
}
'/login' 的情况login 的方法

/login 页面,只要一进入就调用 login 方法解决:产生问题的原因可能是由于编译之后,方法名与 router 的 path 名称一致,改掉方法名

const getUserList = async () => {
const res: any = await userList({});
state.userList = res;
};
setTimeout 的延迟时间设置为 0 ,是为了将函数放在异步队列,等同步任务完成才执行setTimeout(() => {}, 0);
const array = [1, 2, 3, 4];
array.forEach((ele) => {
ele = ele * 3;
});
console.log(array); // [1,2,3,4]
const objArr = [
{
name: "wxw",
age: 22
},
{
name: "wxw2",
age: 33
}
];
objArr.forEach((ele) => {
if (ele.name === "wxw2") {
ele.age = 88;
}
});
console.log(objArr); // [{name: "wxw", age: 22},{name: "wxw2", age: 88}]
const changeItemArr = [
{
name: "wxw",
age: 22
},
{
name: "wxw2",
age: 33
}
];
changeItemArr.forEach((ele) => {
if (ele.name === "wxw2") {
ele = {
name: "change",
age: 77
};
}
});
console.log(changeItemArr); // [{name: "wxw", age: 22},{name: "wxw2", age: 33}]
ele,只是forEach给在另一个地方复制创建新元素,是和原数组这个元素没有半毛钱联系的!所以,我们使命给循环拿到的 ele 赋值都是无用功!forEach 的基本原理也是 for 循环,使用arr[index]的形式赋值改变,无论什么就都可以改变了。// 对象的键可以是数字、字符串、变量、symbol,但是都会被转化为字符串
const xx = Symbol("xx");
const name = {
1: "小李",
2: "小虞",
3: "张三",
A: "aa",
[xx]: "王五"
};
console.log(name[1]); // 小李
console.log(name["3"]); // 张三
console.log(name["A"]); // aa
console.log(name.A); // aa
console.log(name[xx]); // 王五
:deep()时,他的父级必须是当前 vue 文件定义的某个选择器,如下列的.my-dialog .my-dialog {
:deep(.el-dialog__header) {
border-bottom: 1px solid #d8d8d8;
}
}
arrTemp 使用了 splice 方法,由于此时赋值的时内存地址,导致 taskData.value 也发生了改变
(local var) error: unknown,或者其他错误。对 Promise 使用 async awiat 时不需要使用 try catch。try {
// ...
} catch (error) {
throw new Error(error);
}
"compilerOptions": {
// ...
"useUnknownInCatchVariables": false,
// ...
}
// iframe
window.parent.postMessage(data, "*");
//父级
window.addEventListener(
"message",
function (e) {
console.log(e);
},
false
);
(top as Window).window.location.href = "url";


/* 去除浏览器input自动填充的默认样式 */
input:-internal-autofill-selected {
/* 这里#fff是底色 */
-webkit-box-shadow: 0 0 0px 1000px #fff inset;
-webkit-text-fill-color: #333;
}
