【小程序】開(kāi)發(fā)需要注意的地方(二)

16. 小程序this.setData is not a function

現(xiàn)象:如果出現(xiàn)this.setData is not a function 這個(gè)錯(cuò)誤奋岁,這個(gè)就是微信小程序中的this的指向問(wèn)題思瘟,比如在發(fā)送請(qǐng)求成功之后的this指向。

解決方法:

  1. const that = this;然后使用that.setData
  2. 使用ES6的箭頭函數(shù)

17.使用data-xx傳值

小程序會(huì)使用data-xx自定義屬性闻伶,讀取的時(shí)候event.currentTarget.dataset就可以獲取設(shè)置的屬性值滨攻,常用于循環(huán)渲染

<view data-alpha-beta="1" data-alphaBeta="2" bindtap="viewTap"> Click me</view>
  viewTap: function(event) {
    console.log(event.currentTarget.dataset.alphaBeta) // 轉(zhuǎn)化為駝峰寫(xiě)法
    console.log(event.currentTarget.dataset.alphabeta) // 所有的大寫(xiě)轉(zhuǎn)化成小寫(xiě)
  }

注意寫(xiě)法

18. 小程序撥打電話報(bào)錯(cuò)

img

解決方法:小程序調(diào)用撥打電話參數(shù) phoneNumber必須是字符串格式

calling: function (event) {
  wx.makePhoneCall({
     phoneNumber: event.currentTarget.dataset.tel + ''
  })
}

19. block 標(biāo)簽

<block wx:if="{{true}}">
  <view>view1</view>
  <view>view2</view>
</block>

<block/> 并不是一個(gè)組件,它僅僅是一個(gè)包裝元素铡买,不會(huì)在頁(yè)面中做任何渲染霎箍,只接受控制屬性(如wx:for 或 wx:if)漂坏。

20. 關(guān)鍵字

關(guān)鍵字綁定常用于組件的一些關(guān)鍵字顶别,像復(fù)選框組件一樣,checked關(guān)鍵字如果等于true完慧,則代表選中復(fù)選框屈尼,false則代表不選中復(fù)選框拴孤,示例代碼如下:

<checkbox checked="{{false}}"> </checkbox>

不要直接寫(xiě)checked = "false"演熟,其計(jì)算結(jié)果是一個(gè)字符串,轉(zhuǎn)成boolean類型后代表真值兄纺。

21. 網(wǎng)絡(luò)請(qǐng)求

小程序通過(guò)wx.request方法進(jìn)行https網(wǎng)絡(luò)請(qǐng)求囤热,網(wǎng)絡(luò)請(qǐng)求是獲取網(wǎng)絡(luò)數(shù)據(jù)的基本方法获三。

wx.request({
  url: 'test.php', // 僅為示例疙教,并非真實(shí)的接口地址
  data: {
    x: '',
    y: ''
  },
  header: {
    'content-type': 'application/json' // 默認(rèn)值
  },
  success(res) {
    console.log(res.data)
  }
})

注意點(diǎn):

  1. wx.request方法只支持https請(qǐng)求。
  2. 訪問(wèn)URL域名已經(jīng)在微信小程序后臺(tái)配置為合法域名限佩,并且不能有端口祟同。
  3. method的value必須為大寫(xiě)(如GET)晕城。
  4. request請(qǐng)求的默認(rèn)超時(shí)時(shí)間和最大超時(shí)時(shí)間都是60s窖贤。
  5. request的最大并發(fā)數(shù)是5贰锁。
  6. 網(wǎng)絡(luò)請(qǐng)求的referer是不可以設(shè)置的豌熄,固定格式為https://servicewechat.com/{appid}/{version}/page-frame.html锣险。關(guān)于referer的詳細(xì)解釋

22. getCurrentPages()函數(shù)

框架以棧的形式維護(hù)了當(dāng)前的所有頁(yè)面囱持。 當(dāng)發(fā)生路由切換的時(shí)候焕济,頁(yè)面棧的表現(xiàn)如下:

路由方式 頁(yè)面棧表現(xiàn)
初始化 新頁(yè)面入棧
打開(kāi)新頁(yè)面 新頁(yè)面入棧
頁(yè)面重定向 當(dāng)前頁(yè)面出棧晴弃,新頁(yè)面入棧
頁(yè)面返回 頁(yè)面不斷出棧上鞠,直到目標(biāo)返回頁(yè)
Tab 切換 頁(yè)面全部出棧,只留下新的 Tab 頁(yè)面
重加載 頁(yè)面全部出棧世曾,只留下新的頁(yè)面

getCurrentPages()函數(shù)用于獲取當(dāng)前頁(yè)面棧的實(shí)例轮听,以數(shù)組形式按棧的順序給出岭佳,第一個(gè)元素為首頁(yè)珊随,最后一個(gè)元素為當(dāng)前頁(yè)面。

