問題描述:
用vue封裝一個swiper組件的時候,發現輪播圖不能輪播了。
原因:
異步請求的時間遠大於生命周期執行的時間,mounted初始化DOM時數據未返回,渲染數據是空數組,導致輪播圖的容器層寬度為0,渲染輪播圖不能滾動。
解決思路:
數據返回之后再做初始化操作。
解決方法:
一、容器沒有寬度,就想着給容器設置一個寬度,但是一旦設置死數據了后期維護起來很麻煩。
二、設置一個定時器,延長等待的時間,但是無法確定網絡請求的時間,這樣操作嚴么會等待時間過長,影響用戶體驗,要么是還沒有請求完就去獲取數據,這樣依然是不行。
三、vue提供了一個全局API,Vue.$nextTick(),它的作用是獲取數據更新后最新的DOM結構。$nextTick()是同步的,但是里面的回調是異步的。底層是MutationObserver或setTimeout(fn,200)。
在react中map方法遍歷必須要加key值
setState是異步的:
this.setState()會調用render方法,但並不會立即改變state的值。state是在render方法中賦值的,所以在this.setState()執行后立即獲取state值是不變的。直接修改state值並不會觸發更新,因為沒有觸發render函數。
組件卸載之前,加在dom元素上的監聽事件和定時器必須要手動清除,它們不屬於react控制范圍內。