小程序

168 阅读5分钟

引入第三方包

微信小程序支持 echarts, 微信小程序加载 echarts 引入 echarts

微信小程序引入

github 地址

echarts 体积过大的时候, 采用压缩, 不要下最新的, 下 5.0 就行了

echarts 刷新功能, 通过调用 setOptions 方法

引用 vant weapp

npm init -y 创建package.json
npm i -s 安装vant
点击详情, 默认使用npm模块
点击工具, 构建npm, 每次安装新的npm包的时候都要构建一下
在.json文件中的, userComponents中注入

  • 修改 vant 的样式
<van-search  backgroun="#aaa" />
<!-- 覆盖样式 -->
去页面上面, 选中类名, 然后在wxss里面覆盖掉, 使用 !important

组件

组件创建

去 components 中创建一个组件, 会自动生成模板, 组件生命周期和页面的生命周期不相同

发送事件

methods: {
    hadnleRightClick() {
        this.triggerEvent("click")
    }
}

bind:click="handleClick"

组件监听事件

this.triggerEvent("父组件自定义事件的名称", 要传递的参数)

<list-item bind:change="handleChange" ></list-item>
点击事件 bindtap

传值

<child-com count="{countData}">

接受
properties: {
    count: {
        type: "",
        value: ""
    }
}

小程序属性想要获取绑定后的值

通过 data-jidjj="" 的形式来获取
const idx = event.target.dataset.idx

指令用法

循环

wx:for="{{arr}}" key="*this"
默认有item, index, 对象的时候有差异

显示

wx:if = {{true}}

生命周期

app 生命周期

app.js

  • onLaunch 第一次启动的时候触发
  • onShow 页面被用户看到 -- 对数据或页面进行重置
  • onHide 页面隐藏 -- 暂停或者清除定时器
  • onError 应用代码发生报错触发 -- 在应用发生代码报错的时候,收集用户的错误信息,通过异步请求将错误的信息发送后台去
  • onPageNotFound 页面找不到 -- 应用第一次启动的时候,如果找不到第一个入口页面才会触发, 只有第一次进不去才会触发

页面生命周期

  • onLoad
  • onShow

刷新

上拉刷新

onReachBottom() {
    // 如果没有更多数据的时候, 应该return掉
}

一个是 page 自带的下拉触底钩子事件 onReachBottom 能做的只是下拉到底部的时候通知你触底了,一个是 scroll-view 标签自带事件

下拉刷新

json 中配置

enablePullDownRefresh: true

onPullDownRefresh() {
    // 加载新数据, 把一些状态还原

    // 停止下拉刷新
    wx.stopPullDownRefresh()
}

顶部 navigation 自定义

需要去.json 里面开启自定义 "navigationStyle": "custom" 这样就没有默认的头部, 需要自己写

图片上传

    uploadPhoto() {
        var that = this;
        wx.chooseImage({
            count: 1, // 默认9
            sizeType: ["compressed"], // 可以指定是原图还是压缩图,默认二者都有
            sourceType: ["album", "camera"], // 可以指定来源是相册还是相机,默认二者都有
            success: function(res) {
                // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
                var tempFilePaths = res.tempFilePaths;
                upload(that, tempFilePaths);
            },
        });
    },
});

function upload(page, path) {
    wx.showToast({
            icon: "loading",
            title: "正在上传",
        }),
        wx.uploadFile({
            url: constant.SERVER_URL + "/FileUploadServlet",
            filePath: path[0],
            name: "file",
            header: {
                "Content-Type": "multipart/form-data",
            },
            formData: {
                //和服务器约定的token, 一般也可以放在header中
                session_token: wx.getStorageSync("session_token"),
            },
            success: function(res) {
                console.log(res);
                if (res.statusCode != 200) {
                    wx.showModal({
                        title: "提示",
                        content: "上传失败",
                        showCancel: false,
                    });
                    return;
                }
                var data = res.data;
                page.setData({
                    //上传成功修改显示头像
                    src: path[0],
                });
            },
            fail: function(e) {
                console.log(e);
                wx.showModal({
                    title: "提示",
                    content: "上传失败",
                    showCancel: false,
                });
            },
            complete: function() {
                wx.hideToast(); //隐藏Toast
            },
        });
}

跳转

wx.navigateTo({
    url: "/djfid/df?id=344"
})

// 获取跳转过来的id
onLoad(params) {
    console.log(params.id)
}

// tab切换跳转
wx.switchTab({
    url: '/page/page'
})

