小程序

小程序开发技巧

# 生命周期

  1. 组件的生命周期
1. created     生命周期回调—监听页面加载
2. attached	生命周期回调—监听页面显示
3. ready	生命周期回调—监听页面初次渲染完成
4. moved	生命周期回调—监听页面隐藏
5. detached	生命周期回调—监听页面卸载
6. error	每当组件方法抛出错误时执行

# 1.微信小程序 wx:for 自定义 item 和 index 方法

<view wx:for="{{array}}" wx:for-index="myIndex" wx:key="myIndex" wx:for-item="myItem" >
  {{myIndex}}: {{myItem}}
</view>

# 2.参数传递

  • 2.1
<view  bindtap="goNextPage"  data-id="{{1}}" data-name="{{'默认收藏'}}">默认收藏</view>

goNextPage(e) {
    const { id = null, name = ''} = e.currentTarget.dataset
    console.log('id:',id)
    wx.navigateTo({
      url: '/pages/collect/details/index',
    })
}
  • 2.2
<navigator class="d-i-b" url="/pages/privacy/index?type=2" hover-class='none'>
     <text>《xxxxxx》</text>
</navigator>
onLoad(options) {
    if (options.type == 2) {
      this.setData({
        title:'用户协议'
      })
    }
    console.log('options:',options)
  }
  • 2.3 多个参数传递
