uniapp 开发笔记

视频教程:P01-项目基本介绍_哔哩哔哩_bilibili

1、pages.json pages 配置说明

2、字体小于12px设置,下方示例为10px字体

{
		font-size: 20px;
		transform: scale(0.5); //缩放
	}

3、uniapp 强制修改原生组件的样式

	/deep/ .u-tabs__wrapper__nav{
		justify-content: center;
	}

4、内部元素为一行

display: flex;
flex-flow: row nowrap;

5、固定在屏幕底部

width: 100%;
position:fixed;
bottom: 0;

6、springcloud允许跨域访问

gateway网关yml配置文件中配置

spring: 
  cloud:
    gateway:
      default-filters:
        - DedupeResponseHeader=Access-Control-Allow-Origin, RETAIN_UNIQUE
      globalcors:
        corsConfigurations:
          '[/**]':
            # 允许携带认证信息
            allow-credentials: true
            # 允许跨域的源(网站域名/ip),设置*为全部
            allowedOriginPatterns : "*"
            # 允许跨域的method, 默认为GET和OPTIONS,设置*为全部
            allowedMethods: "*"
            # 允许跨域请求里的head字段,设置*为全部
            allowedHeaders: "*"

7、前端请求封装,token 和 用户信息保存

common下创建文件config.js

uni.$u.http.setConfig((config) => {
    /* config 为默认全局配置*/
    config.baseURL = `http://localhost:8080`; /* 根域名 */
    return config
})

store下创建index.js

//引入vue和vuex
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

const store = new Vuex.Store({//全局变量定义
    state: {
        forcedLogin: false,//是否需要强制登录
        hasLogin: false,
        userName: "",
        userId:'',
        token:'',
        pointId:'',
    },
    mutations: {
        login(state, user) {
            state.userName = user.username || '';
            state.hasLogin = true;
            state.userId = user.id || '';
            state.token = user.token || '';
        },
        logout(state) {
           state.userName = "";
           state.hasLogin = false;
           state.userId = '';
           state.token = '';
        }
    }
})
export default store

main.js

import config from '@/common/config.js';

import store from "./store"
Vue.prototype.$store = store 


const app = new Vue({
	store,
    ...App
})

login.vue

