最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

微信小程序開發(fā)之你可能沒有踩過的神坑總結(jié)

 更新時間:2021年09月29日 11:17:50   作者:豌豆公主技術(shù)部  
最近在做一個小程序的項目,所以記錄下開發(fā)過程中遇到的坑,這篇文章主要給大家介紹了關(guān)于微信小程序開發(fā)之你可能沒有踩過的神坑,需要的朋友可以參考下

getApp()

getApp() 函數(shù)是用來獲取 app 實例的函數(shù),一般情況下沒啥問題,但是在幾個特殊的場景下它會給你帶來意想不到的 bug。
在 app.js 中的 onLaunch 回調(diào)函數(shù)中使用

// app.js
App({
 onLaunch() {
  console.info(getApp(), '!!');
 }
});

你會發(fā)現(xiàn)這個時候會輸出 undefined ,這其實可以理解,畢竟這個時候還在初始化階段,app 還沒出生。如果代碼僅僅是這么簡單的話,那你可以很容易的發(fā)現(xiàn)這個問題,一旦你在其中調(diào)用了一個方法,而這個方法又不小心在獲取 app 實例來獲取變量,那意外就產(chǎn)生了。

So~ 如果沒有同步要求,可以在 onLaunch 中調(diào)用函數(shù)可以包一層 setTimout 避免踩坑:

// app.js
App({
 onLaunch() {
  setTimeout(() => {
   // ... 調(diào)用其他函數(shù)
  });
 }
});

將 getApp() 賦值給一個變量

我們創(chuàng)建一個 a.js 文件:

// a.js
const app = getApp();

export function checkVersion() {
 console.log('checked!');
 console.info('app', app, '!!');
}

上面的文件一般情況下不會遇到什么問題,但是一旦你在 app.js 中引入,那驚喜就產(chǎn)生了。

// app.js
import { checkVersion } from 'a';

App({
 onLaunch() {
  console.log('I\'m Fine!');
 },
 onShow() {
  checkVersion();
 }
});

這個時候你會發(fā)現(xiàn) app 變量是 undefined,這種錯誤你可能很難發(fā)覺,特別是封裝的一個通用庫,平時好好的,但是突然在 app.js 中使用了一下,就哎嘿了。

So~ 為了避免這種問題,盡量減少公用 app 實例共享,而是在方法中直接使用 getApp() 來獲取實例對象。如果要使用全局變量,可以單獨(dú)一個 js 文件來單獨(dú)存儲變量會更好,比如:

// globalStore.js

export default {
 userInfo: null,
 isIos: false,
 isLaunched: false,
};
// app.js
import store from 'globalStore';

App({
 onLaunch() {
  store.isLaunched = true;
 },
 onShow() {
  const { isLaunched } = getApp().store,
  console.log(isLaunched);
 },
 store,
});

這樣既可以通過導(dǎo)入模塊的方式獲取全局變量,又可以兼容通過 getApp().store 來獲取全局變量。

但是原則上我還是建議通過導(dǎo)入模塊的方式來讀寫全局變量,畢竟在某些情況下 getApp() 返回了 undefined 。

在頁面入口文件頂部定義變量

在頁面入口文件定義變量很常見,但是你一定要注意的是,頁面的入口文件只會執(zhí)行一次,并不是每個頁面實例獨(dú)立的,比如下面的代碼:

// pages/page/index.js
import { getDetailInfo } from 'api';
let ajaxLock = false;

Page({
 onLoad() {
  this.getRemoteData();
 },
 async getRemoteData() {
  if (ajaxLock) {
   return;
  }
  ajaxLock = true;
  try {
   await getDetailInfo();
  } catch(err) {
   // ... 處理錯誤
  } finally {
   ajaxLock = false;
  }
 },
});

