微信小程序 獲取用戶信息 官網例程 詳解

 

//index.js

//index.js
//獲取應用實例
const app = getApp()

Page({
  data: {
    motto: 'diligent is the short cut',//**motto 格言的意思 這裏是你要顯示在下面的東西
    userInfo: {},
    hasUserInfo: false,//**獲取到用戶信息標誌
    canIUse: wx.canIUse('button.open-type.getUserInfo')
    //* boolean wx.canIUse(string schema) 判斷小程序的API,回調,參數,組件等是否在當前版本可用。
    //*string schema 使用 ${API }.${method }.${param }.${options }  方式來調用
    //*或者 ${component }.${attribute }.${option } 方式來調用 (這裏用的是這個--> open-type屬性爲getUserInfo的button組件
  },
  //事件處理函數
  //**在組件中綁定一個事件處理函數。
  //**如bindtap,當用戶點擊該組件的時候會在該頁面對應的Page中找到相應的事件處理函數。
  bindViewTap: function() {
    wx.navigateTo({
      /*wx.navigateTo(OBJECT) 保留當前頁面,跳轉到應用內的某個頁面,使用wx.navigateBack可以返回到原頁面。 */
      url: '../logs/logs'
    })
  },

  //**頁面加載之後立即執行一段 JavaScript://即 一旦完全加載所有內容(包括圖像、腳本文件、CSS 文件等),就執行一段腳本。
  onLoad: function () {
    if (app.globalData.userInfo) {
      this.setData({
        /* app.globalData.userInfo 能獲取到些啥? */
        /* 官方文檔上有詳情 https://developers.weixin.qq.com/miniprogram/dev/api/open.html#wxgetuserinfoobject*/
        userInfo: app.globalData.userInfo,
        hasUserInfo: true
      })
    } else if (this.data.canIUse){
      // 由於 getUserInfo 是網絡請求,可能會在 Page.onLoad 之後才返回
      // 所以此處加入 callback 以防止這種情況
      app.userInfoReadyCallback = res => {
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    } else {
      // 在沒有 open-type=getUserInfo 版本的兼容處理
      wx.getUserInfo({//****************如果獲取用戶信息成功
        success: res => {
          app.globalData.userInfo = res.userInfo//******結果信息裏 存入獲取到的用戶信息
          this.setData({//******************設置用戶信息
            userInfo: res.userInfo,
            hasUserInfo: true
          })
        }
      })
    }
  },

  //①function(e)傳值
  //②console.log(e)查看事件傳的值有哪些
  getUserInfo: function(e) {
    console.log(e)//console.log在console窗口輸出信息(用於輸出普通信息) 就是你編譯後下面窗口顯示的信息
    app.globalData.userInfo = e.detail.userInfo
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  }
})

<!--index.wxml-->

<!--index.wxml-->
<view class="container">
  <view class="userinfo">

<!--在框架中,使用 wx:if="{{condition}}" 來判斷是否需要渲染該代碼塊:-->
<!--當條件成立小程序頁面纔會渲染這個button,否則就會在頁面上渲染下面的wx:else中的WXML代碼--> 
<!--因爲需要用戶主動觸發才能打開 APP,所以該功能不由 API 來調用,需要用 open-type 的值設置爲 getUserInfo 的 <button> 組件的點擊來觸發。--> 
    <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 點擊獲取頭像暱稱 </button>
      
    <block wx:else>    
    <!--wx:else前面有個block標籤,也很好理解,
      因爲 wx:if/wx:else 是一個控制屬性,需要將它添加到一個標籤上。如果要一次性判斷多個組件標籤,可以使用一個 <block/> 標籤將多個組件包裝起來
      由於wx:else裏有2個標籤(image和text),
      所以需要用block包起來做爲一個整體進行渲染,所以把block理解成塊級元素即可
      -->
    
    <!--在組件中綁定一個事件處理函數-->
    <!--如bindtap,當用戶點擊該組件的時候會在該頁面對應的Page中找到相應的事件處理函數-->
      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    </block>
    <!--</block>不是組件 僅僅是一個包裝元素-->
  </view>

  <!--usermotto 這個類就是wxss的  但是好像沒有獲取到用戶個性簽名啊
  這個不知道什麼情況。。。
  知道了,是會有彈窗的,因爲需要用戶授權你大爺的-->
  <view class="usermotto">

  <!--測試區-->
     <!--<button open-type="usermotto" bindgetuserinfo="usermotto"> 點擊更改簽名 </button>--> 
  <!--測試區-->

  <!--測試區原始數據-->
    <text class="user-motto">{{motto}}</text>
  <!--測試區原始數據-->
  
  </view>
</view>

/**index.wxss**/

/**index.wxss**/
.userinfo {
  /*用戶信息的顯示(也就是暱稱和頭像
  Flex是Flexible Box的縮寫,意爲"彈性佈局",用來爲盒狀模型提供最大的靈活性。*/
  display: flex;

  /*按列方向適應 那麼你的頭像和暱稱 就是上下顯示*/
  /*flex-direction: column;*/
  flex-direction: column;
  /*按列方向適應 那麼你的頭像和暱稱 就是左右顯示*/
  /*flex-direction: row;*/

  /*居中*/
  align-items: center;

  /*(個人添加的) 讓 頭像和暱稱 兩端對齊,項目之間的間隔都相等*/
  justify-content:  space-between;
}

/*****userinfo-avatar  是化身的意思 就是你的頭像
        margin 就是頁邊距的意思
        寫css圓形時總是直接設置border-radius爲50%
          border-radius的值是百分比的話,就相當於盒子的寬度和高度的百分比
          我們知道在一個正方形內做一個面積最大的圓形,這個圓的半徑就爲正方形邊長的一半。
          所以border-radius爲50%時,則會形成圓。100%一樣是實心圓,具體百度*/
.userinfo-avatar {
  width: 160rpx;
  height: 160rpx;

  /*margin 看下面.usermotto裏*/
  margin: 20rpx;

  /*border-radius: 50%; 這個就是原來的圓形*/
  /*border-radius: 60px 60px 0 60px; 花瓣形狀*/
  border-radius: 100%;
}

/*****userinfo-nickname  是暱稱的意思
                        暱稱的顏色可以百度*/
.userinfo-nickname {
  /*color: #FF88C2; 粉色*/
  color:  #551A8B;
}

/*****你要顯示的格言(helloword)的上邊 很奇怪 這個不應該是獲取來的咩
距離上方200個像素。外邊距並不是當前內容與DIV盒子的邊距,而是與外面的(網頁邊框)的距離。
如果是padding-top:57px. 這就是內邊距,與當前DIV盒子的距離*/
.usermotto {
  margin-top: 200px;
  color:  #C71585;/*這裏其實也可以設置顏色*/
}

/* 照理說 應該還有用戶的其他不是很重要的信息
一般的話 1.extend extend 裏有.gender
*/

app.json 不好註釋就來個截圖吧

"enablePullDownRefresh":true,(你們自己複製添加進去,我就不多截圖了)

添加這個字段的話纔可以看到

這個字段的設置"backgroundColor": "#eeeeee",

原因是background需要下拉才能顯示這片區域

 

"backgroundTextStyle": "light",(或者dark)

是使得下拉刷新的loading樣式發生了改變,可以自行嘗試

 

其餘的沒什麼好解釋的,大家可以看看。

wx.canIUse(String)

判斷小程序的API,回調,參數,組件等是否在當前版本可用。
String參數說明: 使用${API}.${method}.${param}.${options}或者${component}.${attribute}.${option}方式來調用,例如:

  1. *${API}代表 API 名字
  2. *${method}代表調用方式,有效值爲return, success, object, callback
     
  3. *${param}代表參數或者返回值
  4. *${options}代表參數的可選值
  5. *${component}代表組件名字
  6. *${attribute}代表組件屬性
  7. *${option}代表組件屬性的可選值

這裏還有一個大佬寫的博客,很詳細,可以多看看

https://blog.csdn.net/wlwlwlwl015/article/details/78868624

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章