<script>
	import{
		mapState,mapMutations //先导入mapState方法
	} from 'vuex'
	
	export default {
		computed:mapState(['forcedLogin','hasLogin','userName']),//对全局变量进行监控

        methods: {
			...mapMutations(['login']),



            //登录成功后
            this.login(res.data.data)
            //随后 store/ index.js  文件中的login方法会把传过来的用户数据保存在vuex

</script>

token获取

在vue文件中使用   取值,比如其中的token,可以使用‘this.$store.state.token’这样来取。

在js文件中使用 

1、import store from '../../store' 先引用

2、store.state.token  取值 

8、设置列表,消息通知列表组件

uni-list 列表 - DCloud 插件市场

9、自定义返回页面

//自定义返回页面
		onBackPress(options) {
			console.log('from:' + options.from)
			uni.switchTab({
				url: '/pages/tabbar-1/tabbar-1'
			});
			return true
		},

10、需要登录的模块,登录成功后跳转到目标页面,返回可以自动返回到原上级路由

//登录成功后,用redirectTo 跳转,不保留当前页面
uni.redirectTo({
	url: storeRedirectPage
});

11、页面每次打开时执行

onShow() {
}

12、富文本组件

13、u-tabbar被u-sticky遮挡

	/deep/ .u-tabbar {
		z-index: 980;
		position: relative;
	}

14、滑动分页、下拉刷新

uview原生版:

pages.json

"enablePullDownRefresh": true, //开启下拉刷新

template:

<u-loadmore :status="status" />

data()

status: 'loadmore',
noResult: false,//分页获取到的数据是否为空
pageNum: 1,
comList: []

export default

//下拉到底触发事件
		onReachBottom() {
			if (this.noResult) {
				this.status = 'nomore';
				return;
			}
			this.status = 'loading';
			this.pageNum = ++this.pageNum;

			this.getDataList()
		},
		//下拉刷新事件
		onPullDownRefresh() {
			this.pageNum = 1
			this.comList = []
			this.getDataList();
		},
        onShow() {
			this.comList = []
			this.getDataList();
		},

methods

//获取帖子列表
			getDataList() {
				// 基本用法,注意:get请求的参数以及配置项都在第二个参数中
				uni.$u.http
					.get('/community/postManage/appPostList', {
						params: {
							pageNum: this.pageNum,
							pageSize: 10
						}
					})
					.then(res => {
						let size = res.data.rows.length
						if (size < 10 || size == 0) {
							this.noResult = true
						}
						for (var i = 0; i < size; i++) {
							this.comList.push(res.data.rows[i]);
						}
						uni.stopPullDownRefresh()
					})
					.catch(err => {});
			},

封装组件版:

【z-paging下拉刷新、上拉加载更多】超简单、低耦合!仅需两步轻松完成完整分页逻辑 - DCloud 插件市场

15、顶部滑动背景色渐变

=====================
<!-- 顶部背景色渐变 -->
<view class="title-bg" :style="bgcolor"></view>

=====================
bgcolor: '',
=====================
onPageScroll(e) {
			if (e.scrollTop >= 0 && e.scrollTop <= 8) {
				this.bgcolor = 'opacity:0';
			} else if (e.scrollTop > 8 && e.scrollTop <= 16) {
				this.bgcolor = 'opacity:0.1';
			} else if (e.scrollTop > 16 && e.scrollTop <= 24) {
				this.bgcolor = 'opacity:0.2';
			} else if (e.scrollTop > 24 && e.scrollTop <= 32) {
				this.bgcolor = 'opacity:0.3';
			} else if (e.scrollTop > 32 && e.scrollTop <= 40) {
				this.bgcolor = 'opacity:0.4';
			} else if (e.scrollTop > 40 && e.scrollTop <= 48) {
				this.bgcolor = 'opacity:0.5';
			} else if (e.scrollTop > 48 && e.scrollTop <= 56) {
				this.bgcolor = 'opacity:0.6';
			} else if (e.scrollTop > 56 && e.scrollTop <= 64) {
				this.bgcolor = 'opacity:0.7';
			} else if (e.scrollTop > 64 && e.scrollTop <= 72) {
				this.bgcolor = 'opacity:0.8';
			} else if (e.scrollTop > 72 && e.scrollTop <= 80) {
				this.bgcolor = 'opacity:0.9';
			} else if (e.scrollTop > 80) {
				this.bgcolor = 'opacity:1';
			}
		},
=====================

.title-bg {
		width: 100%;
		height: 100px;
		position: absolute;
		background-color: #FFB501;
		opacity: 0;
		top: -45px;
	}
=====================

16、跨页面传json参数

父页面

uni.navigateTo({
					url: '/pages/components/comment-details/comment-details?data=' +
						encodeURIComponent(JSON.stringify(item))
				});

目的页面

onLoad: function(option) { //option为object类型,会序列化上个页面传递的参数
			const data = decodeURIComponent(option.data);
			this.comment = JSON.parse(data);

		},

17、版本升级组件

APP版本更新、强制更新、静默更新、下载进度(wgt更新) - DCloud 插件市场j

1.导出组件依赖文件

2.config下创建componentConfig.js

/**** 此文件说明请看注释 *****/
// 可以用自己项目的请求方法
// 请求配置说明:https://ext.dcloud.net.cn/plugin?id=822
/**** 结束 *****/
const platform = uni.getSystemInfoSync().platform;
export default {
	// 发起ajax请求获取服务端版本号
	getServerNo: (version, isPrompt = false, callback) => {
		let httpData = {
			version: version.versionCode,
			// 版本名称
			versionName: version.versionName,
			// setupPage参数说明(判断用户是不是从设置页面点击的更新,如果是设置页面点击的更新,有不要用静默更新了,不然用户点击没反应很奇怪的)
			setupPage: isPrompt
		}; 
		if (platform == "android") {
			httpData.type = 1101;
		} else {
			httpData.type = 1102;
		}
		/* 接口入参说明
		 * version: 应用当前版本号(已自动获取)
		 * versionName: 应用当前版本名称(已自动获取)
		 * type:平台(1101是安卓,1102是IOS)
		 */
		/****************以下是示例*******************/
		// 可以用自己项目的请求方法(接口自己找后台要,插件不提供)
		uni.$u.http
			.get('/system/appManage/latestVersion', {
				params: {
					type: httpData.type
				}
			})
			.then(res => {
				if (res.data.code == 200) {
					res = res.data.data
					/* res的数据说明
					 * | 参数名称        | 一定返回     | 类型        | 描述
					 * | -------------|--------- | --------- | ------------- |
					 * | versionCode     | y        | int       | 版本号        |
					 * | versionName     | y        | String    | 版本名称      |
					 * | versionInfo     | y        | String    | 版本信息      |
					 * | updateType      | y        | String    | forcibly = 强制更新, solicit = 弹窗确认更新, silent = 静默更新 |
					 * | downloadUrl     | y        | String    | 版本下载链接(IOS安装包更新请放跳转store应用商店链接,安卓apk和wgt文件放文件下载链接)  |
					 */ 
					if (res && res.downloadUrl) {
						if(res.versionCode > version.versionCode){
							//有新版本
							// 兼容之前的版本(updateType是新版才有的参数)
							callback && callback(res);
						}else{
							console.log('已是最新版!')
						}
					} else if (isPrompt) {
						uni.showToast({
							title: "暂无新版本",
							icon: "none"
						});
					}
				}
			})
			.catch(err => {

			});

		/****************以上是示例*******************/
	},
	// 弹窗主颜色(不填默认粉色)
	appUpdateColor: "#f0ad4e",
	// 弹窗图标(不填显示默认图标,链接配置示例如: '/static/demo/ic_attention.png')
	appUpdateIcon: '/static/ic_ar.png'
}

3.App.vue中onLaunch触发版本更新

<script>
	// #ifdef APP-PLUS
	import APPUpdate from '@/uni_modules/zhouWei-APPUpdate/js_sdk/appUpdate';
	// #endif
	
	export default {
		onLaunch: function() {
			//app退出重新进,触发
			// #ifdef APP-PLUS
			APPUpdate();
			// #endif
		},
		onShow: function() {
			console.log('App Show');
		},
		onHide: function() {
			console.log('App Hide');
		}
	};
</script>

4.编辑页面,手动更新,调用

<template>
	<view>
		<uni-list>
			<uni-list-item title="账号资料" showArrow="true"></uni-list-item>
			<uni-list-item title="消息设置" showArrow="true"></uni-list-item>
			<u-gap height="8" bgColor="#f4f5fa"></u-gap>
			<uni-list-item title="用户协议" showArrow="true"></uni-list-item>
			<uni-list-item title="隐私政策" showArrow="true"></uni-list-item>
			<u-gap height="8" bgColor="#f4f5fa"></u-gap>
			<uni-list-item title="关于我们" showArrow="true"></uni-list-item>
			<uni-list-item title="商务合作" showArrow="true"></uni-list-item>
			<u-gap height="8" bgColor="#f4f5fa"></u-gap>
			<view @click="onAPPUpdate()">
				<uni-list-item title="版本更新" showArrow="true"></uni-list-item>
			</view>
			
		</uni-list>
		<view class="login_out">
			<u-button text="退出登录" @click="loginOut()" v-if="hasLogin"></u-button>
			<u-button text="现在登录" @click="login()" v-if="!hasLogin"></u-button>
		</view>
	</view>
</template>

<script>
	import {
		mapState,
		mapMutations //先导入mapState方法
	} from 'vuex'

	// #ifdef APP-PLUS
	import APPUpdate, {
		getCurrentNo
	} from '@/uni_modules/zhouWei-APPUpdate/js_sdk/appUpdate';
	// #endif

	export default {
		data() {
			return {
				hasLogin: "",
				version: "" // 版本号
			}
		},
		onLoad: function() {
			this.hasLogin = uni.getStorageSync('globalHasLogin')

			// #ifdef APP-PLUS
			getCurrentNo(res => {
				// 进页面获取当前APP版本号(用于页面显示)
				this.version = res.version;
			});
			// #endif
		},
		methods: {
			...mapMutations(['logout']),

			//退出登录
			loginOut() {
				uni.$u.http.delete('/auth/appLogout', {}).then(res => {
					this.logout()
					uni.showToast({
						title: '退出成功!',
						icon: 'none'
					});
					uni.navigateTo({
						url: "/pages/login/login"
					})
				}).catch(err => {

				})
			},
			//登录
			login() {
				uni.navigateTo({
					url: "/pages/login/login"
				})
			},
			// 检查APP是否有新版本
			onAPPUpdate() {
				debugger
				// true 没有新版本的时候有提示,默认:false
				APPUpdate(true);
			}
		}
	}
</script>

<style scoped>
	.login_out {
		width: 100%;
		position: fixed;
		bottom: 0;
	}
</style>

18、详情页,根据id请求后台详细信息

onLoad接口参数,created中调用初始化接口

onLoad(option) {
			this.commodityId = option.id
		},
		created() {
			this.init();
		},

19、上传图片

uni.$u.http.upload('/file/upload', {
							params: {},
							/* 会加在url上 */
							// #ifdef APP-PLUS || H5
							//files: [], // 需要上传的文件列表。使用 files 时,filePath 和 name 不生效。App、H5( 2.6.15+)
							// #endif
							filePath: tempFilePaths[0], // 要上传文件资源的路径。
							// 注:如果局部custom与全局custom有同名属性,则后面的属性会覆盖前面的属性,相当于Object.assign(全局,局部)
							custom: {
								auth: true
							}, // 可以加一些自定义参数,在拦截器等地方使用。比如这里我加了一个auth,可在拦截器里拿到,如果true就传token
							name: 'file', // 文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容
							// #ifdef H5 || APP-PLUS
							timeout: 60000, // H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)
							// #endif
							header: {},
							/* 会与全局header合并,如有同名属性,局部覆盖全局 */
							formData: {}, // HTTP 请求中其他额外的 form data
							// 返回当前请求的task, options。请勿在此处修改options。非必填
							getTask: (task, options) => {},
						}).then(res => {
							// 返回的res.data 已经进行JSON.parse
							let src = res.data.data.url
							
						}).catch(err => {

						})

20、Quill后台上传的富文本内容前台展示,样式丢失

将这三个样式文件,导入APP中

 

APP.vue中引入

	@import '@/common/quill/quill.bubble.css';
	@import '@/common/quill/quill.core.css';
	@import '@/common/quill/quill.snow.css';

 使用的时候,增加ql-editor 样式

21、子组件强制修改,父组件传过来的值

this.$set(对象,"key","value")
this.$forceUpdate()

22、聊天模板

uni-list 列表 - DCloud 插件市场

聊天模板 - DCloud 插件市场

23、APP分享

uni-share - DCloud 插件市场

24、图片裁剪

支持固定模式、等比缩放、自由模式

ksp-cropper - DCloud 插件市场

25、原生弹出框,带取消确认

uni.showModal({
					title: '提示',
					content: '确定取消订单吗?',
					success: function(res) {
						if (res.confirm) {
							console.log('用户点击确定');

						} else if (res.cancel) {
							console.log('用户点击取消');
						}
					}
				});

26、view元素居中

<view style="display:flex;flex-direction: column;">
									<view style="align-self: center;">
										水平居中内容
									</view>
								</view>

27、原生导航栏 自定义

uniapp 导航栏原生标题、按钮、输入框配置 - 简书

28、input后置插槽,字数统计

			<u-input placeholder="标题(必填)" v-model="title" border="bottom" maxlength="30">
				<u--text :text="this.title.length + '/30'" slot="suffix" margin="0 3px 0 0" type="tips"></u--text>
			</u-input>

29、查看ttf字体

官方demo中国有个uni.ttf,如何查看里面字符?

1.先安装字体,记住字体名称

 2.查找字符

30、允许复制

app.vue 中增加

	page {
		-webkit-user-select: text;
	}

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cesium vue

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

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

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

打赏作者

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

抵扣说明:

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

余额充值