頁面邏輯比較簡單,一進(jìn)入頁面就請求遠(yuǎn)程數(shù)據(jù),目測也沒啥問題,但是一旦同時打開多個該頁面,你會發(fā)現(xiàn)只有第一個頁面請求了數(shù)據(jù),后面的頁面沒有請求,因為這幾個頁面都共享了 ajaxLock 這個變量,因此在頁面頂部聲明的變量,一定要注意使用場景。

頁面入口文件中 data 中直接賦值全局變量

直接上代碼:

// pages/page/index.js
Page({
 data: {
  isIos: getApp().store.isIos,
 },
});

// app.js
App({
 onLaunch() {
  this.getSysInfo();
 },
 getSysInfo() {
  return new Promise((resolve, reject) => {
   wx.getSystemInfoAsync({
    success: resolve,
    fail: reject,
   });
  }).then((res) => {
   const { store } = getApp();
   store.isIos = res.platform.toLowerCase() === 'ios';
  });
 },
 store: {
  isIos: false,
 },
});

上面代碼的主要邏輯就是需要知道當(dāng)前設(shè)備是不是 ios ,代碼在模擬器上跑著似乎很穩(wěn)定,但是一旦上了真機(jī),就時好時壞了,因為 isIos 這個變量不是同步獲取狀態(tài)的,一旦賦值在頁面入口函數(shù)執(zhí)行完之后,那么狀態(tài)的展現(xiàn)就會不正確。
因此對于某些狀態(tài)不是同步賦值,千萬不要直接通過在初始化的時候直接給 data 賦值的方式去操作,最好放到 onLoad 回調(diào)函數(shù)中去賦值狀態(tài)。

你不知道的 wx.createSelectorQuery() and wx.createIntersectionObserver();

這兩個函數(shù)也是比較常用的,wx.createSelectorQuery 主要用來查詢某個元素,wx.createIntersectionObserver 用在需要處理元素是否在可視區(qū)。這兩個函數(shù)的問題目測純純的可愛,我也是在實現(xiàn)某個特殊需求的時候才發(fā)現(xiàn),也真是后知后覺,不明覺厲,細(xì)思極恐...

我們來復(fù)現(xiàn)問題,頁面入口函數(shù)這么寫:

// pages/page/index.js
let index = 0

Page({
 data: {
  tag: 0
 },
 onLoad() {
  if (index++ < 2) {
   wx.navigateTo({
    url: '/pages/page/index'
   });
  }
  this.setData({
   tag: index
  },() => {
   setTimeout(() => {
    const { tag } = this.data;
    const query = wx.createSelectorQuery();
    // const query = this.createSelectorQuery();
    query.select(`.c-${ tag }`).boundingClientRect();
    query.exec((res) => {
     console.log(tag, res);
    });
   }, 2000);
  });
 }
});

<!-- 模板文件 -->
<view class="c-{{tag}}">demo</view>

我模擬了同時打開多個頁面的情況,在開發(fā)者工具中你就會發(fā)現(xiàn),前兩個頁面的結(jié)果居然是 null ?。。‘?dāng)時我就覺得世界有點(diǎn)兒崩塌。因此我懷疑畢竟 wx.createSelectorQuery 是一個全局函數(shù),因此它查詢的是當(dāng)前活躍窗口下的 wxml。怎么解決呢,我翻了翻官方文檔,用放大鏡找了找小字,發(fā)現(xiàn)有 this.createSelectorQuery 這個方法,抱著試一試的態(tài)度,問題就突然解決了。當(dāng)然 wx.createIntersectionObserver 也是同樣的問題,我就不做演示了。

So~ 為了身體好,我強(qiáng)烈建議直接使用 this.createSelectorQuery 和 this.createIntersectionObserver 。

以上是我這幾年開發(fā)微信小程序踩過的神坑,望你不要再踩上~~

總結(jié)

