vue3 uniapp微信登录

本文介绍了微信小程序官方关于uniapp中getUserInfo方法的新规定,不再直接返回用户头像、昵称和手机号。开发者需通过code获取openid等信息,通过后台接口进行登录并使用pinia存储token以实现持久化。

根据最新的微信小程序官方的规定,uniapp中的uni.getUserInfo方法不再返回用户头像和昵称、以及手机号

首先,需获取appID,appSecret,如下图

先调用uni.getUserInfo方法获取code,然后调用后台的api,传入code,换取登录信息比如openid什么的,然后调用后台的例如账号密码或者手机验证码等相关登录的接口,换取token存入本地,即可。

uni.getUserInfo({
			provider: 'weixin',
			success: function(info) {
				// 获取用户信息成功, info.authResult保存用户信息
				uni.login({
					provider: 'weixin',
					success: function(loginRes) {
						console.log(loginRes, '---loginRes')
						wxLoginApi({
							code: loginRes.code
						}).then(res => {
							if (res.code === '200') {
								loginParamObj.value = res.data;
								if (loginParamObj.value.bindStatus === '1') {
											//已绑定,直接登录
											
									// userStore.SET_FRESH_TOKEN(res.data.refresh_token)
								} else {
									// 留在登录页
									initLoginStatus.value = true
								}
								
							}
						})
					},
					fail: function(err) {
						// 登录授权失败
						// err.code是错误码
					}
				});
			}
		})

登录后要配合pinia,将token存入本地即可

import {
	defineStore
} from 'pinia'
const user = defineStore(
	'user', () => {
		const token = ref(''); // 登录token
		const fresh_token = ref('');
		
		const SET_TOKEN = (value : string) => {
			token.value = value
		};
		const SET_FRESH_TOKEN = (value : string) => {
			fresh_token.value = value
		};
		return {
			token,
			fresh_token,
		}

	}, {
	unistorage: true // 开启后对 state 的数据读写都将持久化
})
// const user = ()=>{

// }
export default user

在使用 Vue3 开发 Uniapp 微信小程序时,获取 `ref` 为 `null` 是一个常见的问题,通常与 Vue 的响应式机制、组件生命周期以及微信小程序的底层实现有关。 ### 问题原因 1. **组件尚未渲染完成**:在组件尚未完成挂载时访问 `ref`,会导致其值为 `null`。这是因为 Vue3 的 Composition API 中,`setup()` 函数在组件挂载之前执行,此时 DOM 节点尚未创建[^1]。 2. **异步渲染问题**:在某些情况下,例如使用 `v-for` 渲染的组件或动态组件,`ref` 可能不会立即绑定到 DOM 元素上。 3. **微信小程序平台限制**:微信小程序的 DOM 操作与 Web 环境不同,它并不完全支持标准的 DOM API,导致某些情况下 `ref` 无法正确指向实际的节点。 ### 解决方案 1. **使用 `onMounted` 生命周期钩子** 确保在组件挂载完成后再访问 `ref`。可以通过 `onMounted` 生命周期钩子来确保 DOM 已经渲染完成。 ```ts import { ref, onMounted } from 'vue' export default { setup() { const myRef = ref(null) onMounted(() => { console.log(myRef.value) // 此时可以安全访问 DOM 节点 }) return { myRef } } } ``` 2. **使用 `nextTick` 等待 DOM 更新** 在数据变化后,如果需要立即访问更新后的 DOM,可以使用 `nextTick` 确保 DOM 已经更新。 ```ts import { ref, nextTick } from 'vue' export default { setup() { const myRef = ref(null) const updateData = async () => { // 数据更新 await nextTick() console.log(myRef.value) // DOM 已更新 } return { myRef, updateData } } } ``` 3. **使用 `uni.createSelectorQuery` 替代 `ref`** 在微信小程序中,可以使用 `uni.createSelectorQuery` 查询节点信息,特别是在需要获取 DOM 尺寸或位置时。 ```ts import { onMounted } from 'vue' export default { setup() { onMounted(() => { uni.createSelectorQuery() .select('#myElement') .boundingClientRect(res => { if (res) { console.log('元素尺寸:', res) } }).exec() }) return {} } } ``` 4. **避免在 `v-for` 中使用 `ref`** 如果在 `v-for` 中使用 `ref`,会得到一个数组,而不是单个元素。建议使用 `uni.createSelectorQuery` 或通过 `key` 控制组件唯一性。 ### 注意事项 - **避免在 `setup()` 中直接访问 `ref`**:因为 `setup()` 在组件挂载前执行,此时 `ref.value` 可能为 `null`。 - **使用 `ref` 时确保元素有唯一标识**:例如 `id` 或 `class`,以便在需要时通过 `uni.createSelectorQuery` 查询。 - **调试时检查模板中的 `ref` 名称是否正确**:拼写错误或作用域问题可能导致 `ref` 未被正确绑定。 ### 总结 在 Vue3 + Uniapp 微信小程序开发中,获取 `ref` 为 `null` 的问题主要与生命周期和平台限制有关。通过合理使用 `onMounted`、`nextTick` 和 `uni.createSelectorQuery`,可以有效解决这一问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值