原生小程序 ### 笔记

183 阅读7分钟

面试雷区:

toast 有Icon的时候最多只能显示7个字 想换行显示Icon设置为'none'
小程序在onload( === created)生命周期当中来获取跳转的时候传递的参数
小程序页面栈最多10层

app.json 全局配置项:

pages 里面哪个第一个,哪个就是首页
"pages": [
    "pages/index/index",
    "pages/logs/logs",
    "pages/list/list",
    "pages/uc/uc",
    "pages/setting/setting",
    "pages/test/test"
  ],
tabBar: 底部导航栏 list里面第一个必须是首页里面的list最多能配置(2-5个底部导航)iconPath:底部导航图片不支持网络图片(只支持本地图片)目的:确保用户进来就能看到; 小程序tab页面之间是不能使用wx.navigateTo()跳转的会报错 只能通过wx.switchTab()
  "tabBar": {
    "color": "#ccc",
    "backgroundColor":"#e5ffe5",
    "selectedColor":"#000",
    "list": [
      {
        "text": "首页",
        "pagePath": "pages/index/index",
        "iconPath": "./assets/imgs/_水果.png",
        "selectedIconPath": "./assets/imgs/_水果 (1).png"
      },
      {
        "text": "用户最新",
        "pagePath": "pages/uc/uc",
        "iconPath": "./assets/imgs/木瓜.png",
        "selectedIconPath": "./assets/imgs/木瓜 (1).png"
      },
      {
        "text": "配直",
        "pagePath": "pages/setting/setting",
        "iconPath": "./assets/imgs/葡萄.png",
        "selectedIconPath": "./assets/imgs/葡萄 (1).png"
      }
    ]
  },
小程序的重定向 对首页进行限制 无论怎么重定向还是能回到首页 其他页面可以实现正常重定向功能
自定义顶部通栏样式
  • 取消自带顶部通栏
/setting.json

{
  "usingComponents": {},
  "enablePullDownRefresh": true, //支持下拉刷新
  "navigationStyle": "custom" //支持自定义顶部通栏
}
  • 通过API获取相应高度再进行计算
/setting.js

  onShow() {
    this.getHeight()
  },
  
  async getHeight() {
    // statusBarHeight 状态栏高度
    const { statusBarHeight } = await wx.getSystemInfo()
    console.log('statusBarHeight', statusBarHeight);
    //得到胶囊高度+胶囊距离顶部距离
    const { height, top } = await wx.getMenuButtonBoundingClientRect();
    console.log('胶囊高度 距离顶部高度', height, top);
    // 间隔高度 = 距离顶部高度 - 状态栏高度
    const intervalHeight = top - statusBarHeight
    //顶部通栏高度 =  胶囊距离顶部高度 + 胶囊高度
    const finallyHeight = top + intervalHeight + height
    console.log('finallyHeight', finallyHeight);
    this.setData({
      finallyH: finallyHeight,
      pd: statusBarHeight,
      lh: height + 2 * intervalHeight
    })
  },
/setting.wxss 

.top{
  box-sizing: border-box;
  text-align: center;
  background-color: red;
  box-shadow: 2px 3px 3px rgba(0, 0, 0, .3);
}
/setting.wxml

<view class="top" style="height: {{finallyH}}px; padding-top: {{pd}}px; line-height: {{lh}}px;">顶部通栏</view>

QQ图片20221229193858.png

轻提示代码封装

developers.weixin.qq.com/miniprogram…

const toast = (title, icon = 'none') => {
  wx.showToast({
    title,
    icon,
  })
}
  myToast(){
    toast('我是请提示,后面放假,姐姐啊哈哈哈哈哈哈','success')
  },
网络请求的进阶
  • 青铜局
getList() {
    //传统写法
    //const that = this
    wx.request({
      url: 'https://cnodejs.org/api/v1/topics',
      method: 'GET',
      //使用箭头函数 访问外界的this
      success: (res) => {
        console.log(res);
        this.setData({
          dataList: res.data.data
        })
      }
    })
  },
  • 钻石局(一层封装)
const baseUrl = 'https://cnodejs.org/api/v1'
const request = function (url, method, data) {
  return new Promise((resolve, reject) => {
    wx.request({
      url: baseUrl + url,
      method,
      data,
      success(res) {
        resolve(res)
      },
      fail(err) {
        reject(err)
      }
    })
  })
}

module.exports = {
  request
}
const { request } = require('../../api/index')

  async getList1() {
    const res = await request('https://cnodejs.org/api/v1/topics','GET')
    console.log(res);

    this.setData({
      dataList: res.data.data
    })
  },
  • 星耀局(两层封装)
