感謝 遺忘的過路人 這位博主,發現了 高階前端進階(一) 中的list轉樹形資料的問題。當然也是我的疏忽。抱歉!!!
一、解決問題
復現一下問題
將list資料不按id順序排序,將之打亂
// list資料
[
{
id: 4, pid: 1, name: "二級資料2-1"
},
{
id: 5, pid: 1, name: "二級資料2-2"
},
{
id: 6, pid: 1, name: "二級資料2-3"
},
{
id: 1, pid: 0, name: "一級資料1"
},
{
id: 2, pid: 0, name: "一級資料2"
},
{
id: 3, pid: 0, name: "一級資料3"
},
{
id: 7, pid: 3, name: "三級資料3-1"
},
{
id: 8, pid: 3, name: "二級資料3-2"
},
{
id: 9, pid: 8, name: "三級資料3-1"
}
]
使用listToArray方法得到的資料便會出現問題。
解決方法:
listData.sort((a, b) => { return Number(a[idMap]) - Number(b[idMap]) });
對,就是這一行程式碼。加上這一行程式碼,便解決了。
引發的思考
之前的方法,只要進行一次遍歷即可,然而現在發現,之前的方法的前提是資料已經是排好序的。
如果錯亂了呢?那不得不進行一次sort排序。這樣的話,不還是兩次遍歷了嗎?(加上了一次sort排序遍歷)
再次分析一下原理
我們知道,核心原理就是這個東西 itemMap[id] = item; 將list資料以物件的屬性跟值儲存,方便獲取。
一次遍歷的話,給物件itemMap新增屬性的同時獲取其父親節點,如果順序錯亂的話,自然就會出現問題了。
二、解析URL中的引數
此方法針對vue專案hash路由模式
// http://localhost:9090/#/test/url?id=34&name=%E6%86%A8%E6%86%A8
function getUrlParams() {
let index = window.location.href.indexOf('?');
let urlSearchParams = new URLSearchParams(window.location.href.slice(index + 1));
let params = Object.fromEntries(urlSearchParams.entries());
return params;
}
三、CSS3過渡跟動畫
這兩者的區別,很簡單,
過渡就是字面上意思,比如,寬度從1px,慢慢增加到10px,這便是一種過渡;
動畫,也是字面上意思,不過跟過渡最大的區別就是最終的狀態,不管執行了什麼動畫,最終的狀態會還原,比如說寬度從1px,慢慢增加到10px,動畫結束後,會還原到1px。
舉幾個例子,舉一反三即可。
1、過渡屬性:
transition: width 1s linear 2s;
// 等價於
transition-property: width;
transition-duration: 1s;
transition-timing-function: linear;
transition-delay: 2s;
例項(滑鼠懸浮在div上,3秒後,寬度從150px,2秒的時間均勻增長到400px,然後停止)
div {
width: 150px;
height: 100px;
background: blue;
transition: width 1s linear 3s;
}
div:hover {
width: 400px;
}
2、動畫屬性
animation-name: myfirst;
animation-duration: 5s;
animation-timing-function: linear;
animation-delay: 2s;
animation-iteration-count: infinite;// 動畫迴圈次數,永久
animation-direction: alternate;// 動畫一個週期結束後,倒序播放,正常是 normal
animation-play-state: running;
// 等價於
animation: myfirst 5s linear 2s infinite alternate;
// 動畫名稱的兩種寫法
@keyframes myName1 {
from {
background: red;
}
to {
background: yellow;
}
}
@keyframes myName2 {
0% {
background: red;
}
50% {
background: green;
}
100% {
background: blue;
}
}
例項(div的背景顏色從紅色->綠色->藍色,藍色->綠色->紅色,無限迴圈)
div
{
animation: myfirst2 5s linear 2s infinite alternate;
}
四、事件匯流排
我們知道JavaScript中的,apply,call,bind的使用及其區別。
有個地方便用到了,就是事件匯流排。
首先,簡述一下原理。
其實很簡單的。
先申明一個物件bus,其中的物件用來儲存事件名稱,其值用來儲存需要執行的方法。emit傳送事件的時候,給bus新增事件名稱跟方法,on則接收事件名,來觸發對應的方法。
很簡單吧!
程式碼如下:
class EventBus {
constructor() {
this.bus = {};
}
$on(busName, fn) {
if (this.bus.hasOwnProperty(busName)) {
console.log('該事件名已訂閱過');
return;
}
this.bus[busName] = fn;
}
$emit(busName, ...args) {
this.bus[busName].apply(null, args);
}
$off(busName) {
delete this.bus[busName]
}
}
看完程式碼,你一定很懵,這,這,這,也太簡單了吧!的確是這樣。以上就是最簡單的事件匯流排程式碼。我本人也使用這個,畢竟簡單、粗暴。
學習技術要執著,但也不能太執著!