wx.navigateTo({
      url: '/b页面',
      success: (res)=> {
        res.eventChannel.emit('acceptDataFromOpenerPage', { data: parmas })//参数名字随便起,前后页面对应上即可
)

parmas:说明如下 let parmas = { levelIds: [], //ios 手机不支持数组格式, 可以转成 [].join('、') obj: {} , //ios 手机不支持对象格式,可以转成 json 字符串 pageSize: 20, }

  onLoad(options) {
    const eventChannel = this.getOpenerEventChannel()
    eventChannel.on('acceptDataFromOpenerPage', (data)=> {
        //对发送过来的数据进行处理
      console.log('acceptDataFromOpenerPage:',data)
    })
  }

注意:let arr = [] arr.toString().replaceAll(',', '、'), //arr 是空数组会报错

# 3.底部固定的导航高度 80rpx,下边距只能用 px

page{
  padding-bottom: calc(80px + env(safe-area-inset-bottom))
}

# 4.ios 上页面不能上下滚动,引起的原因有两种:

  • app.json 或者 page.json 里添加"disableScroll": true //禁止页面滚动
  • app.json 设置了"renderer": "skyline"
  • 4.1. 方法一
.notice-wrap{
  overflow-y: scroll;
  height: 100vh;
}
这样不能用微信自带方法监听滚动条
  • 4.2. 方法二,过于麻烦 必须设置 height,height 高度需要计算,窗口高度-状态栏-顶部固定导航条
<scroll-view scroll-y="true" style="height:774px">
  你需要滚动的内容
</scroll-view >
  • 4.3. app.json
"rendererOptions": {
    "skyline": {
      "defaultDisplayBlock": true
    }
}
  • 4.4 page-style 为 overflow: hidden;的时候页面不能滚动,这个方法能保证弹窗时候背景不会滚动穿透
<page-meta page-style="{{ showPopup?  'overflow: hidden;' :''}}">
  <view>不能滚动的内容</view>
</page-meta>

# 5.使用 weui

app.json

"useExtendedLib": {
    "weui": true
}

# 6.懒加载组件

{
  "lazyCodeLoading": "requiredComponents"
}

# 7.初始渲染静态缓存

  • 7.1. 单个组件,组件.json
{
  "initialRenderingCache": "static"  //dynamic 在初始渲染缓存中添加动态内容
}
  • 7.2. 所有页面,app.json
{
  "window": {
    "initialRenderingCache": "static"
  }
}

# 8.在初始渲染缓存中添加动态内容

{
  "initialRenderingCache": "dynamic"  //在初始渲染缓存中添加动态内容
}
Page({
  data: {
    loading: true
  },
  onReady: function() {
    this.setInitialRenderingCache({
      loadingHint: '正在加载' // 这一部分数据将被应用于界面上,相当于在初始 data 基础上额外进行一次 setData
    })
  }
})

# 9.监听用户滑动页面事件。

onPageScroll: function(t) {
  if(t.scrollTop >= 180){
    wx.setNavigationBarColor({
      frontColor: '#000000',
      backgroundColor: '#ffffff'
    })
    app.fadeInOut(this,'fadeAni',1)
  }else{
    wx.setNavigationBarColor({
      frontColor: '#ffffff',
      backgroundColor: '#ffffff'
    })
    app.fadeInOut(this,'fadeAni',0)
  }
}

<navigation id='Navigation' show-search='{{showSearch}}' class="fix-top" animation="{{fadeAni}}"></navigation>

# 10.路由跳转 https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateTo.html

  • 10.1. switchTab 无法传递参数
wx.switchTab({
  url: '/index'
})
  • 10.2. wx.reLaunch(Object object) 关闭所有页面,打开到应用内的某个页面
  • 10.3. wx.redirectTo 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面 无法传递参数
  • 10.4. wx.navigateTo 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层
  • 10.5. wx.navigateBack 关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层
wx.navigateBack({
  delta: 1, //上一页
  fail(e) {
    wx.switchTab({
      url: '/pages/grouponList/main'
    })
  }
})

# 11.自定义导航栏

"window": {
  "navigationStyle": "custom",
  "navigationBarTextStyle": "black"
},

# 12.input 导致 ios 页面上移

https://cloud.tencent.com/developer/article/2244976

# 13.长按复制,ios 上有翻译、搜索

user-select 属性只能在 text 上使用有效

<rich-text  user-select nodes="{{htmlSnip}}"></rich-text>

或者

<text user-select>微信小程序</text>

# 14.页面滚动 wx.pageScrollTo

# 15. 按钮分享

<button open-type='share' type="warn">分享</button>

# 16. 保存到相册

<button class='longSave' bindtap='longSave' type="primary">保存到相册</button>

longSave:function(){
    wx.showLoading({
      title: '请稍等......',
    })
    wxSaveImageToPhotosAlbum({
      filePath:this.data.imagePath
    }).then(res => {
      wx.hideLoading()
      wx.showToast({
        title: '已保存到相册',
      })
    })

}

# 17.远程地址分享、收藏、保存

wx.downloadFile({
      url: 'https://res.wx.qq.com/wxdoc/dist/assets/img/demo.ef5c5bef.jpg',
      success: (res) => {
        wx.showShareImageMenu({
          path: res.tempFilePath
        })
      }
})

# 18. 使用防抖节流, function()不能换成箭头函数,否则无法获取到 this

clickSign:debounce(function() {
    let that = this
    console.log(11111,this)
},300),

# 19. 修改键盘右下角的按钮为搜索,发送,完成,下一个....等按键

https://blog.csdn.net/ke_sin/article/details/106578236

<input confirm-type="search" bindconfirm="startSearch"></input>

search 右下角按钮会变为“搜索”
send 右下角按钮会变为“发送”
next 右下角按钮会变为“下一个”
go 右下角按钮会变为“前往”
done 右下角按钮会变为“完成”

# 20. 分享

<button class="share_list_button" open-type="share">点击按钮分享</button>

 onShareAppMessage(res) {
    console.log('分享只有在手机上才能看到这个打印:',res.target)
    return {
      title: '自定义转发标题',
      path: '/page/user?id=123'
    }
},

# 21.软键盘引起页面上移

70 为固定输入框的盒子高度

<view class="input flex-none" style="height:{{keyboardHeight + 70|| 70}}px">
  <input bind:focus="onInputFocus"  adjust-position="{{false}}" bind:blur="onInputBlur" placeholder="222" />
</view>

 onInputFocus(e) {
    if (e.detail.height) {
      this.setData({
        keyboardHeight: e.detail.height
      })
    }
  },
  onInputBlur() {
    this.setData({
      keyboardHeight: 0
    })
  },

# 22. 瀑布流布局

<view class="row">
  <view class="col">1</view>
  <view class="col">2</view>
</view>

.row{
    overflow: hidden;
    column-count: 2; //每行展示的个数
    column-gap: 2px;//间距
    width: 100%;
}
.col{
    width: 95%;
     display: inline-block;
    background: #fefefe;
    border: 2px solid #fcfcfc;
    box-shadow: 0px 2px 2px rgba(34, 25, 25, 0.4);
    margin: 5px 2px 2px 2px;
    padding: 1px;
    padding-bottom: 5px;
    transition: opacity .4s ease-in-out;

}

# 23. 小程序中使用 web-view 打开 pdf , IOS 可以正常打开;缺点:Android 打开为空白页面

wx.downloadFile({
url: 'https://.../XXX.pdf', //要预览的 PDF 的地址
success: function (res) {
  if (res.statusCode === 200) { //成功
    var Path = res.tempFilePath //返回的文件临时地址,用于后面打开本地预览所用
    wx.openDocument({
      fileType: 'pdf', // 文件类型
      filePath: Path, //要打开的文件路径
      success: function (res) {
        console.log('打开 PDF 成功');
      }
    })
  }
},
fail: function (err) {
  console.log(err); //失败
}
})

# 24. rich-text 小程序富文本

[文档](https://developers.weixin.qq.com/miniprogram/dev/component/rich-text.html)

<rich-text nodes="{{htmlSnip}}"></rich-text>

// 模拟接口取到的内容
const htmlSnip =
`<div class="div_class">
  <h1>Title</h1>
  <p class="p">
    Life is&nbsp;<i>like</i>&nbsp;a box of
    <b>&nbsp;chocolates</b>.
  </p>
  <img  src="https://p3-passport.byteimg.com/img/user-avatar/d5697ed6a5a9481b9fcfc0dd65b5c08f~100x100.awebp" >
</div>
`

Page({
  data: {
    htmlSnip:htmlSnip
  },
  onReady() {
    this.addBarrage()
  },

  onLoad(){
   // 给字符串中的所有img设置样式
    let replaceImgStyle = htmlSnip.replace('<img ', '<img style="max-width:100%;height:auto;display:block;margin:10px 0;"')
    this.setData({
      htmlSnip: replaceImgStyle
    })
  }
})

# 25. 返回上个页面并传参

Page({
	goBackPage(e) {
        let pages = getCurrentPages();//获取page
        let prevPage = pages[pages.length-2];//上一个页面(父页面)
        console.log('prevPage',prevPage)
        //直接调用上一个页面的setData()方法,把数据存到上一个页面中去,oneselfAddress此参数必须在上一页面中的data声明定义。否则传递失败。
        prevPage.setData({
          oneselfAddress:'hahah'
        })
        wx.navigateBack({
          delta: 1
    })
  }
})

  onShow() {
    console.log('onShow',this.data.oneselfAddress)
    let pages = getCurrentPages();
    let currPages = pages[pages.length-1]//当前页面
    console.log('接收自提地址',currPages)
  },

# 26.父页面跳转之前使用 redirectTo, 子页面跳转也使用 redirectTo

goNextPage() {
    wx.redirectTo({
      url: `/pages/sun?taskStudentId=${this.data.playObj.id}`,
    })
  }
goNextPage() {
    wx.redirectTo({
      url: `/pages/father?taskStudentId=${this.data.playObj.id}`,
    })
  }
上次更新: