Несколько дней назад я поделился самодельным опенсорсным проектом по расширению небольших программных компонентов (портал)
Изначально я хотел обмануть звезду за первый выпущенный мной открытый исходный код, в итоге статья понравилась многим добросердечным друзьям, что меня немного смутило, поэтому я решил написать несколько сухих вещей, чтобы рассказать о том, как это было реализовано.
На самом деле он относительно прост, в первую очередь под кастомный компонентscroll-viewУстанавливается выше, чем высота самого компонента40px, то есть высоту области, где заголовок отображает обновленный текст, а затем пустьscroll-viewсмещение по оси Y-40px, чтобы обновленная текстовая область не была видна вверху, конкретный css выглядит следующим образом:
.scroll-view {
height: calc(100% + 40px);
transform: translateY(-40px);
}
Затем мониторингscroll-viewизonscrollСобытия, здесь я делю статус выпадающего обновления на пять типов:
//这段偷懒没写在代码里,直接用的数字
const _pullDownStatusDic = {
invisiable: 0, //看不见
pulling: 1, //下拉时
release: 2, //可松开刷新时
refresing: 3, //正在刷新
finish: 4, //刷新完成
}
Затем в прослушивателе событий в соответствии с текущимscrollTopЧтобы определить, в каком состоянии он должен находиться:
//height就是预设的下拉至多少高度时刷新
if (scrollTop < -1 * height) {
targetStatus = 2;
} else if (scrollTop < 0) {
targetStatus = 1;
} else {
targetStatus = 0;
}
Вопрос в том, когда он будет обновлен? апплетscroll-viewнисколькоonscrollendЭто событие, так я думалontouchend, в конце концов, вы можете использовать касание только для прокрутки на мобильных телефонах (кроме нажатия на голову, чтобы вернуться наверх), поэтому вам нужно толькоontouchendПрослушайте событие, если текущее состояние раскрывающегося списка равно 2 (_pullDownStatusDic.release), то есть при выпуске обновляемого активируется обновление:
if (status === 2) {
this.setData({
pullDownStatus: 3,
})
this.properties.refreshing = true,
this.triggerEvent('pulldownrefresh');
}
Конечно, на данный момент все еще есть проблема, нам нужно отображать текст обновления локально, мы не можем этого сделать.scroll-viewизscrollTopустановлено отрицательное число, поэтому толькоscroll-viewСмещение по оси Y оси Y отменяется для решения (проблема в том, что будет отскок при отпускании, и вы найдете способ его оптимизировать позже)
После завершения обновленияscroll-viewСмещение по оси Y возвращается с помощью анимации CSS.-40px(использоватьtranslateвместоmarginПросто для плавности анимации здесь) это завершает выпадающее обновление.
Разве это не просто :)
Так же есть мелкие детали, загрузки больше, иxing-imageНекоторые реализации проще, если интересно, можете посмотреть исходный код.
Наконец обмануть волну звезд:View on Github