到此這篇關(guān)于微信小程序開發(fā)之你可能沒有踩過的坑的文章就介紹到這了,更多相關(guān)微信小程序開發(fā)的坑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript如何動態(tài)創(chuàng)建table表格

    JavaScript如何動態(tài)創(chuàng)建table表格

    這篇文章主要介紹了JavaScript如何動態(tài)創(chuàng)建table表格,一些時候需要動態(tài)的創(chuàng)建和刪除表格,接下來的文章中將為大家介紹下javascript是如何做到的,感興趣的朋友不要錯過
    2015-11-11
  • js實現(xiàn)網(wǎng)站首頁圖片滾動顯示

    js實現(xiàn)網(wǎng)站首頁圖片滾動顯示

    網(wǎng)站首頁圖片滾動顯示對于很多朋友都有很大的吸引,因為它可以帶來意想不到視覺沖擊效果,接下來本文也實現(xiàn)一下,感興趣的朋友可以參考下,或許對你學(xué)習(xí)js知識有所幫助
    2013-02-02
  • js實現(xiàn)隨機(jī)div顏色位置 類似滿天星效果

    js實現(xiàn)隨機(jī)div顏色位置 類似滿天星效果

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)隨機(jī)div顏色位置,類似滿天星效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Canvas實現(xiàn)動態(tài)的雪花效果

    Canvas實現(xiàn)動態(tài)的雪花效果

    本文主要分享Canvas實現(xiàn)動態(tài)的雪花效果的示例代碼。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 微信小程序icon組件使用詳解

    微信小程序icon組件使用詳解

    這篇文章主要為大家詳細(xì)介紹了微信小程序icon組件的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 基于es6三點(diǎn)運(yùn)算符的使用方法(實例講解)

    基于es6三點(diǎn)運(yùn)算符的使用方法(實例講解)

    下面小編就為大家?guī)硪黄谌c(diǎn)運(yùn)算符的使用方法(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 前端高頻面試題之JS中堆和棧的區(qū)別和瀏覽器的垃圾回收機(jī)制

    前端高頻面試題之JS中堆和棧的區(qū)別和瀏覽器的垃圾回收機(jī)制

    本文給大家分享前端高頻面試題JS中堆和棧的區(qū)別和瀏覽器的垃圾回收機(jī)制,本文分文別類給大家介紹了棧(stack)和堆(heap)的區(qū)別基本類型和引用類型的相關(guān)知識,瀏覽器垃圾回收機(jī)制包括基本概念給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • js類式繼承與原型式繼承詳解

    js類式繼承與原型式繼承詳解

    這篇文章主要為大家詳細(xì)介紹了js類式繼承與原型式繼承,感興趣的小伙伴們可以參考一下
    2016-04-04
  • javascript replace方法與正則表達(dá)式

    javascript replace方法與正則表達(dá)式

    replace方法的語法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正則表達(dá)式對象(RegExp)也可以是字符串(string),replaceText是替代查找到的字符串。。為了幫助大家更好的理解,下面舉個簡單例子說明一下
    2008-02-02
  • 前端本地文件獲取excel表格內(nèi)容并渲染在頁面的方法

    前端本地文件獲取excel表格內(nèi)容并渲染在頁面的方法

    這篇文章主要介紹了前端本地文件獲取excel表格內(nèi)容并渲染在頁面的方法,主要利用SheetJS插件用于處理Excel文件,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03

最新評論

延边| 右玉县| 赤峰市| 稷山县| 边坝县| 台湾省| 梧州市| 宣汉县| 云阳县| 四平市| 蒙自县| 南安市| 宜都市| 突泉县| 宜宾县| 滨海县| 龙陵县| 磐安县| 石家庄市| 佛坪县| 广水市| 苏州市| 太原市| 赣州市| 南华县| 张家界市| 罗江县| 行唐县| 凯里市| 建宁县| 台湾省| 双鸭山市| 恩平市| 图木舒克市| 沈阳市| 增城市| 巴彦淖尔市| 海安县| 赤峰市| 博野县| 奉贤区|