uni-app | Подтягивающая загрузка и раскрывающееся обновление

uni-app
uni-app | Подтягивающая загрузка и раскрывающееся обновление

Vue Ecology — мультитерминальное решение с единым приложением

Время обновления 09:26, 2021

Поскольку этот документ занимает высокие позиции в поисковых системах, он обновляется по принципу решения проблем для всех.

это мой гитхабgithubУказанные ниже адреса могут быть недействительными.

Выпадающее обновление экологии единого приложения Исходный код

<template>
	<!-- <view class="content">
		<image class="logo" src="/static/logo.png"></image>
		<view class="text-area">
			<text class="title">{{title}}</text>
		</view>
		<view class="">
			123
		</view>
	</view> -->
	<view class="content">
		<ItemComp :item="item" v-for="(item,index) in list" :key="index" />
		<!-- 底部文案 -->
		<view class="">
			<text >{{status === 'more' ? contentText.contentdown : (status === 'loading' ? contentText.contentrefresh : contentText.contentnomore)}}</text>
		</view>
	</view>
</template>

<script>
	import ItemComp from '../../components/item.vue'
	
	export default {
		data() {
			return {
				title: 'Hello',
				url:`https://reqres.in/api/users`,
				list:[],
				page:1,
				per_page:10,
				status:'more', // 默认展示上拉显示更多
				contentText:{
					contentdown: "上拉显示更多",
					contentrefresh: "正在加载...",
					contentnomore: "没有更多数据了"
				}
			}
		},
		components:{
			ItemComp
		},
		onShow() {
			this.page =1
			this.per_page = 10
			this.list = []
		},
		onLoad() {
			// 页码归为第1页
			this.page = 1
			// 初始化获取列表数据
			this.fetchData()
		},
		// 下拉刷新触发
		onPullDownRefresh(val){
			this.page = 1
			this.per_page = 10
			console.log('下拉刷新',val)
			this.fetchData().then(()=>{
				uni.stopPullDownRefresh();
			}).catch(err=>{
				uni.stopPullDownRefresh();
				// 弹窗提示
				uni.showToast({
									title: '请求出错了',
									icon: 'none'
								})
			})
		},
		// 上拉加载触发
		onReachBottom(){
			// 改变状态为加载中
			this.status = 'loading'
			// 页码发生变化
			++this.page
			// 加载更多
			this.fetchData('loadMore').then(resArray=>{
				// 此时判断当前有没有请求到数据
				if(resArray.length){
					this.status = 'more'
					
				}else{
					this.status = 'noMore';
					--this.page;
				}
			}).catch(err=>{
				console.log('网络请求失败')
			})
		},
		methods: {
		 	fetchData(way){
				return new Promise((resolve,reject)=>{
					uni.request({
						url:this.url,
						data:{
							page:this.page,
							per_page:this.per_page
						},
						success: (res) => {
							console.log(res)
							// 当页的数据
							const resDataArray = res.data.data
							if(way==='loadMore'){
								this.list = this.list.concat(resDataArray)
							}else{
								this.list = resDataArray
							}
							// 抛出当页的数据
							resolve(resDataArray)
						},
						fail(err) {
							console.log('接口调用失败',err)
							// 抛出异常
							reject()
						}
					})
				})
				
			}
		}
	}
</script>

<style>
	/* .content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	} */

	.content{
		width: 100%;
	}
	
</style>


Потяните страницу списка вверх, чтобы загрузить больше, потяните вниз, чтобы обновить эффект

Легко реализуйте загрузку с подтягиванием, обновление с раскрывающимся списком и возврат наверх

добиться эффекта

demo.gif

Предварительная подготовка

внутренний интерфейс

В этом небольшом случае мы используем открытый исходный кодjsonplaceholder, который также является тестовым интерфейсом, обычно используемым в нашем внешнем интерфейсе.Для того, чтобы добиться эффекта небольшой демки, используйте пока это, а потом замените на douban-api

даже нам не нужноmockинтерфейс, а самое главное — поддержка分页запрос, параметры запроса

  • offset
  • limit

Те, кто написал предысторию, должны быть правы насчет этих двух字段не чужой,offsetдаКомпенсироватьзначит, это вnestНа официальном сайте также упоминается

{
    "page":1,
    "limit":10
}

При запросе аналогично этому информация пройденной страницы, но параметры которые мы вводим

{
    "_offset":xx, // 其中xx 代表的是第几页
    "_limit":xx  // 其中xx 代表的是每页多少条数据
}

Ниже вводим в адресную строку браузера (или используем плагин postman|postwoman|Vscode)https://jsonplaceholder.typicode.com/posts

Возвращаемый результат:

[
  {
    "userId": 1,
    "id": 1,
    "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
  },
  {
    "userId": 1,
    "id": 2,
    "title": "qui est esse",
    "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
  },
  {
    "userId": 1,
    "id": 3,
    "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut",
    "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
  }
]
……

Затем делаем подтягивание, чтобы загрузить больше.Самое главное, что номер страницы каждый раз меняется

_offset++;

API сетевых запросов единого приложения

На официальном сайте четко указано, что мы можем пройтиuni.request(OBJECT), который передается в объекте конфигурации, стоит отметить, что по умолчаниюGETпросить

uni.request({
  url: "https://jsonplaceholder.typicode.com/posts", //请求的地址

  success: res => {
    console.log(res);
  }
});

Товар предмет