const baseUrl = 'https://cnodejs.org/api/v1'
const request = function (url, method, data) {
  return new Promise((resolve, reject) => {
    wx.request({
      url: baseUrl + url,
      method,
      data,
      success(res) {
        resolve(res)
      },
      fail(err) {
        reject(err)
      }
    })
  })
}
const $api = {
  get(url, data) {
    return request(url, 'GET', data)
  },
  post(url, data) {
    return request(url, 'POST', data)
  },
  ...
}
module.exports = {
  $api
}
const { $api } = require('../../api/index')

  async getList1() {
    const res = await $api.get('topics')
    console.log('res', res);
    this.setData({
      dataList: res.data.data
    })
  },
  • 王者局(三层封装)
const baseUrl = 'https://cnodejs.org/api/v1'
const request = function (url, method, data) {
  return new Promise((resolve, reject) => {
    wx.request({
      url: baseUrl + url,
      method,
      data,
      success(res) {
        resolve(res)
      },
      fail(err) {
        reject(err)
      }
    })
  })
}
const $api = {
  get(url, data) {
    return request(url, 'GET', data)
  },
  post(url, data) {
    return request(url, 'POST', data)
  },
  ...
}
module.exports = {
  $api
}
const { $api } = require('./index')

const getList = () => {
  return $api.get('topics');
}

module.exports = {
  getList
}
const { getList } = require('../../api/newIndex')

  async getList1() {
    const res = await getList()
    console.log('res', res);
    this.setData({
      dataList: res.data.data
    })
  },
激励广告
page({
   onLoad() {
    if (wx.createRewardedVideoAd) {
      //wx.createRewardedVideoAd 返回值是:RewardedVideoAd 激励广告
      rewardedVideoAd = wx.createRewardedVideoAd({ adUnitId: 'xxxx' })
      //监听激励视频广告加载事件
      rewardedVideoAd.onLoad(() => {
        console.log('onLoad event emit')
      })
      //监听激励视频错误事件。
      rewardedVideoAd.onError((err) => {
        console.log('onError event emit', err)
      })
      //监听用户点击 关闭广告 按钮的事件。
      rewardedVideoAd.onClose((res) => {
        console.log('onClose event emit', res)
        //isEnded 视频是否是在用户完整观看的情况下被关闭的
        const { isEnded } = res
        //视频是否播放结束、可以向用户下发奖励
        if (isEnded) {
          //@todo 获得积分数据交互
          console.log('奖励用户');
        }
      })
    }
  },
  showVideoAd() {
    // 用户触发广告后,显示激励视频广告
    if (rewardedVideoAd) {
      rewardedVideoAd.show().catch(() => {
        // 失败重试
        //加载激励视频广告
        rewardedVideoAd.load()
          //显示激励视频广告。激励视频广告将从屏幕下方推入
          .then(() => rewardedVideoAd.show())
          .catch(err => {
            console.log('激励视频 广告显示失败')
          })
      })
    }
  },
})
小程序配置项
/全局配置项
/app.json

{
  "pages": [
    "pages/index/index",
    "pages/logs/logs",
    "pages/list/list",
    "pages/uc/uc",
    "pages/setting/setting",
    "pages/test/test"
  ], //路由配置 新建页面时,检查是否会自动生成
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#ff6700",
    "navigationBarTitleText": "KFC",
    "navigationBarTextStyle": "white"
  },
  "tabBar": {
    "color": "#ccc",
    "backgroundColor":"#e5ffe5",
    "selectedColor":"#000",
    "list": [
      {
        "text": "首页",
        "pagePath": "pages/index/index",
        "iconPath": "./assets/imgs/_水果.png",
        "selectedIconPath": "./assets/imgs/_水果 (1).png"
      },
      {
        "text": "用户最新",
        "pagePath": "pages/uc/uc",
        "iconPath": "./assets/imgs/木瓜.png",
        "selectedIconPath": "./assets/imgs/木瓜 (1).png"
      },
      {
        "text": "配直",
        "pagePath": "pages/setting/setting",
        "iconPath": "./assets/imgs/葡萄.png",
        "selectedIconPath": "./assets/imgs/葡萄 (1).png"
      }
    ]
  }, //底部导航栏配置
  "style": "v2",
  "sitemapLocation": "sitemap.json"
}
/页面配置项
/setting.json

