1.动态图标路径
这样设计的原因:因为每个侧边栏选项的对象都有一个 iconUrl 属性,本身是直接渲染为 ant-icon标签的,但是这里我们用的 element,所以选择使用 img 来代替,并且把图标本地存储,所以需要设置动态的路径!
<el-submenu v-if="itemObj.childList.length" :index="indexObj.toString()">
<template slot="title">
<img
v-if="itemObj.iconUrl"
:src="getIcon(itemObj.iconUrl)"
style="margin-right:5px"
/>
<span>{{ itemObj.title }}</span>
</template>
<el-menu-item
v-for="(item, index) in itemObj.childList"
:key="index"
:index="indexObj + '-' + index"
@click="() => handle(item)"
>
{{ item.title }}
</el-menu-item>
</el-submenu>
getIcon(url) {
return new URL(`../../assets/images/navIcon/${url}.jpg`, import.meta.url)
.href;
}
URL 对象:为啥这里构造链接返回的是一个 URL 对象的 href 属性呢?——> 其实本质上直接字符串拼接也是可以的!
在 JavaScript 中,使用 URL 对象的写法通常是为了更方便地处理和操作 URL 路径。使用 URL 对象相比直接使用字符串有一些优势:
统一的 API:URL 对象提供了一组用于处理 URL 的标准 API,例如 searchParams 属性可以方便地获取和修改 URL 中的查询参数,pathname 属性可以获取 URL 的路径部分等等。这些 API 可以帮助开发者更轻松地对 URL 进行解析和处理。
安全性:使用 URL 对象可以帮助避免手动拼接 URL 时引入的错误和安全漏洞。URL 对象会自动处理 URL 的编码和格式化,确保生成的 URL 是符合规范的。
相对路径处理:URL 对象对于相对路径的处理更加灵活。在处理相对路径时,它会根据当前页面的 URL 来解析相对路径,确保得到正确的绝对路径。
扩展性:URL 对象支持很多附加的方法,例如 URLSearchParams 对象用于处理 URL 中的查询参数,URL.createObjectURL 用于生成 Blob URL 等。这些功能在特定场景下非常有用。
虽然在某些情况下,直接使用字符串来表示 URL 也是可以的,但使用 URL 对象更为推荐,特别是在处理复杂的 URL 操作时,这样可以更清晰地表达代码的意图,减少错误,并且提供更多便利的功能。
const url = new URL("https://example.com/search?query=keyword&page=1");
// 获取查询参数部分的URLSearchParams对象
const searchParams = url.searchParams;
// 获取单个查询参数的值
const keyword = searchParams.get("query");
const page = searchParams.get("page");
2.el-popover 弹出框和 el-tooltip 文字提示的使用策略
el-popover 弹出框
里面必须用插槽 slot="reference",最好是写 el-button,普通标签一般不可以!否则里面无法渲染内容
<el-button slot="reference"> </el-button>
el-tooltip 文字提示
el-tooltip 文字提示 里面必须有标签,不能直接写内容,否则里面无法渲染内容 3.支付轮询
4.input 框的输入值对 tree 过滤时进行防抖处理
//放在最外层即可(可以不写在export default里面)
const debounce = (function() {
let timer = 0;
return function(func, delay) {
clearTimeout(timer); //再次触发就重启定时器
timer = setTimeout(func, delay);
};
})();
// 点击搜索
searchTreeData() {
let val = this.filterAgentTextClass;
if (this.showAgentDropDown) {
this.isShowTree = false;
//防抖处理函数
debounce(() => {
this.isShowTree = true;
this.$nextTick(()=>{ //更新isShowTree这个变量之后再进行操作
this.$refs.agentClassTree.filter(val);
})
}, 300);
if (val != "") {
this.$set(this.agentTreeData[0], "disabled", true); //如果没有输入值,那么就让整个树都无法被选择
} else {
this.isExpand = false;
this.$set(this.agentTreeData[0], "disabled", false); //如果有输入值,那么就让整个树可以被选择
}
}
},
注意:这里的 tree 数据结构,是我们自己新增了一个全选的根节点
let tree = [
{
title: "全选",
children: CampusTree,
key: "whole10000",
},
];
this.agentTreeData = tree;
5.$nextTick 的使用场景
明确:vue 中的 data 赋值是异步的
在Vue.js中,data赋值是异步的。当您在Vue组件中修改data
中的值时,Vue会将这些修改操作放入一个队列中,在下一个事件循环中执行。这样做是为了优化性能,避免不必要的DOM更新,以及在同一事件循环中频繁更新DOM导致的性能问题。
Vue中的数据响应式更新是通过使用Object.defineProperty
来实现的,它会将data中的每个属性转换为getter和setter,这样当属性被读取或修改时,Vue可以捕获这些操作并触发相应的更新。
因为数据更新是异步的,所以在同一事件循环中多次修改同一个属性,Vue会合并这些修改,只触发一次更新。这样可以减少不必要的DOM操作,提高性能。
如果您需要在data赋值后立即获取最新的数据,可以使用this.$nextTick()
方法,该方法会在DOM更新之后执行回调函数,确保在数据更新后获取到最新的值。
以下是一个示例说明异步的情况:
<template>
<div>
<p>{{ message }}</p>
<button @click="changeMessage">Change Message</button>
</div>
</template>
<script>
export default {
data() {
return {
message: "Hello",
};
},
methods: {
changeMessage() {
this.message = "Updated Message";
console.log(this.message); // 打印的可能是 "Hello" 或 "Updated Message"
this.$nextTick(() => {
console.log(this.message); // 打印的是 "Updated Message"
});
},
},
};
</script>
在上述代码中,当点击按钮Change Message
时,this.message
的值会被异步修改。在this.message = "Updated Message";
这行代码后立即打印this.message
的值,可能是"Hello"或"Updated Message",因为数据更新是异步的。而在this.$nextTick()
的回调函数中,this.message
的值会确保是"Updated Message",因为在这个时候DOM已经更新完毕。
6.让 nowarp 的文本向左溢出的策略direction: rtl;
width: 20%;
white-space: nowrap;
text-align: right;
padding-left: 10px;
direction: rtl; /*direction: rtl;将文本方向设置为从右向左,从而实现文字向左溢出*/
注意:direction: rtl;会影响伪类元素:before和:after的位置,会进行交换
并且direction: rtl;只能作用于块级元素如 div 等
7.empty-text在表格里面不生效
注意:empty-text属性是用在 table 上面的,而不是用在el-table-column上的,而且只是指示整体没有数据,而不是某一列!
表格里面一边只能|| "-"这样才可以!
8.concat 和…运算符对比
concat()
方法是用于合并多个数组或值,它创建一个新的数组并将合并后的元素添加到新数组中。在合并多个数组时,concat()
方法的性能可能会受到合并数组数量的影响。如果需要合并多个数组,concat()
方法会创建一个新的数组,并将所有合并后的元素逐个添加到新数组中,因此在合并大量数组时,可能会导致性能下降。
扩展运算符(...
)是ES6中的一个语法特性,可以用于将数组展开为单独的元素。对于合并多个数组,扩展运算符通常比concat()
方法更为简洁,并且不会创建新的数组。它只是将多个数组的元素展开,并将它们直接插入到一个新的数组中。这可能在一些场景下更高效。