共享数据

app.js 中共享, 但是数据不是响应式的

  1. mitt 事件总线库, 只会发和接数据, 不能存储共享数据

小程序解决方案

  1. 放到 app.js 中的 global, 数据不是响应式的

状态管理工具

文档 gitee.com/ElenaK/hy-e…

安装 npm i hy-event-store TJ

import { HYEventStore } from 'hy-event-store'

const eventStore = new HYEventStore({
  state: {
    upRanking: {},
  },
  actions: {
    getRankingsAction(ctx) {},
  }
})

export default eventStore

// 使用方法
eventStore.setState("playIndex", index) // 设置state中的值
eventStore.onState("hotRanking", this.hotRankingHanlder) // 监听state中的值, 并且触发某些方法

eventStore.dispatch("getRankingsAction") // 触发action
eventStore.offState("hotRanking", this.hotRankingHanlder) // 卸掉监听

setData

setData 是同步的, 但是对页面进行渲染的过程是异步的 react 在大部分情况下, setState 是异步的, 为了保证 data 里面的数据始终和页面以及组件中的数据保持一致

存储数据

1. 通过本地存储

const logs = wx.getStorageSync('logs')
wx.setStorageSync('logs', logs)

2. 通过app.js中的 globalData 存储

globalData: {}

微信支付

  1. 创建订单

    • 先获取用户登录成功后的 token 值 -- 调用后端接口 前四个参数通过 button 的 open-type 中获取, 最后一个通过 wx.login 获取,跳转页面,点击按钮获取想要信息

    1. 调用获取用户信息按钮, 拿到前四个参数

    2. 调用登录接口获取信息

    3. 封装优化回调

      优化后的代码

      完整步骤

      调用后台接口拿到订单编号

  2. 预支付 接口

  3. 返回数据

  4. 调用微信内支付,上面的数据用于这一步的参数

  5. 发起微信支付 返回支付成功或者失败

  6. 查询订单 调用接口,看看后台是否真的成功了,跳转到订单页面

其余需要注意部分

获取系统参数

wx.getSystemInfoSync();

获取某个 DOM

const query = wx.createSelectQuery();
query.select('.swiper-image').boundingClientReact();

插槽实现默认插入值

插槽不能默认值
实现方案: 通过一个伪类选择器
<view class="slot">
    <slot></slot>
</view>
<view class="default">
    <text>rightText3</text>
</view>
.header .slot:empty + .default {
    display: block;
    // 当里面为空的时候进行一些处理
}
.header .default {
    display: none;
}

引入 script 脚本

we-script

watch 使用

页面需要单独注入 www.jianshu.com/p/34c2403a7…

组件中集成得有 blog.csdn.net/m0_63466615…

// 只有组件里面才能监听
observers: {
'popShow': function(val) {}
},

封装 base-echarts

类似 filter 解决方案

通过 wxs 不支持 es6 语法

<!-- wxs -->
<!-- 比如保留两位小数 -->
<!-- utils/format.wxs -->

function parseNum(val) {
    var value =  val+""
    return value.toFix(2)
}
module.exports = {
    parseNum: parseNum
}

使用

<wxs src="../../utils/format.wxs" module="format"></wxs>

<view>
    {{format.parseNum('343.34343')}}
</view>

微信复制

  /**
   * 复制
   */
  copyText(e) {
      wx.setClipboardData({
          data: e.currentTarget.dataset.text,
          success(res) {
              console.log("success -> res", res)
          }
      })
  },

返回上一页面并传参

// 直接调用它返回即可
_returnToPreviousPage() {
    let pages = getCurrentPages();
    let prevPage = pages[pages.length - 2];
    if (prevPage) {
        prevPage.setData({
            isRresh: true
        })
    }
},

事件穿透, 事件冒泡将 bindtap 改为 catchtap

关于微信小程序报错 微信小程序 Cannot read property 'mark' of undefined 由于没有打开扩展不支持 async

注意在 less 中如果使用 calc 的时候, 编译会出问题,所以需要原样输出

不能用 background

所有与图片相关的都用 image image 用几种用法:

  • aspectFill
  • aspectFit
  • scaleToFill
  • widthFix

图片预览有专门的方法

wx.previewImage

导入样式

  1. 只能用 @import
  2. 只能使用相对路径

长按文字复制

只能通过 text 标签, 并且 user-select 属性设置为 true

swiper 会有一个默认高度, 不会由内容自动撑开

本文由博客一文多发平台 OpenWrite 发布!