{
  "usingComponents": {},
  "navigationBarTitleText": "哈哈哈",
  "enablePullDownRefresh": true, //开启下拉刷新
  "navigationStyle": "custom", //自定义顶部通栏
}
基本生命周期
// pages/list/list.js
Page({

  /**
   * 页面的初始数据
   */
  data: {

  },

  /**
   * 生命周期函数--监听页面加载
   */
  // === created()
  //小程序在onload生命周期当中来获取跳转的时候传递的参数
  onLoad(options) {
    console.log('options',options);
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})
地图组件

developers.weixin.qq.com/miniprogram…

lbs.qq.com/

<map style="width: 100%; height:300px" markers="{{mas}}" latitude="{{23.21911}}" longitude="{{113.305801}}" polyline="{{pline}}" scale="15"></map>
data:{
    mas: [{ latitude: 23.21911, longitude: 113.305801 }, { latitude: 23.220297, longitude: 113.306349 }, { latitude: 23.222387, longitude: 113.298223 }, { latitude: 23.216476, longitude: 113.293526 }, { latitude: 23.213774, longitude: 113.304951 },],
    pline: [{ points: [{ latitude: 23.220297, longitude: 113.306349 }, { latitude: 23.222387, longitude: 113.298223 }, { latitude: 23.216476, longitude: 113.293526 }, { latitude: 23.213774, longitude: 113.304951 }, { latitude: 23.220297, longitude: 113.306349 },], color: '#ff6700', width: 5 },],
  },
}

QQ图片20221229193518.png

携带参数-通过jquery的方式来实现 /path?key=value&key=value
获取参数-小程序在onload生命周期当中来获取跳转的时候传递的参数-查看是在左下角
小程序大小限制 轻易不引用第三方插件 小程序代码不能超过20M 单个分包不超过2M
服务号:网页版本 H5页面(最早的版本 支持支付能力,在小程序出现之前)一个月群发发送四次
订阅号:不具备支付能力 文章 每天可群发一次 一次发十条 订阅消息,发送推文
小程序:网页支持硬件少 小程序在手机跑支持硬件多 

开发流程:
新建;
项目名称:XXX; 
(源码放置)目录:XXXAPPID:点击测试号(练手) 可修改;
后端服务:暂时不使用云开发(以后趋势云开发);
模板选择:暂时JS;

模拟器:提供真实的模拟效果;
编辑器:提供原生VSC编辑界面 可以使用我们自己的VSC;
调试器:F12;

***目录结构***:
pages:存放页面;(可改)
utils:工具 方便我们定义方法 模块导入 模块导出;(可改)
app.js 整个小程序入口 不可改 作用:就是调用APP()
app.json 告诉整个小程序 有哪几个页面 也就是路由表(配置文件路径)
app.wxss 样式文件 全局样式文件 (CSS内容)
project.config.json: 编辑器相关的配置文件 针对项目配置 基本不需要改动
剩余两个 轮不到我们更改

/index
.js 逻辑      === <script>
.json 配置部分 === Vue2的配置API
.wxml 模板 === <template>
.wxss 样式  === <style>

****配置语法 === 类似Vue2语法
除了 状态 要声明在 data ,其余随便

Page({})  传入一个对象 这个对象就是配置API
{
   data:{
	a: 'XXX',
	b:true,
	c:'kfc',
	d:[
	{id:1},
	{id:2},
	]
	},  //无需函数返回
	fn1(e){
	   console.log('1122' , e) //e就是事件对象
	},
}

****模板****
<view> {{ a }} </view>
指令 wx:if="{{ b }}"
<view wx:if="{{ b }}"> 是否渲染 </view>
class
<view class="{{ c }}"> 是否渲染 </view>
遍历 默认变量名 item 默认索引值 index
<view wx:for="{{d}}">{{index}} {{item.id}} </view>
改变变量名 改变索引值
<view wx:for="{{d}}" wx:for-item="kkk" wx:for-index="idx">{{idx}} {{kkk.id}} </view>
事件的绑定 (小程序就是移动端,不可能是点击)bindtap:触碰  就只能等于函数名
<button bindtap="fn1">我是小程序艾纽<button>

****调试方式****
预览:右上角三个点 开发模式 开始调试
真机调试:会有一个调试界面

****功能****
扫一扫
地图
获取设备信息
生物认证(指纹,人脸) 
蓝牙低功耗(快递员开单) 
NFC(触碰开门) 
电量 
获取网络状态(提示用户网络状态 提示用户网络状态)
电话(传一个手机号码)
罗盘指向
设备方向
震动
广告:
激励广告(看多少秒 就有奖励 ) load() show() 看完会有回调 小游戏赚钱方式看够时间就赚钱
插屏广告 非强制用户看