微信小程序-及反向解包

1、分享朋友、朋友圈

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
      wx.showShareMenu({
        withShareTicket: true,
        menus: ['shareAppMessage', 'shareTimeline'],
      })
  },
    /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {
    return {
      title: 'title',
      imageUrl: '../../images/xcht_share.png',
      path: `pages/custoTts/custoTts?selectFeelingInfo=${encodeURIComponent(JSON.stringify(selectFeelingInfo))}`  // 注:这边传值obj
    }
  },

  /**
   * 用户点击右上角分享朋友圈-目前安卓适用,ios不支持
   */
  onShareTimeline() {
    return {
      title: 'title',
      imageUrl: '../../images/xcht_share.png',
      query: `selectFeelingInfo=${encodeURIComponent(JSON.stringify(selectFeelingInfo))}`
    }
  },

2、分享链接url带参过长处理

// encodeURIComponent(JSON.stringify(obj))为跳转url时的转换方法 (见上1)
// JSON.parse(decodeURIComponent(options.obj))为接收参数页面的转换方法
onLoad(options) {
	let selectFeelingInfo = JSON.parse(decodeURIComponent(options.selectFeelingInfo))
}

3、先后顺序

async composeCommit() {
    let canPlay = await this.isCanPlay(this.data.selectFeelingInfo.defaultDemoSentence)
    if(canPlay == true) return
    // 执行下面程序,如果不写 promise async await 就会优先执行下面内容
}isCanPlay(word) {
    return new Promise((resolve, reject) => {
      wx.request({
        url: `接口url`,
        method: 'GET',
        success(res) {
          if(res.statusCode === 200) {
            resolve(res)
          } else {
            reject(res)
          }
        },
        fail(res) {
          reject(res)
        }
      })
    })
  },

4、关于音频播放这件事

const innerAudioContext = wx.createInnerAudioContext()
/**
* 播放
*/
composeCommit() {
	innerAudioContext.src = '......'  // 声音地址类似于mp3
	innerAudioContext.play()  // 播放
	innerAudioContext.onEnded(() => {  // 监听音频自然播放至结束的事件
       _this.falseIsPlay()
    })
    innerAudioContext.onStop(() => {  // 监听音频停止事件
       _this.falseIsPlay()
    })
   	innerAudioContext.onPlay(() => {  // 监听音频播放事件
       _this.setData({
        isPlaying: true
       })
    })
}

  /**
   * 停止播放
   */
  stopPlay() {
    innerAudioContext.stop()
    innerAudioContext.src = ''
  },

5、下载上传复制

  /**
   * 下载
   */
  downFileMpga() {
    const _this = this
    wx.downloadFile({
      url: `//下载得接口`,
      success(res) {
        if(res.statusCode === 200) {
          wx.uploadFile({
            filePath: res.tempFilePath,   // 将下载得文件地址写入
            name: 'file',
            url: `//上传文件的接口`,
            header: {
              'Content-Type': 'multipart/form-data'
            },
            formData: {
              file: JSON.stringify(res.tempFilePath)
            },
            success(res) {
              let messageData = JSON.parse(res.data)
              if(res.statusCode === 200) {
                wx.setClipboardData({  // 将内容复制下来
                  data: messageData.data,
                  success(res) {
                   // success
                  }
                })
              } else {
                // fail
              }

            },
            fail(res) {
            	console.log(res)
            },
            complete(res) {
            	console.log(res)
            }
          })
        } else {
         //
        }
      },
      complete(res) {
      	console.log(res)
      }
    })
  },

6、小程序实现watch

const watch = require('../../utils/watch')
onLoad: function (options) {
  watch.setWatcher(this)  // 设置监听器,建议在onLoad下调用
},
watch: {},

//watch.js

/**
 * 设置监听器 watch.js
 */
export function setWatcher(page) {
  let data = page.data;
  let watch = page.watch;
  Object.keys(watch).forEach(v => {
    let key = v.split('.'); // 将watch中的属性以'.'切分成数组
    let nowData = data; // 将data赋值给nowData
    for (let i = 0; i < key.length - 1; i++) { // 遍历key数组的元素,除了最后一个!
      nowData = nowData[key[i]]; // 将nowData指向它的key属性对象
    }
    let lastKey = key[key.length - 1];
    // 假设key==='my.name',此时nowData===data['my']===data.my,lastKey==='name'
    let watchFun = watch[v].handler || watch[v]; // 兼容带handler和不带handler的两种写法
    let deep = watch[v].deep; // 若未设置deep,则为undefine
    observe(nowData, lastKey, watchFun, deep, page); // 监听nowData对象的lastKey
  })
}
/**
 * 监听属性 并执行监听函数
 */
function observe(obj, key, watchFun, deep, page) {
  var val = obj[key];
  // 判断deep是true 且 val不能为空 且 typeof val==='object'(数组内数值变化也需要深度监听)
  if (deep && val != null && typeof val === 'object') {
    Object.keys(val).forEach(childKey => { // 遍历val对象下的每一个key
      observe(val, childKey, watchFun, deep, page); // 递归调用监听函数
    })
  }
  let that = this;
  Object.defineProperty(obj, key, {
    configurable: true,
    enumerable: true,
    set: function (value) {
      watchFun.call(page, value, val); // value是新值,val是旧值
      val = value;
      if (deep) { // 若是深度监听,重新监听该对象,以便监听其属性。
        observe(obj, key, watchFun, deep, page);
      }
    },
    get: function () {
      return val;
    }
  })
}
module.exports = {
  setWatcher: setWatcher
}

7、微信小程序父组件像子组件传值,子组件改变父组件的值
//父组件
json中引入组件

{
  "usingComponents": {
    "shareTip": "../../../components/shareTip/shareTip"
  }
}

wxml中

// 子组件触发"closePopup"事件,调用"onClosePopup"方法 注意固定写法:bind + 事件 = on + 固定事件
<shareTip showPop="{{showPop}}" bindclosePopup="onClosePopup"/>

js中

  data: {
  	showPop: true
  },
  onClosePopup(e) {
    console.log("eeeee", e.detail)
  }

子组件
json

"component": true,

js

Component({
  properties: {
    showPop: {
      type: Boolean
    }
  },

  methods: {
    closePopup() {
      console.log("closePopup")
      //触发父组件的方法triggerEvent,注意固定写法: this.triggerEvent('事件名', 传递值)
      this.triggerEvent('closePopup', 'ddddd')
    },
  }
})

wxml中

<view bindtap="closePopup"></view>

8、父组件执行子组件事件

<shareTip id="shareTip" showPop="{{showPop}}" bindclosePopup="onClosePopup"/>

// closePopup子组件函数
this.selectComponent('#shareTip').closePopup()

https://jiangsihan.cn/archives/xcx-nx

你可能感兴趣的:(微信小程序,小程序)