注意:

  1. 不要嘗試修改頁(yè)面棧鲫凶,會(huì)導(dǎo)致路由以及頁(yè)面狀態(tài)錯(cuò)誤衩辟。
  2. 不要在 App.onLaunch 的時(shí)候調(diào)用 getCurrentPages()惭婿,此時(shí) page 還沒(méi)有生成。
  3. getCurrentPages() 跳轉(zhuǎn)現(xiàn)在小程序支持十層换吧。超過(guò)十層之后小程序可能會(huì)造成崩潰沾瓦。

23. getApp()

微信小程序在App()函數(shù)里定義的是全局函數(shù)和全局?jǐn)?shù)據(jù)谦炒,因此在頁(yè)面文件夾的js文件也可以直接使用。比如存在“pages/home/home”這樣的頁(yè)面路徑缕探,在App()函數(shù)中也定義了全局函數(shù)getUserInfo()爹耗。則在home.js文件中就可以直接使用App()函數(shù)提供的全局函數(shù)或數(shù)據(jù)谜喊,代碼如下:

//home.js
//獲取應(yīng)用實(shí)例
const app = getApp()

Page({
  onLoad: function () {
    const that = this
    // 調(diào)用應(yīng)用實(shí)例的方法獲取全局?jǐn)?shù)據(jù)
    app.getUserInfo({
      success: res => {
        that.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    })
  }
})

注意點(diǎn):

  1. App()函數(shù)必須在app.js中注冊(cè)斗遏,且不能注冊(cè)多個(gè)诵次。
  2. 不能在App()內(nèi)的函數(shù)調(diào)用getApp(),使用this就可以拿到App實(shí)例剔猿。
  3. 通過(guò)getApp()獲取實(shí)例之后嬉荆,不要私自調(diào)用生命周期函數(shù)鄙早。

24. 小程序生命周期

小程序生命周期分為兩類:應(yīng)用生命周期和頁(yè)面生命周期。

應(yīng)用生命周期包括onLaunch舱污、onShow扩灯、onHide、onError珠插、onUnload。

頁(yè)面生命周期包括onLoad磨隘、onShow番捂、onReady江解、onHide、onUnload絮缅。

詳細(xì)解釋

25. 小程序判斷用戶是否是通過(guò)點(diǎn)擊別人分享的小卡片進(jìn)入頁(yè)面

用戶進(jìn)入小程序的方法有很多種耕魄,可以通過(guò)好友分享彭谁、群聊分享缠局、微信聊天主頁(yè)面下拉或者發(fā)現(xiàn)欄小程序等等多種途徑。但如果通過(guò)好友分享或者群聊分享打開(kāi)的可能是某一個(gè)小程序頁(yè)面读处,不能返回主頁(yè)面唱矛,這時(shí)就需要在分享的頁(yè)面中加入一個(gè)返回主頁(yè)面的按鈕绎谦,所以需要判斷用戶進(jìn)入的渠道。

其解決方法有多種包个,詳細(xì)解釋

26.小程序與內(nèi)嵌網(wǎng)頁(yè)之間的跳轉(zhuǎn)

小程序跳轉(zhuǎn)到內(nèi)嵌H5頁(yè)面碧囊,需要使用web-view組件,定義該組件的src屬性即可糯而。

內(nèi)嵌H5頁(yè)面跳轉(zhuǎn)到小程序頁(yè)面引入微信的jssdk文件歧蒋,使用wx.miniProgram.redirectTo({url: '/path/to/page'})

詳細(xì)解釋

27. 判斷網(wǎng)頁(yè)是否在小程序環(huán)境

在網(wǎng)頁(yè)內(nèi)可通過(guò)window.__wxjs_environment變量判斷是否在小程序環(huán)境州既,建議在WeixinJSBridgeReady回調(diào)中使用吴叶,也可以使用JSSDK 1.3.2提供的getEnv接口。
代碼如下:

// web-view下的頁(yè)面內(nèi)
wx.ready(function() {
  console.log(window.__wxjs_environment === 'miniprogram') // true
})

// 或

wx.miniProgram.getEnv(function(res) {
  console.log(res.miniprogram) // true 
})

28. 小程序與內(nèi)嵌網(wǎng)頁(yè)的通信

  1. 在web-view中添加bindmessage屬性实束,并綁定一個(gè)函數(shù)咸灿,用于監(jiān)聽(tīng)網(wǎng)頁(yè)發(fā)來(lái)的消息侮叮。
  2. 在內(nèi)嵌網(wǎng)頁(yè)中引入jssdk,然后調(diào)用wx.miniProgram.postMessage()來(lái)向小程序發(fā)送數(shù)據(jù)审胸。

小程序代碼:

<!--webview.wxml-->
<web-view src="{{url}}" bindmessage="postMessage"></web-view>
// webview.js
Page({

  /**
   * 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面加載
   */
  onLoad: function (options) {
    this.setData({
      url: options.url
    })
  },
  postMessage(e) {
    // e.detail = { data }砂沛,data是多次 postMessage 的參數(shù)組成的數(shù)組
    this.setData({
      score: e.detail.data[0].score
    })
  }

})

內(nèi)嵌網(wǎng)頁(yè)代碼:

<!-- html -->
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>

// javascript 
wx.miniProgram.postMessage({ data: 'foo' }) 
wx.miniProgram.postMessage({ data: {foo: 'bar'} }) 

注意:網(wǎng)頁(yè)向小程序 postMessage時(shí)碍庵,不是實(shí)時(shí)的悟狱,只有在特定時(shí)機(jī)(小程序后退芽淡、組件銷毀、分享)觸發(fā)并收到消息富稻。

29. 小程序內(nèi)嵌網(wǎng)頁(yè)的轉(zhuǎn)發(fā)分享

小程序內(nèi)嵌網(wǎng)頁(yè)本質(zhì)是在web-view組件的容器中,當(dāng)對(duì)小程序內(nèi)嵌網(wǎng)頁(yè)的轉(zhuǎn)發(fā)分享抚岗,也是對(duì)webview頁(yè)面的轉(zhuǎn)發(fā)分享哪怔,所以只需在webview.js中的page()定義onShareAppMessage即可。
代碼如下:

Page({
  onShareAppMessage(options) {
    console.log(options.webViewUrl) // 獲取當(dāng)前<web-view>的URL
    return {
      title: "轉(zhuǎn)發(fā)文本標(biāo)題",
      imageUrl: "轉(zhuǎn)發(fā)縮略圖途徑",
      path: options.webViewUrl
    }
  }
})

30. webview組件中bindload問(wèn)題

最近開(kāi)發(fā)小程序的時(shí)候胚委,遇到了一個(gè)奇怪的問(wèn)題亩冬。當(dāng)我對(duì)內(nèi)嵌網(wǎng)頁(yè)設(shè)置背景音頻的時(shí)候硅急,當(dāng)網(wǎng)頁(yè)加載成功的時(shí)候佳遂,定義音頻。但在真機(jī)上測(cè)試的時(shí)候背景音頻定義兩次荚板,所以出現(xiàn)了重音的現(xiàn)象啸驯。

打印了一下日志祟峦,發(fā)現(xiàn)bindload定義的方法執(zhí)行了兩次。其原因我也不知针姿。

代碼如下:
webview.wxml

<!-- 指向微信公眾平臺(tái)首頁(yè)的web-view -->
<web-view src="{{url}}" bindload="loadHtml"></web-view>

webview.js

Page({

  /**
   * 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面加載
   */
  onLoad: function (options) {
    this.setData({
      url: options.url
    })
  },

  loadHtml() {
    console.log('頁(yè)面加載完成') // 該方法執(zhí)行兩次
  }
})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末距淫,一起剝皮案震驚了整個(gè)濱河市榕暇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狰晚,老刑警劉巖壁晒,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秒咐,死亡現(xiàn)場(chǎng)離奇詭異碘裕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)歹茶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)你弦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)禽作,“玉大人旷偿,你說(shuō)我怎么就攤上這事爆侣。” “怎么了茫负?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵忍法,是天一觀的道長(zhǎng)榕吼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)原探,這世上最難降的妖魔是什么咽弦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任离唬,我火速辦了婚禮,結(jié)果婚禮上戚哎,老公的妹妹穿的比我還像新娘嫂用。我一直安慰自己,他們只是感情好甘畅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布疏唾。 她就那樣靜靜地躺著槐脏,像睡著了一般撇寞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牌废,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天鸟缕,我揣著相機(jī)與錄音恨统,去河邊找鬼。 笑死莫绣,一個(gè)胖子當(dāng)著我的面吹牛悠鞍,可吹牛的內(nèi)容都是我干的模燥。 我是一名探鬼主播蔫骂,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辽旋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼檐迟!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起溶其,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓶逃,失蹤者是張志新(化名)和其女友劉穎廓块,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體代芜,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浓利,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贷掖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苹威。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驾凶。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡调违,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出且轨,到底是詐尸還是另有隱情,我是刑警寧澤泳挥,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布屉符,位于F島的核電站锹引,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏粤蝎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一秸应、第九天 我趴在偏房一處隱蔽的房頂上張望软啼。 院中可真熱鬧延柠,春花似錦、人聲如沸贞间。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)峻仇。三九已至,卻和暖如春凡蚜,著一層夾襖步出監(jiān)牢的瞬間吭从,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工芹务, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枣抱。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓佳晶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親中跌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菇篡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容