这里需要注意 你的所有节点都要加载完成,对时机要求很高,如果你的子节点都是动态获取接口的,最好监听子组件加载完成,再去设置滚动节点的id,之前踩过坑。
scroll-view中的属性scroll-into-view失效?<scroll-view scroll-y scroll-with-animation class="scroll-view scroll-view-content" @scroll="viewScroll" :scroll-top='scrollTop' :scroll-into-view="scrollIntoViewId" enable-passive > ... <component @changeTab="changeTab"> <view :id="scrollIntoViewId"></view> </component> </scroll-view> ... <script> data() { return { ... scrollIntoViewId: "", }; }, methods:{ changeTab(value) { this.scrollIntoViewId = value;//另一个页面通过$emit传过来的值,可以取到 }, } </script>
星期二 18:37刺激不,小程序一年不开发,包你懵逼。一个用户头像昵称改了一百八十遍api,然后隐私协议+弹窗又搞了一百八十遍,后面订单又要求上传订单页面路径,用个定位要申请,申请完了还要写到隐私协议,这些都不致命,致命的是你不知道在哪看文档 [dog],后面有要求短链URL schema 一人一链,第一个人访问过就会过期,又要去整改,等你改完,又发公告说一人一链取消,我们又可以用啦,哦耶,天才。
getUserProfile()获取用户信息授权后还是获取不到真实信息?在getUserProfile方法中获取到的信息还是虚拟的,是因为在模拟测试的原因吗,头像和微信名称获取不到当前账号的信息。 wxml文件: <view class="container"> <block wx:if="{{isLoggedIn}}"> <view class="user-info"> <image src="{{userInfo.avatar_url}}" class="avatar"></image> <text class="nickname">{{userInfo.nickname}}</text> <text class="user-id">我的ID: {{userInfo.id}}</text> </view> <view class="partner-info" wx:if="{{partnerInfo}}"> <text class="section-title">我的伴侣</text> <view class="partner-detail"> <image src="{{partnerInfo.avatar_url}}" class="partner-avatar"></image> <text class="partner-name">{{partnerInfo.nickname}}</text> </view> </view> <view class="action-buttons"> <button class="btn" wx:if="{{!partnerInfo}}" bindtap="bindPartner">绑定伴侣</button> <button class="btn logout" bindtap="logout">退出登录</button> </view> </block> <block wx:else> <view class="login-container"> <image src="/images/logo.png" class="logo" mode="aspectFit"></image> <text class="welcome-text">欢迎使用愿望池</text> <button wx:if="{{canIUseGetUserProfile}}" class="btn login" bindtap="getUserProfile" >微信登录</button> <button wx:else class="btn login" open-type="getUserInfo" bindgetuserinfo="onGetUserInfo" >微信登录</button> </view> </block> </view> js文件: const app = getApp(); const baseUrl = 'http://172.222.3.74:8083'; // 封装请求方法 const request = { post: (url, data, token = '') => { return new Promise((resolve, reject) => { wx.request({ url: `${baseUrl}${url}`, method: 'POST', header: token ? { 'Authorization': `Bearer ${token}` } : {}, data, success: (res) => resolve(res), fail: (err) => reject(err) }); }); }, get: (url, token) => { return new Promise((resolve, reject) => { wx.request({ url: `${baseUrl}${url}`, header: { 'Authorization': `Bearer ${token}` }, success: (res) => resolve(res), fail: (err) => reject(err) }); }); }, put: (url, data, token) => { return new Promise((resolve, reject) => { wx.request({ url: `${baseUrl}${url}`, method: 'PUT', header: { 'Authorization': `Bearer ${token}` }, data, success: (res) => resolve(res), fail: (err) => reject(err) }); }); } }; Page({ data: { isLoggedIn: false, userInfo: null, partnerInfo: null, token: '' }, onLoad: function() { this.checkLoginStatus(); }, // 检查登录状态 checkLoginStatus: async function() { const token = wx.getStorageSync('token'); const userInfo = wx.getStorageSync('userInfo'); //判断token和userInfo是否已经获取到 if (token && userInfo) { this.setData({ isLoggedIn: true, userInfo, token }); await this.getPartnerInfo(); return; } // 检查是否支持 getUserProfile if (wx.getUserProfile) { this.setData({ canIUseGetUserProfile: true }); } }, // 使用 getUserProfile 获取用户信息 getUserProfile: function() { wx.getUserProfile({ desc: '用于完善会员资料', lang: 'zh_CN', success: async (userInfoResult) => { try { // 获取 code const loginResult = await wx.login(); if (!loginResult.code) { throw new Error('获取用户code失败'); } console.log("用户信息:", userInfoResult); // 调用服务端获取 token 接口 const codeRes = await request.post('/users/developer/code', { code: loginResult.code }); if (codeRes.statusCode !== 200 || !codeRes.data.token) { throw new Error('获取token失败'); } const token = codeRes.data.token; // 获取手机号加密值 const phoneRes = await wx.getPhoneNumber({ success: (phoneInfo) => phoneInfo, fail: () => { throw new Error('获取手机号失败'); } }); // 调用服务端登录接口 const loginRes = await request.post('/users/developer/login', { token, userInfo: { nickName: userInfoResult.userInfo.nickName, avatarUrl: userInfoResult.userInfo.avatarUrl, gender: userInfoResult.userInfo.gender, country: userInfoResult.userInfo.country, province: userInfoResult.userInfo.province, city: userInfoResult.userInfo.city, language: userInfoResult.userInfo.language }, rawData: userInfoResult.rawData, signature: userInfoResult.signature, encryptedData: userInfoResult.encryptedData, iv: userInfoResult.iv, phoneEncryptedData: phoneRes.encryptedData, phoneIv: phoneRes.iv }); if (loginRes.statusCode === 200 && loginRes.data) { this.handleLoginSuccess({ token: loginRes.data.token, userInfo: loginRes.data.userInfo }); } else { throw new Error('登录失败'); } } catch (error) { console.error('登录失败:', error); wx.showToast({ title: error.message || '登录失败', icon: 'none' }); } }, fail: (error) => { console.error('获取用户信息失败:', error); wx.showToast({ title: '获取用户信息失败', icon: 'none' }); } }); }, // 处理用户信息授权(兼容旧版本) onGetUserInfo: function(e) { if (e.detail.userInfo) { this.login(e.detail.userInfo); } else { wx.showToast({ title: '需要授权才能使用', icon: 'none' }); } }, // 登录流程 login: async function(userInfo) { try { const { code } = await wx.login(); if (!code) { throw new Error('获取用户code失败'); } const loginRes = await request.post('/users/developer/login', { code, userInfo }); if (loginRes.statusCode === 200 && loginRes.data) { this.handleLoginSuccess({ token: loginRes.data.token, userInfo: loginRes.data.userInfo }); } else { throw new Error('登录失败'); } } catch (error) { console.error('登录失败:', error); wx.showToast({ title: error.message || '登录失败', icon: 'none' }); } }, // 处理登录成功 handleLoginSuccess: function(data) { wx.setStorageSync('token', data.token); wx.setStorageSync('userInfo', data.userInfo); this.setData({ isLoggedIn: true, userInfo: data.userInfo, token: data.token }); this.getPartnerInfo(); }, // 获取伴侣信息 getPartnerInfo: async function() { if (!this.data.userInfo?.partnerId) return; try { const res = await request.get( `/users/${this.data.userInfo.partner_id}`, this.data.token ); this.setData({ partnerInfo: res.data }); } catch (error) { console.error('获取伴侣信息失败:', error); } }, // 退出登录 logout: function() { wx.removeStorageSync('token'); wx.removeStorageSync('userInfo'); this.setData({ isLoggedIn: false, userInfo: null, partnerInfo: null, token: '' }); }, // 绑定伴侣 bindPartner: async function() { try { const res = await new Promise((resolve) => { wx.showModal({ title: '绑定伴侣', content: '请输入伴侣ID', editable: true, success: (res) => resolve(res) }); }); if (!res.confirm || !res.content) return; const updateRes = await request.put( `/users/${this.data.userInfo.id}`, { partner_id: res.content }, this.data.token ); if (updateRes.data) { wx.showToast({ title: '绑定成功', icon: 'success' }); this.setData({ userInfo: updateRes.data }); wx.setStorageSync('userInfo', updateRes.data); await this.getPartnerInfo(); } else { throw new Error('绑定失败'); } } catch (error) { console.error('绑定伴侣失败:', error); wx.showToast({ title: error.message || '绑定失败', icon: 'none' }); } } });
星期一 14:46腾讯以外的不支持,腾讯以内的部分支持
用户上传的图片长按识别二维码有的识别,有的不识别,是有什么要求限制吗?[图片][图片][图片][图片]
星期一 14:42排除弱网环境了吗,弱网超时很正常,最好能做一些日志上报
wx.request 设置20s超时, 后端接口一秒就响应了, 但api返回超时?封装的"wx.request"API, 设置的20s超时, 后端看日志1秒钟就响应了: 给我发的图是15:03收到请求, 15:04响应, 但是我这么收到的还是超时, 为什么呢? [图片]
星期一 14:41不支持
小程序中如何获取手机来电提醒?请问小程序是否有API可以获取用户的来电提醒(包括联系人,电话号码等信息) 来电是指手机通话,而非微信音频或视频
星期一 14:38你说的什么调试,Vconsole?看这里https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/wx.setEnableDebug.html
为什么调试有时可以有时不行?请大佬解释一下
星期一 14:37两种方式,一种可以手动开启,加一个隐藏开关:wx.setEnableDebug(Object object),参考文档 https://developers.weixin.qq.com/miniprogram/dev/api/base/debug/wx.setEnableDebug.html
微信小程序正式版 怎么在手机上打开vConsole看请求? 或者有类似的插件吗?微信小程序正式版 怎么在手机上打开vConsole看请求? 或者有类似的插件吗?
星期一 14:37整个URL编码需要使用encodeURI 而不是 encodeURIComponent
decodeURIComponent为什么通过跳转 转义不了呢?[图片] [图片] [图片] 直接在当前页encodeURIComponent,decodeURIComponent没用问题 而通过前一个页面跳转传参过来就转义不了 求解决
星期一 14:27教你一个技巧:我这个定位是为用户服务的,用户没有这个功能会怎么样,有了又会怎么样,并且说明为什么这个定位非要开通不可,一定是站在用户角度
wx.getLocation 一直申请都不通过为什么?需要申请wx.getLocation权限获取用户位置,服务用户于门店自提,门店导航服务,但是上传什么截图和视频都不通过。不通过也不知道具体什么原因,请大家帮忙解决一下。
12-05确定隐私协议生效了吗,线上需要提审如果要从其他地方同意隐私协议,大概率是你的隐私协议无效,可以看控制台有没有报错
直接唤起 无效 getRecorderManager.start() ?隐私协议中申请了录音权限了 但是在 onload 中直接触发 开始录音却无法自动唤起需要用户隐私授权的弹窗 必需要从 获取昵称 获取用户地理位置 唤起一次获取用户同意隐私协议才行 再触发录音才可以 Page({ data: {}, onLoad() { this.initRecorder() }, initRecorder() { const recorderManager = wx.getRecorderManager() console.log('recorderManager :>> ', recorderManager) recorderManager.start({ duration: 600000, // 设置录音的时长 sampleRate: 44100, // 较高的采样率,捕捉更多细节 numberOfChannels: 1, // 单声道 encodeBitRate: 96000, // 比特率适中,保证录音质量 format: 'pcm', // 格式 frameSize: 50, // 较小的帧大小,更灵敏地捕捉音量变化 }) }, })
11-21