uniapp——常用逻辑实现

1.上拉加载数据(数据分页)

视图结构:

<view class="list">
	<view v-for="(item,index) in list" :key="index"></view>
</view>

全局变量:

data() {
	return {
        //数据列表
        list:[],
        //分页请求参数对象
		querydata:{
			limit:10,
			page:1
		},
		loadend: false,
		loading: false,
        //加载文本
		loadTitle: '加载更多'
	}
},

加载方法:

//加载数据
getData(){
    if (this.loading) return;
	this.loading = true;
    this.loaded = true;
	this.loadTitle = '';
	getmyitem(this.querydata).then(res => {
		let newlist = res.data.newlist;
		let list = this.$util.SplitArray(newlist, this.list);
		let loadend = newlist.length < this.querydata.limit;
		this.loadend = loadend;
		this.loading = false;
		this.loadTitle = loadend ? '已全部加载' : '加载更多';
		this.$set(this, 'list', list);
		this.$set(this.querydata, 'page', this.querydata.page + 1);
		}).catch(err => {
			this.loading = false;
			this.loadTitle = '加载更多';
	});
},

注意SplitArray方法是自定义的方法,配置到vue的$util实例上

  /*
   * 合并数组
   */
SplitArray(list, sp) {
	if (typeof list != 'object') return [];
	if (sp === undefined) sp = [];
	for (var i = 0; i < list.length; i++) {
		sp.push(list[i]);
	}
	return sp;
},

2.上传图片

这里使用的是uniapp官方的上传组件 uni-file-picker

需要单独进行下载和引入到项目中

视图结构

<view class="example-body">
	<uni-file-picker fileExtname="png,jpg" @delete="del" @select="select" limit="9" file-mediatype="image" mode="grid" title="选择图片" v-model="images">
    </uni-file-picker>
</view>

全局变量

data() {
    return {
		//本地图片数组
		images: [],
        //线上图片数组
        onlineimages:[]
	};
},

更多参数和内置方法参见官方文档,这里使用到的参数和方法:

file-extname:选择文件后缀,字符串的情况下需要用逗号分隔(推荐使用字符串),根据 file-mediatype 属性而不同

@delete:文件从列表移除时触发

@select:选择文件后触发

limit:最大选择个数 ,h5 会自动忽略多选的部分

file-mediatype:选择文件类型,all 只支持 H5 和微信小程序平台    image/video/all

mode:选择文件后的文件列表样式     list/grid

title:组件标题,右侧显示上传计数

其中最重要的就是select和delete方法

// 获取上传状态
	select(e) {
		// console.log(e.tempFilePaths[0]);
		uni.uploadFile({
		url: HTTP_REQUEST_URL + '/api/' + 'upload/image', // 后端api接口
		filePath: e.tempFilePaths[0], // uni.chooseImage函数调用后获取的本地文件路径
		name: 'file', //后端通过'file'获取上传的文件对象
		formData: {
			'user': 'test'
		},
		fileType: 'image',
		header: {
			"Content-Type": "multipart/form-data",
			[TOKENNAME]: 'Bearer ' + store.state.app.token
		},
		success: (res) => {
		    // console.log(res.data);
			let data = JSON.parse(res.data)
			console.log(data.data.url);
            //此处就可以获取到上传图片的线上地址了
            this.onlineimages.push(data.data.url)
		}
	});
},

需要注意的是,这里我们用于展示的是本地的图片地址,当我们想要删除上传列表中的某一张图片时,我们需要将线上的对应图片地址也移除掉,这时候组件原有的delete方法不能够满足我们的需求,因此我们需要更改以下组件的内置方法。

 找到图片中组件位置

 按照图上进行delete方法进行修改,添加一个index也就是所选图片的索引作为提交值,然后我们就可以根据index对线上图片数组进行删除

//删除图片
del(e){
	console.log(e);
	this.onlineimages.splice(e.index,1)
},

### UniApp 面试常见问题及解答 #### 1. 什么是 UniAppUniApp 是一个基于 Vue.js 的跨平台应用开发框架,允许开发者使用 Vue.js 开发语法编写一次代码,并能编译生成适用于多个平台(如 iOS、Android 和 H5)的应用程序[^1]。 #### 2. 描述 UniApp 的主要特性是什么? - **跨平台支持**:能够利用同一套代码库构建多端应用程序,减少重复劳动。 - **高性能体验**:采用原生渲染技术,提供接近于原生应用级别的性能表现。 - **开放生态系统**:兼容各种原生插件以及第三方 SDK,增强应用的功能性和灵活性。 - **简便易用的开发环境**:配备了一系列实用组件和工具链来加速项目进展并简化调试过程。 #### 3. 解释 UniApp 生命周期钩子函数及其执行顺序 在 UniApp 应用中存在一系列特定阶段触发的方法称为生命周期钩子。这些钩子按照如下次序被调用: - `onLaunch` : 当 App 初始化完成时触发; - `onShow` :每次启动或从前台切换回前台显示时都会触发此事件; - 页面级钩子: - `beforeCreate`: 实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 - `created`: 完成实例的数据绑定后立即调用。 - `mounted`: el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。 - ... 更多功能页面级别钩子详见官方文档说明。 #### 4. 如何自定义 UniApp 组件? 要创建一个新的自定义组件,在 `.vue` 文件内需定义三个基本组成部分——模板 (`<template>`), JavaScript逻辑(`<script>`) 及 CSS样式(`<style>`)[^2]。 ```html <!-- MyComponent.vue --> <template> <!-- HTML结构 --> </template> <script> export default { name: 'MyComponent', props: {}, data() { return {}; }, } </script> <style scoped> /* 样式 */ </style> ``` #### 5. 数据请求与处理方式 对于网络请求操作,推荐使用内置 API 函数 `uni.request()` 来发起 HTTP 请求;它接受对象参数作为配置项,其中可指定 URL 地址、HTTP 方法类型以及其他选项等[^3]。 ```javascript // 发送 GET 请求获取远程资源 uni.request({ url: 'https://api.example.com/data', method: 'GET', success(res) { console.log('成功:', res.data); }, fail(err) { console.error('失败:', err); } }); ``` #### 6. 怎样实现简单的本地数据缓存机制? 为了提高用户体验效率,可以通过调用 `uni.setStorageSync(key, value)` 将常用数据保存至客户端本地存储空间里,以便后续快速读取而不必每次都重新加载服务器上的相同信息。 ```javascript const key = "userProfile"; const userProfileData = {name:"张三", age:28}; try{ // 设置同步缓存 uni.setStorageSync(key,userProfileData); }catch(e){ console.warn("设置缓存错误:",e.message); } // 获取已存在的缓存数据 let cachedUserProfile; try{ cachedUserProfile=uni.getStorageSync(key); } catch(e){ console.warn("读取缓存错误:", e.message); } console.info(cachedUserProfile); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码越写越饿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值