IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 小程序学习第五天(云开发,behaviors,computed计算属性,工程优化 ,发布上线) -> 正文阅读

[移动开发]小程序学习第五天(云开发,behaviors,computed计算属性,工程优化 ,发布上线)

 

一、云开发

wxml

<!--pages/index/index.wxml-->
<view class="container">
 ? ?<input type="text" model:value="{{phone}}" bindinput="input" placeholder="请输入账号"/>
 ? ?<input type="text" model:value="{{pass}}" bindinput="input" placeholder="请输入密码"/>
 ? ?<image src="{{img}}"></image>
?
 ? ?<button bindtap="chooseImage">选择图片</button>
 ? ?<button bindtap="addFile">add-file</button>
 ? ?<button bindtap="add">add</button>
 ? ?<button bindtap="get">get</button>
 ? ?<button bindtap="update">update</button>
 ? ?<button bindtap="remove">remove</button>
</view>
?
<view wx:for="{{arr}}">
 ?  {{item.phone}}--- <image src="{{item.fileID}}"></image>
 ? ?<button size="mini" bindtap="getOne" data-id="{{item._id}}">详情</button>
 ? ?<button size="mini" bindtap="updateOne" data-id="{{item._id}}">修改</button>
?
</view>
 
?

js

// 1)获取数据库的引用
let db = wx.cloud.database()
// console.log(db);
?
Page({
?
 ? ?/**
 ? ? * 页面的初始数据
 ? ? */
 ? ?data: {
 ? ? ? ?phone:"",
 ? ? ? ?pass:"",
 ? ? ? ?arr:[],
 ? ? ? ?img:""
 ?  },
 ? ?onShow(){
 ? ? ? ?this.get()
 ?  },
 ? ?input(){},
 ? ?add(){
 ? ? ? ?// 获取输入值
 ? ? ? ?let phone = this.data.phone
 ? ? ? ?let pass = this.data.pass
?
 ? ? ? ?// 执行添加数据
 ? ? ? ?db.collection('a-c').add({
 ? ? ? ? ? ?data:{
 ? ? ? ? ? ? ? ?// 字段名称:存储的数据
 ? ? ? ? ? ? ? ?phone:phone,
 ? ? ? ? ? ? ? ?pass:pass
 ? ? ? ? ?  },
 ? ? ? ? ? ?success:res=>{
 ? ? ? ? ? ? ? ?console.log(res);
 ? ? ? ? ? ? ? ?if(res._id){
 ? ? ? ? ? ? ? ? ? ?wx.showToast({
 ? ? ? ? ? ? ? ? ? ? ?title: '添加成功',
 ? ? ? ? ? ? ? ? ?  })
?
 ? ? ? ? ? ? ? ? ? ?this.get()
 ? ? ? ? ? ? ?  }
 ? ? ? ? ?  }
 ? ? ?  })
 ?  },
 ? ?get(){
 ? ? ? ?// 小程序端获取 数据最多只能返回20条
 ? ? ? ?// 云函数端获取 数据做多只能返回100条
?
 ? ? ? ?// 获取多条数据 {}
 ? ? ? ?db.collection('a-c').where({}).get({
 ? ? ? ? ? ?success:res=>{
 ? ? ? ? ? ? ? ?console.log(res);
 ? ? ? ? ? ? ? ?this.setData({
 ? ? ? ? ? ? ? ? ? ?arr:res.data
 ? ? ? ? ? ? ?  })
 ? ? ? ? ?  }
 ? ? ?  })
?
 ?  },
 ? ?getOne(e){
 ? ? ? ?// console.log(e);
 ? ? ? ?let id = e.target.dataset.id
 ? ? ? ?// doc _id
 ? ? ? ?db.collection('a-c').doc(id).get({
 ? ? ? ? ? ?success:res=>{
 ? ? ? ? ? ? ? ?console.log(res);
 ? ? ? ? ? ? ? ?
 ? ? ? ? ?  }
 ? ? ?  })
 ?  },
 ? ?update(){
 ? ? ? ?// 修改多条 where{}.update局部更新 
 ? ? ? ? db.collection('a-c').where({"pass":"11"}).update({
 ? ? ? ? ? ? data:{
 ? ? ? ? ? ? ? ? pass:"123"
 ? ? ? ? ? ? },
 ? ? ? ? ? ? success:res=>{
 ? ? ? ? ? ? ? ? console.log(res);
 ? ? ? ? ? ? }
 ? ? ? ? })
?
 ? ? ? ?
 ?  },
 ? ?updateOne(e){
 ? ? ? ?let id = e.target.dataset.id
 ? ? ? ?// 修改一条 doc(_id).update()/set()重新设置
 ? ? ? ?db.collection('a-c').doc(id).update({
 ? ? ? ? ? ?data:{
 ? ? ? ? ? ? ? ?pass:"11"
 ? ? ? ? ?  },
 ? ? ? ? ? ?success:res=>{
 ? ? ? ? ? ? ? ?console.log(res);
 ? ? ? ? ?  }
 ? ? ?  })
 ? ? ? ?// db.collection('a-c').doc(id).set({
 ? ? ? ?// ? ? data:{
 ? ? ? ?// ? ? ? ? pass:"11"
 ? ? ? ?// ? ? },
 ? ? ? ?// ? ? success:res=>{
 ? ? ? ?// ? ? ? ? console.log(res);
 ? ? ? ?// ? ? }
 ? ? ? ?// })
 ? ? ? ?
 ?  },
 ? ?remove(){
 ? ? ? ?// 删除多条 where({}).remove()
 ? ? ? ? db.collection("a-c").where({"pass":"123"}).remove()
 ? ? ? ? .then(res=>{
 ? ? ? ? ? ? console.log(res);
 ? ? ? ? })
 ?  },

2.云函数

一次最多可以获取100条数据,小程序端20条

可以直接返回openid----用户的唯一标识,appid等

小程序调用云函数:

remove(){
?
 ? ? ? ?// 调用云函数
 ? ? ? ?wx.cloud.callFunction({
 ? ? ? ? ? ?name:"remove",//云函数名称
 ? ? ? ? ? ?data:{//传参
 ? ? ? ? ? ? ? ?collection:"a-c",
 ? ? ? ? ? ? ? ?where:{"pass":"123"}
 ? ? ? ? ?  },
 ? ? ? ? ? ?success:res=>{
 ? ? ? ? ? ? ? ?console.log(res);
 ? ? ? ? ?  }
 ? ? ?  })
 ?  }

云函数端--运行在云端的代码--后台代码

本地代码:每次修改记得上传到云端

// 云函数入口文件
const cloud = require('wx-server-sdk')
?
cloud.init({
 ? ?env: "dev-wmunf"
})
?
// 云函数入口函数
exports.main = async (event={}, context) => {
 ? ?// event 接收传递的参数  context 云函数的运行情况
 ? ?// const wxContext = cloud.getWXContext()
?
 ? ?let db = cloud.database()
 ? ?// 删除多条  必须放在云函数段删除
 ? ?let res = await db.collection(event.collection).where(event.where).remove()
 ? ? 
?
 ? ?return {
 ? ? ? ?res,
 ? ? ? ?event, //默认注入appid openid
?
 ?  }
}

3.云存储

1.先获取临时图片路径

chooseImage(){
 ? ?
 ? ?// 调用 图片选择的api
 ? ?wx.chooseMedia({
 ? ? ? ?count: 1,
 ? ? ? ?success:(res)=> {
 ? ? ? ? ? ?// ? console.log(res.tempFiles[0].tempFilePath)
?
 ? ? ? ? ? ?// tempFilePath可以作为img标签的src属性显示图片
 ? ? ? ? ? ?this.setData({
 ? ? ? ? ? ? ? ?img:res.tempFiles[0].tempFilePath
 ? ? ? ? ?  })
 ? ? ?  }
 ?  })
},

2.上传并添加

addFile(){
 ? ?if(!this.data.img)return;
?
 ? ?// 处理后缀名
 ? ?// http://tmp/lAuUCuVuzgXR0af76f9a39ef41a9f9057741d4ca427c.jpeg
 ? ?let extName = this.data.img.split(".").pop()
 ? ?// console.log(extName);
 ? ?// return 
?
 ? ?// 处理云端路径
 ? ?let cloudPath = "web0712/"+new Date().getTime()+"."+extName
?
 ? ?// 1)调用 文件上传的api
 ? ?wx.cloud.uploadFile({
 ? ? ? ?cloudPath,
 ? ? ? ?filePath:this.data.img,
 ? ? ? ?success:res=>{
 ? ? ? ? ? ?console.log(res);
 ? ? ? ? ? ?if(res.fileID){
 ? ? ? ? ? ? ? ?// 2)文件id 存到数据里
?
 ? ? ? ? ? ? ? ?// ==============
 ? ? ? ? ? ? ? ?// 执行添加数据
 ? ? ? ? ? ? ? ?db.collection('a-c').add({
 ? ? ? ? ? ? ? ? ? ?data:{
 ? ? ? ? ? ? ? ? ? ? ? ?// 字段名称:存储的数据
 ? ? ? ? ? ? ? ? ? ? ? ?phone:this.data.phone,
 ? ? ? ? ? ? ? ? ? ? ? ?pass: this.data.pass,
 ? ? ? ? ? ? ? ? ? ? ? ?fileID:res.fileID
 ? ? ? ? ? ? ? ? ?  },
 ? ? ? ? ? ? ? ? ? ?success:result=>{
 ? ? ? ? ? ? ? ? ? ? ? ?console.log(result);
 ? ? ? ? ? ? ? ? ? ? ? ?if(result._id){
 ? ? ? ? ? ? ? ? ? ? ? ? ? ?wx.showToast({
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?title: '添加成功',
 ? ? ? ? ? ? ? ? ? ? ? ? ?  })
?
 ? ? ? ? ? ? ? ? ? ? ? ? ? ?this.get()
 ? ? ? ? ? ? ? ? ? ? ?  }
 ? ? ? ? ? ? ? ? ?  }
 ? ? ? ? ? ? ?  })
 ? ? ? ? ?  }
 ? ? ?  }
 ?  })
}

二、behaviors

behaviors 是用于组件间代码共享的特性,类似于一些编程语言中的 “mixins” 或 “traits”。

每个 behavior 可以包含一组属性、数据、生命周期函数和方法。组件引用它时,它的属性、数据和方法会被合并到组件中,生命周期函数也会在对应时机被调用。 每个组件可以引用多个 behaviorbehavior 也可以引用其它 behavior

示例:自己提取公共代码 common.js

module.exports = Behavior({
    properties:{
?
    },
    data:{
        a:1,
        b:0
    },
    methods:{
        add(){
            this.setData({
                a:2
            })
        }
    }
})

xx.js 页面使用

// pages/test/test.js
let myBehavior = require("../../common/common.js")
?
Component({
    behaviors:[myBehavior],
    data:{
        sum:1
    },
    methods:{
?
    }
})

三、computed计算属性

computed | 微信开放文档 文档地址

1.1概述

computed是小程序自定义组件扩展 behavior,在小程序组件中,计算属性 computed 和监听器 watch 的实现。在 data 或者 properties 改变时,会重新计算 computed 字段并触发 watch 监听器。目前针对的是component构造器

1.2扩展计算属性安装

在小程序端根目录 执行命令

1.npm init -y
2.npm install --save miniprogram-computed
3.构建npm---【点击工具--构建npm】
4.使用npm---【点击详情--本地设置--使用npm模块】

1.3computed 基本用法

test.wxml

<view>{{a}}+{{b}}={{sum}}</view>
<button bindtap="add">add</button>
?

test.js

// pages/test/test.js
let myBehavior = require("../../common/common.js")
let com = require("miniprogram-computed").behavior
?
Component({
    behaviors:[myBehavior,com],
    data:{
        sum:1
    },
    computed:{
        // sum(data){
        //  // 不能访问this
        //  return data.a+data.b
        // }
    },
    // watch:{
    //  "a,b":function(a,b){
    //      console.log(a,b);
    //      this.setData({
    //          sum:a+b
    //      })
    //  }
    // },
    observers:{
        "a,b":function(a,b){
            console.log(a,b);
            this.setData({
                    sum:a+b
                })
        }
    },
    methods:{
?
    }
})

1.4computed vs watch

从原理上说, watch 的性能比 computed 更好;但 computed 的用法更简洁干净。

此外, computed 字段状态只能依赖于 data 和其他 computed 字段,不能访问 this 。如果不可避免要访问 this ,则必须使用 watch 代替。

1.5watch vs observers

  • 无论字段是否真的改变, observers 都会被触发,而 watch 只在字段值改变了的时候触发,并且触发时带有参数。

四、工程优化

1.分包

文档地址:分包加载 | 微信开放文档

某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时==按需进行加载==。每个使用分包小程序必定含有一个主包。所谓的主包,即放置默认启动页面/TabBar 页面,以及一些所有分包都需用到公共资源/JS 脚本;而分包则是根据开发者的配置进行划分。

主包:必须包含启动页面,tabbar,公共的资源 脚本文件
?
分包:一个分包不超过2M
?
    普通分包:依赖于主包内容----加载普通分包之前,先加载主包内容
    
    独立分包:不依赖主包内容和其他分包。-----只加载自己分包内的资源

优势

1.在小程序启动时,默认会下载主包并启动主包内页面,当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完成后再进行展示。 2.单个分包/主包大小不能超过 2M,整个小程序所有分包大小不超过 20M,能够将工程大小扩充到20M 3.对小程序进行分包,可以优化小程序首次启动的下载时间,以及在多团队共同开发时可以更好的解耦协作。

1.1.配置分包结构

app.json

"subPackages": [
 ?  {
 ? ? ? ?"root": "pagesA",
 ? ? ? ?"pages": [
 ? ? ? ? ? ?"dog/dog"
 ? ? ?  ]
 ?  },
 ?  {
 ? ? ? ?"root": "pagesB",
 ? ? ? ?"pages": [
 ? ? ? ? ? ?"apple/apple",
 ? ? ? ? ? ?"banana/banana"
 ? ? ?  ],
 ? ? ? ?"name": "fruit",
 ? ? ? ?"independent": true
 ?  }
],
?

1.2.独立分包

app.json

"subPackages": [
 ?  {
 ? ? ? ?"root": "pagesA",
 ? ? ? ?"pages": [
 ? ? ? ? ? ?"dog/dog"
 ? ? ?  ]
 ?  },
 ?  {
 ? ? ? ?"root": "pagesB",
 ? ? ? ?"pages": [
 ? ? ? ? ? ?"apple/apple",
 ? ? ? ? ? ?"banana/banana"
 ? ? ?  ],
 ? ? ? ?"name": "fruit",
 ? ? ? ?"independent": true //设置独立分包
 ?  }
],

问题:

console.log('b分包-apple');
?
// 问题:直接打开独立分包 获取不到全局实例
        // 解决:allowDefault:true 允许获取到空对象 可以往全局实例中添加值
let app = getApp({allowDefault:true})//
app.isLogin = true //当App被调用时,默认实现中定义的属性会被覆盖合并到App中
?
console.log(app);

1.3.分包预下载

app.json

 ?"preloadRule": {
 ? ?"pages/weui/weui":{
 ? ? ?"packages": ["fruit"],
 ? ? ?"network": "all"
 ?  }
  }

2.基础库低版本兼容

兼容 | 微信开放文档 文档地址

小程序的功能不断的增加,但是旧版本的微信客户端并不支持新功能,所以在使用这些新能力的时候需要做兼容。

2.1版本号比较

比较方法【参考官方】

fun(){
        // const version = wx.getSystemInfoSync().SDKVersion
?
        // if (this.compareVersion(version, '2.10.4') >= 0) {
        //  wx.getUserProfile({
        //    desc: '完善资料',
        //    success:res=>{
        //        console.log(res);
        //    }
        //  })
        // } else {
        //  // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示
        //  wx.showModal({
        //      title: '提示',
        //      content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
        //  })
        // }
    },
    compareVersion(v1, v2) {
        v1 = v1.split('.')
        v2 = v2.split('.')
        const len = Math.max(v1.length, v2.length)
?
        while (v1.length < len) {
            v1.push('0')
        }
        while (v2.length < len) {
            v2.push('0')
        }
?
        for (let i = 0; i < len; i++) {
            const num1 = parseInt(v1[i])
            const num2 = parseInt(v2[i])
?
            if (num1 > num2) {
                return 1
            } else if (num1 < num2) {
                return -1
            }
        }
?
        return 0
    },

2.2API 存在判断 (常见)

if (wx.getUserProfile) {
            wx.getUserProfile({
             ?desc: '完善资料',
             ?success:res=>{
                 ?console.log(res);
              }
            })
        } else {
            // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示
            wx.showModal({
                title: '提示',
                content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
            })
        }

2.3wx.canIUse

    console.log(wx.canIUse('showModal.object.editable'));

3.骨架屏使用

骨架屏是页面的一个空白版本,通常会在页面完全渲染之前,通过一些灰色的区块大致勾勒出轮廓,待数据加载完成后,再替换成真实的内容。通常在小程序中,我们需要手工维护骨架屏的代码,当业务变更时,同样需要对骨架屏代码进行调整。为了开发的便利,开发者工具提供了自动生成骨架屏代码的能力。

先去project.config.json设置配置,在去生成骨架屏代码

骨架屏 | 微信开放文档 文档地址

五、发布上线

完善小程序资料(头像 名称 服务类目 简介)
?
1.检查代码包大小 2M 使用分包
2.切换成真实的appid,
3.检查请求的接口是否是合法的域名--在小程序后台配置过域名
4.点击上传-生成开发版本,设置体验版,交给测试人员
5.提交审核(驳回,修改代码继续提交,成功了就提交发布,就可以生成线上版本了,所有人可以访问)
?
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-01 14:01:50  更:2022-01-01 14:02:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:24:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码