Мы знаем, что при разработке фронтенда по бэкендуlistгенерация циклаitemэлемент является очень распространенным бизнес-требованием, то следующее上拉加载更多а также下拉刷新. Итак, в этом небольшом случае мы используем卡片макет. Рекомендуется всем, кто официально обслуживаетсяhello-uniapp

  • гитхаб передача, который поддерживает множество общих эффектов. Здесь мы стараемся изо всех силcloneПоследний код, потому что он все еще очень часто обновляется, в основном для решения некоторых проблем на разных устройствах.bug

20200216125554.png

Do it

  • Получить данные асинхронно
	// 异步获取列表数据
getDataList() {
    uni.request({
        url: 'https://jsonplaceholder.typicode.com/posts', //仅为示例,并非真实接口地址。

        success: (res) => {
                console.log(res)
        }
    });
},

20200216141516.png

В этом случае получаются все данные, которые не соответствуют спецификации в реальной разработке.

  • Внедрить плагины

Как правило, мы ожидаем, что при зацикливании данных списка будет下拉刷新так же как下拉加载Лучше всего иметь эффект возвращения в топ.В данный момент мы используем стороннюю библиотеку.Я думаю, что она по-прежнему очень проста в использовании.

Изысканная инфраструктура js с выпадающим обновлением и подтягивающей загрузкой.Поддержка vue, идеальная работа в мобильных и основных браузерах ПК.В настоящее время количество звезд2.8K

Его также можно использовать в других решениях для разработки, конечно, естьuniappверсии, прежде чем использовать ее, давайте взглянем на раздел макета структуры


	 <mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption" >
		 <view v-for="(item,index) in dataList" :key="`item${index}`">  </view>
	 </mescroll-body>

в

свойство или метод имея в виду
ref="mescrollRef" Апплет ByteDance ref="mescrollRef" должен быть настроен
@init="mescrollInit" должен быть настроен
@down="downCallback" должен быть настроен
@up="upCallback" должен быть настроен
:down="downOption" Общие конфигурации для раскрывающегося обновления
:up="upOption" Общие конфигурации для вытягивания загрузки

Так как нам нужно использовать этот эффект во многих местах проекта, мы просто вводим его глобально и регистрируем как глобальный компонент

// 在main.js注册全局组件
import MescrollBody from "@/components/mescroll-uni/mescroll-body.vue";
import MescrollUni from "@/components/mescroll-uni/mescroll-uni.vue";
Vue.component("mescroll-body", MescrollBody);
Vue.component("mescroll-uni", MescrollUni);
  • Конфигурация страниц.json
{
		"path": "pages/findMovie/findMovie",
		"style": {
			"navigationBarTitleText": "找片",
			"enablePullDownRefresh": false,
			"app-plus": {
				"bounce": "none" //删除此项: mescroll-body支持iOS回弹
			}
		}
	},

Есть два основных метода

метод имея в виду
upCallback(page) Подтягивающий обратный вызов загрузки
downCallback() потянуть вниз обратный вызов обновления

Прежде чем перейти к следующей части, нам нужно знать данные, возвращаемые интерфейсом.总页数Как рассчитать, то есть данные, возвращаемые интерфейсом, обычно возвращаютtotal

Math.ceil(5 / 2);
Math.ceil(26 / 10);
Math.ceil(100 / 10);
Math.ceil(20 / 4);

20200216162252.png

  • основной код
/*上拉加载的回调*/
upCallback({num,size}) {
// console.log(num,size) // 1,10
uni.request({
    url: `https://jsonplaceholder.typicode.com/posts`,
    data: {
        _offset: num,
        _limit: size
    },
    success: (data) => {
        // 接口返回的当前页数据列表 (数组)
        let curPageData = data.data;
        // 接口返回的当前页数据长度 (如列表有26个数据,当前页返回8个,则curPageLen=8)
        let curPageLen = data.data.length;
        // 接口返回的总页数 (如列表有26个数据,每页10条,共3页; 则totalPage=3)
        let totalPage = Math.ceil(100/size); // 向上取正
        // 接口返回的总数据量(如列表有26个数据,每页10条,共3页; 则totalSize=26)
        let totalSize = 100;
        // 接口返回的是否有下一页 (true/false)
        // let hasNext = data.xxx;

        //设置列表数据
        if (this.mescroll.num == 1) this.dataList = []; //如果是第一页需手动置空列表
        this.dataList = this.dataList.concat(curPageData); //追加新数据

        // 请求成功,隐藏加载状态
        //方法一(推荐): 后台接口有返回列表的总页数 totalPage
        this.mescroll.endByPage(curPageLen, totalPage);

        //方法二(推荐): 后台接口有返回列表的总数据量 totalSize
        //this.mescroll.endBySize(curPageLen, totalSize);

        //方法三(推荐): 您有其他方式知道是否有下一页 hasNext
        //this.mescroll.endSuccess(curPageLen, hasNext);
    },
    fail: () => {
        //  请求失败,隐藏加载状态
        this.mescroll.endErr()
    }
})
},

напиши в конце

оuniapp-douban-movieЭтот проект представляет собой мультитерминальное решение, основанное на экологии Vue, которую автор продолжает обновлять и поддерживать.uniappперсональный учебный проект, некоторые потребности, возникающие при фактическом развитии, будут решены в этом небольшом проекте Есть несколько особенностей

  • Время обновления неизвестно
  • Код будет синхронизирован с github.
  • подражать как можно больше豆瓣电影的UI

модуль

название эффекта разное
В проекте страница списка подтягивается, чтобы загрузить больше, и тянется вниз, чтобы обновить эффект.

Если это весело, дайте ему星星 код синхронизации здесь


Although it is over, thank you