小程序的使用

微信小程序开发 外部链接别人的总结查看(超详细保姆式教程)

基础语法

1.数据绑定

1.1 初始化数据

  • 页面.js的data选项中
    Page({data: {motto: 'Hello World',id:18}
    })
    
  • 使用数据
  1. 单项数据流:Mustache 语法
    a)模板结构中使用双大括号 {{data}}

       	<text id="{{id}}">{{motto}}</text><input type="text" value="{{motto}}"/>
    
  2. 双向数据绑定

  • a)表单项使用 model:value = ‘{{data}}’

    <input type="text" model:value="{{motto}}"/>
    
  • b)坑!!!

    • i.双向数据绑定数据变量名不能是简单的a, b, c,否则无法实现
    • ii.双向数据绑定不能绑定data路径,如: a.b
      <input type="text" model:value="{{a}}"/>
      

1.2 修改数据

  1. this.setData({message: ‘修改之后的数据’}, callback)
  2. 特点:
  • a)同步修改: this.data值被同步修改
  • b)异步更新: 异步将setData 函数用于将数据从逻辑层发送到视图层(异步)
  1. 注意点:
  • a)直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致。
  • b)单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。
    Page({data: {motto: 'Hello World',a: 'abc'},onLoad(){this.setData({motto: 'change data'})}
    })
    

2.事件绑定

2.1 事件分类

    1. 冒泡事件
    • a) 定义:冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
    • b) 冒泡事件列表:冒泡官网地址
  • 2)非冒泡事件

    • a) 定义:当一个组件上的事件被触发后,该事件不会向父节点传递。
    • b) 非冒泡事件:表单事件和自定义事件通常是非冒泡事件
      非冒泡事件官网地址

2.2 绑定事件

  1. bind绑定:事件绑定不会阻止冒泡事件向上冒泡

    <view bindtap="handleTap" class='start_container'><text class='start'>开启小程序之旅</text>
    </view>
    
  2. catch 绑定: 事件绑定可以阻止冒泡事件向上冒泡

    <view catchtap="handleTap" class='start_container'><text class='start'>开启小程序之旅</text>
    </view>
    

2.3 向事件对象传参

  1. 语法: data-key=value
 <button catchtap="changeName" data-name='{{firstName}}'>点击修改名称</button>
  1. 获取: event.target.dataset.key || event.currentTarget.dataset.key

  2. Event.target 和 event.currentTarget的区别
    a.) Event.target是触发事件的对象,但不一样是绑定事件的对象,如: 事件委托,冒泡
    b) currentTarget触发事件的对象一定是绑定事件的对象, 没有事件委托

3.列表渲染

3.1 语法说明

  1. wx:for="{{arr}}"
  2. wx:key="唯一值或者index"
  <view wx:for="{{ list }}" wx:key="id"><view>{{ index }} --  {{ item.content }}</view> </view>

3.2 wx:key

  1. 同Vue一样,循环遍历的时候需要为每一个item添加唯一的key值

  2. Key值分类:

    a)Item本身就是唯一值,如: number,string
    b)*this,代表item本身,同样需要item自身是唯一的,如;number,string
    c)Item的唯一属性,如: id; 官网没有明确语法说明,只能在示例代码中找到

  3. 注意事项:

    a)Wx:key后跟的变量不需要使用插值语法,即不需要使用大括号包裹
    b)Item中如果有唯一值属性,可以直接使用
    如:item = {id: 1}, 则wx:key = 'id'

3.3 重新命名

1.默认的个体: item
2.默认的下标: index
3.自定义个体变量名称: wx:for-item=’myItem’
4.自定义下标变量名称: wx:for-index=’myIndex’

<view wx:for="{{ list }}" wx:key="id" wx:for-item="myItem" wx:for-index="myIndex"><view>{{ myIndex}} -- {{myItem.content}}</view>
</view>

4. 条件渲染

4.1 语法说明

  1. wx:if=’条件’
  2. wx:elif=’条件’
  3. wx:else
    <view><!-- 条件渲染 --><view wx:if="{{ isShow }}">表白成功</view><view wx:else>表白失败</view><!-- <view wx:else="{{ !isShow }}">表白失败</view> --><view>-----------------</view><view wx:if="{{ sex === 0 }}"></view><view wx:elif="{{ sex === 1 }}"></view><view wx:else>未知</view>
    </view>
    

4.2 wx:if VS hidden 区别

1.hidden用法: <view hidden='{{true}}' ></view>
2.wx:if 等同于 v-if, 条件为false的时候不加载,条件切换的时候决定元素销毁或者重新加载渲染
3.hidden 等同于 v-show, 始终加载元素, 条件切换的时候决定元素的显示和隐藏

5. 模板使用

5.1 定义模板

在这里插入图片描述

5.2 引入模板

  1. 引入模板结构:
  2. 引入模板样式: @Import ‘模板样式路径’

5.3 使用模板

在这里插入图片描述

5.4 向模板导入数据并使用数据

在这里插入图片描述

6.生命周期

官方图示:官方图

在这里插入图片描述

生命周期函数执行时机执行次数特点说明
onLoad页面加载时触发1可以通过参数获取打开当前页面路径中的参数
onShow页面显示/切入前台时触发多次如页面没有被销毁,会重复多次显示隐藏,可以在此发送请求获取最新数据
onReady页面初始化渲染完成时触发1可以同UI界面进行交互
onHide页面隐藏/切入后台时触发多次wx.navigateTo 或底部 tab 切换到其他页面,小程序切入后台等
onUnload页面卸载时触发1wx.redirectTo或wx.navigateBack到其他页面时

个人见解

官网生命周期图示是错误的;错误部分:标注onLoad及onShow执行的位置不对

参考:小程序启动执行的所有流程

参考地址:

https://developers.weixin.qq.com/miniprogram/dev/framework/performance/tips/start_process.html

7.小程序适配方案: rpx (responsive pixel响应式像素单位)

小程序适配单位: rpx

规定任何屏幕下宽度为750rpx

小程序会根据屏幕的宽度不同自动计算rpx值的大小

Iphone6下: 1rpx = 1物理像素 = 0.5px

在这里插入图片描述

8. 小程序API

8.1 API使用说明

  1. 小程序提供了很多实用的方法供开发者使用
  2. 小程序全局对象是: wx
  3. 所有的API都保存在wx对象中

8.2 常用API

  1. 界面交互
    a)显示消息提示框: wx.showToast()
    b)显示消息加载框: wx.showLoading()
    c)关闭消息提示框: wx.hideToast()
    d)关闭消息加载框: wx.hideLoading()
    e)提示消息警告框:wx.showModal()
  2. 路由跳转
    a)wx.navigateTo() 保留当前页面,跳转到应用内的某个页面
    b)wx.redirectTo() 关闭当前页面,跳转到应用内的某个页面
    c)wx.switchTab() 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
  3. 网络请求
    a)wx.request()
  4. 本地存储
    a)wx.setStorage() 异步设置
    b)wx.setStorageSync() 同步设置
    c)wx.getStorage() 异步获取
    d)wx.getStorageSync() 同步获取
  5. 媒体
    a)wx.getBackgroundAudioManager() 获取全局唯一的背景音频管理器
    b)wx.playVoice()
    6.支付
    a)Wx.requestPayment()

8.3 快速查找技巧

  1. 小程序的初学者可能对于小程序的官网的众多内容一时毫无头绪,无从下手不知道从哪来找想要的内容
  2. 当在小程序中想要实现某一种布局,查看:组件
  3. 当在小程序中想要实现某一个功能,查看: API
  4. 当在小程序中想要进行某一个配置或者某一种页面语法,查看: 框架 + 指南
  5. 查看小程序官网的时候要细心,最好是将要使用的API的相关内容看完整,因为API的配置及限制较多

9.组件传参

组件传参 - 把标题"猜你喜欢", "人气推荐"传入到组件中

怎么传? — 标签直接帮属性即可

<goods-list title="猜你喜欢" list="{{likeList}}"></goods-list>

怎么接?

组件内使用 properties 接(不支持数组,支持对象和配置对象)

// 不支持数组写法
// properties: ["title"],
// 支持对象写法
// properties: {
//   title: String,
// },
// 支持配置对象写法
properties: {title: {type: String,required: true},list: {type: Array,required: true}
},

路由传参query

使用标签和js都可以跳转

  1. 标签跳转

    <navigatorurl="/pages/goods/list/list?category2Id={{item.id}}"
    ></navigator>
    

    同时携带了 query 参数(路由带参)

  2. js跳转

    wx.navigateTo({url: '/pages/goods/list/list',
    });
    

    没带参数

跳转页面的API

wx.switchTab 跳转到tabbar页面
wx.redirectTo  关闭当前页面,跳转下一个页面,当前页面不在历史记录中
wx.navigateTo  跳转页面(有历史记录)
wx.navigateBack({ delta: 1 }) 回退页面,没有参数默认是1
wx.reLaunch   关闭所有的页面,打开到应用内的某个页面

进阶知识

1. 小程序本地存储

1.1 语法说明

  1. 存入数据
    a)wx.setStorage() 异步
    b)wx.setStorageSync() 同步
    在这里插入图片描述

  2. 读取数据
    a)wx.getStorage()异步
    b)wx.getStorageSync() 同步
    在这里插入图片描述

  3. 删除数据
    a)wx.removeStorage() 异步
    b)wx.removeStroageSync() 同步
    在这里插入图片描述

  4. 清空数据
    a)wx.clearStorage() 异步
    b)wx.clearStorageSync() 同步
    在这里插入图片描述

1.2 注意事项

  1. 除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用
  2. 单个 key 允许存储的最大数据长度为 1MB
  3. 所有数据存储上限为 10MB

1.3 官网对应地址

https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.setStorage.html
在这里插入图片描述

2. 小程序前后端交互

2.1 语法说明

  1. wx.request()
    在这里插入图片描述

2.2 相关配置

  1. 每个微信小程序需要事先设置通讯域名,小程序只可以跟指定的域名进行网络通信
  2. 服务器域名请在 「小程序后台-开发-开发设置-服务器域名」 中进行配置
  3. 默认超时时间和最大超时时间都是 60s
  4. 超时时间可以在 app.json 中通过 networktimeout 配置

2.3 注意事项

  1. 小程序为了安全起见只支持Https请求
  2. wx.request最大并发限制10个

2.4 官网对应地址

https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.setStorage.html
在这里插入图片描述

3. 小程序页面通信

3.1 路由传参

  1. 传参方式
    a) 路由地址中 + query传参数
    b)示例: url?a=123
    wx.navigateTo({url: '/pages/target/target?a=1&b=2',
    });
    
  2. 获取参数
    a)跳转目标页面的onLoad函数中的options实参中获取
    onLoad(options){const {a, b} = options;
    }
    

3.2 消息订阅发布

  1. 使用第三方库: pubsub-js
  2. 安装: npm install pubsub-js
  3. 使用:
    a)import PubSub from ‘pubsub-js’
    b)订阅消息: PubSub.subscribe(‘eventName’, callback)
    c)发布消息: PubSub.publish(‘eventName’, data)
    d)取消订阅: PubSub.unsubscribe(‘eventName’)

3.3 eventChannel 事件通道

  1. 订阅事件
    a)wx.navigateTo()跳转的时候在events选项中定义事件名及事件对应的回调
    在这里插入图片描述

  2. 获取事件总线对象
    a)目标页面中通过: 实例.getOpenerEventChannel()
    b)示例: const eventChannel = this.getOpenerEventChannel()

  3. 触发事件
    a)eventChannel.emit(‘事件名’, data)
    在这里插入图片描述

3.4 借助app传参

  1. 获取App
    const app = getApp()
  2. 在app上写入数据
    app.currentAddress = currentAddress;
  3. 获取数据
    const app = getApp()
    let currentAddress = app.currentAddress 获取数据

4. 小程序自定义组件

4.1. 创建组件

  1. 开发工具中在指定的文件夹下右键新建组件
    a)建议:文件夹名称与组件名称最好一致。
  2. 组件对应的json文件中设置: component: true
{"component": true,"usingComponents": {}"navigationStyle": "custom"  -----> 自定义导航  导航栏样式"navigationBarTitleText": "登录"   -----> 自定义文字
}

4.2. 使用组件

1.使用组件的页面的json文件中注册使用组件

{"usingComponents": {"goods-list": "/components/goods-list/goods-list"}
}
<goods-list title="猜你喜欢" list="{{ likeList }}"></goods-list>

5. 小程序使用npm包

5.1 初始化package.json

npm init

5.2 勾选允许使用npm(老版本)

老版本需要勾选
新版本已全面支持,没有当前选项
在这里插入图片描述

5.3 下载npm包

npm install packageName

5.4 构建npm

  1. 微信开发工具 —> 工具选项 —> 构建npm
  2. 会将node_modules中的包打包到miniprogram_npm中
    a)小程序中使用的第三方包内容会去miniprogram_npm中查找而不是node_modules
  3. 注意:
    a)开发中如果使用UI组件库,每次引入新的组件使用可能会导致样式不能生效,需要再次重新构建npm即可

5.5 流程执行不完整带来的错误

在这里插入图片描述

6.小程序登录流程

6.1 刚刚被作废的方式

6.1.1 首次获取

  1. Button组件设置open-type属性为getUserInfo
  2. <button open-type=’getUserInfo’></button>
  3. 设置后首次登陆点击button可以弹出授权窗口
  4. 注意: 授权的动作只发生一次,除非清除缓存,点击butotn授权一次之后再点击失效,不会弹出授权窗口
  5. 官网对应地址
    https://developers.weixin.qq.com/miniprogram/dev/component/button.html
    在这里插入图片描述

6.1.2 授权之后获取

  1. wx.getUserInfo()
  2. 官网对应地址:
    https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html

6.1.3 作废说明

a) 依然可以使用,但不会出现授权弹窗
b) 获取到的用户名为 ‘微信用户’, 头像为灰色头像

6.2 目前推荐登录方式

6.2.1 通过token标识用户

  1. 通过用户临时登录code获取用户唯一标识token
  2. 如果需要展示用户头像和用户自定义用户名可通过页面引导用户自行设置

6.2.2 登录流程图解

在这里插入图片描述

8.6.2.3 登录流程说明

  1. wx.login()
    code是临时标识,只有5分钟内有效在这里插入图片描述

  2. 发送code给服务器端

  3. 服务器端发送请求携带参数(code, appSecret, appId)给微信服务器获取openId
    a) 微信接口API: GET https://api.weixin.qq.com/sns/jscode2session

  4. appSecret,appId在小程序首页获取
    在这里插入图片描述

  5. 服务器获取openId后进行加密返回给前端Token标识

7. 小程序使用UI组件库vant

7.1 下载安装

  • Npm安装
    npm i @vant/weapp -S --production
  • Yarn安装
    yarn add @vant/weapp –production

7.2 修改app.json

  • 操作: 将 app.json 中的 “style”: “v2” 去除
  • 原因:程序的新版基础组件强行加上了许多样式,难以覆盖,不关闭将造成部分组件样式混乱。

7.3 修改project.config.json

"packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./"}
],

7.4 构建npm

微信开发工具 —> 工具 —> 构建npm

7.5 引入组件

  1. 页面.json文件中
{"usingComponents": {"van-action-sheet": "@vant/weapp/action-sheet/index","van-stepper": "@vant/weapp/stepper/index","van-icon": "@vant/weapp/icon/index","van-button": "@vant/weapp/button/index"}
}

8.7.6 使用组件

<van-button block type="primary" round bindtap='handleSubmit'>确定</van-button>

8. 小程序分包流程

8.1 为什么要分包

  1. 小程序要求压缩包体积不能大于2M,否则无法发布
  2. 实际开发中小程序体积如果大于2M就需要使用分包机制进行发布上传
  3. 分包后可解决2M限制,并且能分包加载内容,提高性能
  4. 分包后单个包的体积不能大于2M
  5. 包后所有包的体积不能大于20M

8.2 分包形式

  1. 常规分包
  2. 独立分包
  3. 分包预下载
  4. 分包异步化

8.3 常规分包

  1. 开发者通过在 app.json subpackages 字段声明项目分包结构
  2. 特点:
  • a)加载小程序的时候先加载主包,当需要访问分包的页面时候才加载分包内容
  • b)分包的页面可以访问主包的文件,数据,图片等资源
  • c)主包:
    • i.主包来源: 除了分包以外的内容都会被打包到主包中
    • ii.通常放置启动页/tabBar页面
  1. 注意点:root包名必须是当前分包目录名

在这里插入图片描述

在这里插入图片描述

8.4 独立分包

  1. 设置 independent为true
  2. 特点:
  • a)独立分包可单独访问分包的内容,不需要下载主包
  • b)独立分包不能依赖主包或者其他包的内容
  1. 使用场景
  • a)通常某些页面和当前小程序的其他页面关联不大的时候可进行独立分包
  • b)如:临时加的广告页 || 活动页
    在这里插入图片描述

8.5 分包预下载

  1. 配置
  • a)app.json中设置preloadRule选项
  • b)key(页面路径): {packages: [预下载的包名 || 预下载的包的根路径])}
    在这里插入图片描述
    在这里插入图片描述
  1. 特点:
  • a) 在加载当前包的时候可以设置预下载其他的包
  • b) 缩短用户等待时间,提高用户体验

8.6 分包异步化

  1. 理解:
    a)独立分包不能依赖其他分包文件,如果要加载使用其他分包怎么办?
  2. 设计思想:
    a)等待其他分包加载后,异步加载依赖文件
  3. 异步分类
  • a)异步加载组件

    • i.使用内置组件设置占位
    • ii.等待异步加载后再加载使用依赖的组件
    • iii.设置选项:对应组件json文件中 ‘componentPlaceholder’ 字段
      // subPackageA/pages/index.json
      {
      "usingComponents": {
      "button": "../../commonPackage/components/button",
      "list": "../../subPackageB/components/full-list",
      "simple-list": "../components/simple-list"
      },
      "componentPlaceholder": {
      "button": "view",
      "list": "simple-list"
      }
      }
      
  • b)异步加载js文件

    • require 方法
    • 回调函数方式
      /* 回调函数形式 */let findUserAddress, delAddress;require('../../../../utils/api', utils => {findUserAddress = utils.findUserAddress;delAddress = utils.deleteAddress;}, ({mod, errMsg}) => {console.error(`path: ${mod}, ${errMsg}`)})
    
    • Promise方法
      /* promise形式 */(async function(){let utils = await require('../../../../utils/api')console.log(utils)findUserAddress = utils.findUserAddress;delAddress = utils.deleteAddress;})()
    

8.7 分包效果演示

在这里插入图片描述

8.8 官网对应地址

https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages.html

9. 小程序转发分享

9.1 分享实现

  1. Button组件设置open-type为share
  2. <button open-type=’share’ ></button>

9.2 自定义分享内容

  1. 生命周期回调中onShareAppMessage回调中return 对象设置自定义内容
    在这里插入图片描述

9.3 设置体验权限

  1. 开发阶段分享给微信好友,默认没有体验权限,无法打开分享小程序,需要在开发页面设置
  2. 最多添加15个微信好友
    在这里插入图片描述

10. 小程序支付流程

10.1 支付流程官网图解

在这里插入图片描述

10.2 支付流程详细说明

  1. 用户在小程序客服端下单
    • a)用户标识token
    • b)商品信息: id,数量,附属信息(备注等)
    • c)地址信息
  2. 小程序客户端发送下单支付请求给商家服务器
    • a)获取商家订单id
  3. 商家服务器发送请求调用统一下单API获取预支付订单信息
    • a)接口地址: https://api.mch.weixin.qq.com/pay/unifiedorder
  • b)需要携带参数
    1. 用户openid
    2. 商户id
    3. 商户订单id
    4. 。。。
  1. 商家对预支付信息签名加密后返回给小程序客户端
    • a)签名方式: MD5
    • b)签名字段:小程序ID, 时间戳, 随机串,数据包,签名方式
    • c)参考地址: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3
  2. 用户确认支付(鉴权调起支付)
    • a)API: wx.requestPayment()
    • b)鉴权通过后客户端调起输入框,用户输入支付密码
    • c)注意:模拟器上会弹出二维码需要使用当前开发者微信扫码进行支付操作
  3. 微信服务器返回支付结果给小程序客户端
    • a)支付成功后客户端发送请求给商家服务器查询订单信息
    • b)根据订单信息决定如何跳转页面及展示信息给用户
  4. 微信服务器推送支付结果给商家服务器端

10.3 官网对应地址

https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter2_8_2.shtml

10.4 描述

整体流程:

  1. 用户下单,发请求给商家服务器(这一步前端做),商家服务器生成订单,然后给腾讯服务发请求,生成预付单,生成腾讯生成预付单的目的是为了知道这个订单要收多少钱,腾讯服务知道收多钱之后反馈给商家服务器,生成支付签名信息返回给小程序

  2. 小程序端接收到商家返回的支付签名信息,调用 wx.requestPayment() 发起微信支付(这一步前端做)

  3. 发起之后要去腾讯服务鉴权,鉴定有没有实名、有没有绑定银行卡,鉴权成功之后告诉小程序可以调起微信支付,此时要去弹出密码输入框(这一步是调用完 requestPayment)小程序自己和腾讯服务的交互

  4. 小程序弹出密码弹框,用户输入密码,授权付款,钱在腾讯服务上,所以授权要发送给腾讯服务,腾讯服务接到授权后,会把用户账号中的款扣了,把钱划给商家,返回支付成功告诉用户,提示"支付成功",这里的支付成功可以理解为"扣款成功"(这时会弹一个弹框,微信弹的)

    在这个步骤的同时,会异步告诉商家服务,该用户已经付款,可以发货

  5. 点击微信弹出弹框确认之后,要回到商家的小程序,小程序也要提示用户"订单支付成功",所需小程序发请求给商家服务,商家服务接到请求之后,找腾讯服务确认用户是否支付成功,确认之后,返回给用户支付成功的数据,小程序展示"订单支付成功"页面

前端步骤:

  1. 调用创建订单接口,创建出订单,返回 orderId

  2. 拿着 orderId 获取支付信息

  3. 拿着支付信息调用 wx.requestPayment() 去支付

    只有支付成功之后,才会走 wx.requestPayment() 的 success 回调

  4. 在支付成功之后,调用接口查询订单状态(已支付),跳转支付成功页

项目中使用的

1.导航设置★

app.json

{"pages":["pages/index/index"],"window":{"navigationBarBackgroundColor": "#9c0211","navigationBarTitleText": "慕尚花坊","navigationBarTextStyle":"white"},
}

2.小程序中的ui

2.1. swiper 轮播

 <swiperclass="banner-container"indicator-dotsindicator-color="#fff"indicator-active-color="#ff734c"autoplaycircularinterval="2200"duration="400"><swiper-itemclass="banner-item"wx:for="{{ bannerList }}"wx:key="id"><image class="banner-img" src="{{ item.imageUrl }}"></image></swiper-item></swiper>

2.2. image 组件

<view class="action"><image class="action-img" src="{{backgroundImg}}" mode="widthFix"></image>
</view>注意: image 组件的 mode="widthFix" 是设置宽度,保持图片的宽高比不变,自己去算高度

2.3scroll-view 的使用

页面宽高设置100%是相对于父级的,而父级是 page 这个元素,这个元素需要设置 宽高100%才可以,这个元素样式在 app.wxss 中设置,这是个全局的,每个页面的根元素都是 page 这个元素

  <!-- scroll-view 如果要使用flex布局,需要设置enable-flex属性 -->
<view class="category-container"><view class="menu"><scroll-viewclass="menu-list"scroll-y><view class="menu-item active">鲜花玫瑰</view><view class="menu-item">鲜花玫瑰</view><view class="menu-item">鲜花玫瑰</view><view class="menu-item">鲜花玫瑰</view></scroll-view></view>

注意:scroll-view 如果要使用flex布局,需要设置enable-flex属性

2.4 button

  1. button 组件添加 open-type="chooseAvatar" 属性点击才能展示出选择头像的弹框

  2. input 组件添加 type="nickname" 属性才能弹出选择昵称的弹框

3.封装 request.js 文件★


function request ({url,method = 'GET',data,header = {},timeout = 30000
}) {wx.showLoading({ title: '加载中' }); // 显示loadingconst baseURL = `https://gmall-prod.atguigu.cn`header = {'content-type':'application/json',...header}// 获取个人信息需要携带tokenlet token = wx.getStorageSync("TOKEN");if (token) {header.token = token}return new Promise((resolve, reject) => {// wx.request 微信提供的,直接用,没有跨域这一说wx.request({url: baseURL + url, // 请求的urlmethod, // 请求方式data, // 携带数据header, // 请求头timeout, // 超时时间dataType: 'json', // 数据类型是jsonresponseType: 'text', // 响应类型是文本success: (response) => { // 请求成功之后会执行success回调let res = response.data // 拿到响应体(也就是后端返回的数据,包含code、data、message)if (res && res.code == 200) {resolve(res.data)} else if (res.code == 208) { // 未登录的兜底处理,只要返回code是208都去登录页wx.showModal({title: '警告',content: '未登录,请先登录',showCancel: true,cancelText: '取消',cancelColor: '#000000',confirmText: '确定',confirmColor: '#3CC51F',success: (result) => {console.log(result)if(result.confirm){ // 点击确认跳转登录页wx.navigateTo({url: '/pages/login/login'});}}});} else {// 弹出提示框wx.showToast({ // 给用户提示title: '请求失败',icon: 'error', // none success error// image: '/static/images/1.png',duration: 1500});console.error(res) // 给程序员看的reject(res || '请求失败')}},fail: (err) => { // 请求失败执行的回调(断网的时候会走到fail中,超时也会只有fail,url错误(指url不是字符串)也会走fail)wx.showToast({ // 给用户提示title: '请求失败',icon: 'error',duration: 1500});console.error(err) // 给程序员看的reject(err)},complete: () => { // 不管成功失败都会执行的回调wx.hideLoading(); // 隐藏loading}});})}export default request

4.关于路径映射@★

在 app.json 中配置

{"resolveAlias": {"@/*": "/*"},
}

5. 底部tabbar 配置★

地址: https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html#tabBar

app.json 文件中配置

"tabBar": {"color": "#333","selectedColor": "#ff582f","list": [{"pagePath": "pages/index/index","text": "首页","iconPath": "/static/tabbar/home-icon1.png","selectedIconPath": "/static/tabbar/home-icon1-1.png"},{"pagePath": "pages/category/category","text": "分类","iconPath": "/static/tabbar/home-icon2.png","selectedIconPath": "/static/tabbar/home-icon2-2.png"},{"pagePath": "pages/cart/cart","text": "购物车","iconPath": "/static/tabbar/home-icon3.png","selectedIconPath": "/static/tabbar/home-icon3-3.png"},{"pagePath": "pages/personal/personal","text": "我的","iconPath": "/static/tabbar/home-icon4.png","selectedIconPath": "/static/tabbar/home-icon4-4.png"}]
},

6.分页处理★onReachBottom的使用

onReachBottom的使用 页面触底回调

  1. 页面触底的时候要发送请求,需要页面触底的回调(于data配置项同级)

    data: {......status: 'more' // 页面发请求的状态,总共有以下几个值:  'more'更多 'no-more'没有更多 'loading'加载中 'error'错误
    },
    // 页面触底回调
    onReachBottom() {if (this.data.status == 'no-more') {return}// 翻页this.setData({page: this.data.page + 1})this.getGoodsList()
    },async getGoodsList() {this.setData({ status: 'loading' })// 组转数据const { page, limit, category2Id } = this.datalet data = {}if (category2Id) {data.category2Id = category2Id}// 发送请求try {let result = await reqGoodsList(page, limit, data)let goodsList = this.data.goodsList.concat(result.records) // 之前列表中的值不能清空let status = 'more'if (goodsList.length == result.total) { // 当获取到所有的数据之后,状态改为no-morestatus = 'no-more'}......
    

这里使用 goosList.length 和 totoal 去判断也可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/72970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装程序报错“E: Sub-process /usr/bin/dpkg returned an error code (1)”的解决办法

今天在终端使用命令安装程序时出现了如下的报错信息。 E: Sub-process /usr/bin/dpkg returned an error code (1) 这种情况下安装什么程序最终都会报这个错&#xff0c;具体的报错截图如下图所示。 要解决这个问题&#xff0c;首先使用下面的命令进到相应的目录下。 cd /var/…

Java“牵手”唯品会商品列表数据,关键词搜索唯品会商品数据接口,唯品会API申请指南

唯品会商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取唯品会商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问唯品会商城的网页来获取商品详情信息。以下是两种常用方法的介…

IDEA快捷键第二版

1、选择当前行和上一行 按住 Shift键 再按两下向上键&#xff08; ↑ &#xff09;&#xff0c;按两下选两行&#xff0c;以此类推 2、将整个方法上移动 文本光标应放在方法的标头处&#xff0c;按住Ctrl Shift 向上键&#xff08; ↑ &#xff09;&#xff0c; 3、解包 …

无涯教程-JavaScript - DELTA函数

描述 DELTA函数测试两个值是否相等。如果number1 number2,则返回1&#xff1b;否则返回1。否则返回0。 您可以使用此功能来过滤一组值。如,通过合计几个DELTA函数,您可以计算相等对的计数。此功能也称为Kronecker Delta功能。 语法 DELTA (number1, [number2])争论 Argum…

Postman接口测试之Mock快速入门

一、Mock简介 1.Mock定义 Mock是一种比较特殊的测试技巧&#xff0c;可以在没有依赖项的情况下进行接口或单元测试。通常情况下&#xff0c;Mock与其他方法的区别是&#xff0c;用于模拟代码依赖对象&#xff0c;并允许设置对应的期望值。简单一点来讲&#xff0c;就是Mock创建…

CSS 滚动驱动动画 scroll()

CSS 滚动驱动动画 scroll() animation-timeline 通过 scroll() 指定可滚动元素与滚动轴来为容器动画提供一个匿名的 scroll progress timeline. 通过元素在顶部和底部(或左边和右边)的滚动推进 scroll progress timeline. 并且元素滚动的位置会被转换为百分比, 滚动开始被转化为…

Vue3中快速简单使用CKEditor 5富文本编辑器

Vue3简单使用CKEditor 5 前言准备定制基础配置富文本配置目录当前文章demo目录结构 快速使用demo 前言 CKEditor 5就是内嵌在网页中的一个富文本编辑器工具 CKEditor 5开发文档&#xff08;英文&#xff09;&#xff1a;https://ckeditor.com/docs/ckeditor5/latest/index.htm…

SpringMVC:从入门到精通,7篇系列篇带你全面掌握--三.使用SpringMVC完成增删改查

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringMVC的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 效果演示 一.导入项目的相关依赖 二.…

港联证券:大数据看北上资金胜率:整体跑赢市场,六成持股浮亏

一直以来&#xff0c;北上资金被称为“聪明资金”&#xff0c;其一举一动备受出资者重视。盛名之下&#xff0c;其战绩究竟如何&#xff1f;复盘前史数据发现&#xff0c;北上资金全体业绩跑赢沪深300指数&#xff0c;但现在持仓个股浮亏占比约六成。 8月&#xff0c;北上资金…

npm publish包报404,is not in the npm registry错误

1. 指定发布目标2. 登录npm&#xff0c;使用登录名发布包&#xff0c;包名命名原则“登录名/包名”&#xff0c;或 “包名” 3. 删除某一个版本npm unpublish pvfhv/eslint-config-prettier1.0.1 --force 删除后的版本不能重复使用&#xff0c;正式解释&#xff1a; Unfortun…

无涯教程-JavaScript - IMLOG2函数

描述 IMLOG2函数以x yi或x yj文本格式返回复数的以2为底的对数。可以从自然对数计算复数的以2为底的对数,如下所示- $$\log_2(x yi)(log_2e)\ln(x yi)$$ 语法 IMLOG2 (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the bas…

【web开发】4.JavaScript与jQuery

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、JavaScript与jQuery二、JavaScript常用的基本功能1.插入位置2.注释3.变量4.数组5.滚动字符 三、jQuery常用的基本功能1.引入jQuery2.寻找标签3.val、text、appe…

SwiftUI简单基础知识学习

以下是一个大致的学习计划&#xff0c;将SwiftUI的知识分成12个主题&#xff1a; SwiftUI 简介和基础语法视图和布局状态和数据流按钮和用户输入列表和数据展示导航和页面传递动画和过渡效果手势和交互绘制和绘图多平台适配网络和数据请求实际项目实践和高级主题 每个主题可以…

go开发之个微机器人的二次开发

请求URL&#xff1a; http://域名/addRoomMemberFriend 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRoom…

如何把Android Framework学彻底?一条龙学习

Framework通俗易懂 平时学习 Android 开发的第一步就是去学习各种各样的 API&#xff0c;如 Activity&#xff0c;Service&#xff0c;Notification 等。其实这些都是 Framework 提供给我们的。Framework 层为开发应用程序提供了非常多的API&#xff0c;我们通过调用这些 API …

计算机毕业设计 基于SSM的问卷调查管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

qt day 5

实现局域网的网络聊天室功能 1>服务器代码 --------------------------------------------------------------- widget.h --------------------------------------------------------------- #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMes…

golang入门笔记——nginx

文章目录 Nginx介绍Nginx的安装Nginx文件Nginx反向代理负载均衡nginx动静分离URLRewrite防盗链nginx高可用配置安全性Nginx限流Nginx缓存集成Lua脚本OpenRestry Nginx介绍 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占用内存少&#xff0c;并发能力强&#x…

52、基于函数式方式开发 Spring WebFlux 应用

★ Spring WebFlux的两种开发方式 1. 采用类似于Spring MVC的注解的方式来开发。此时开发时感觉Spring MVC差异不大&#xff0c;但底层依然是反应式API。2. 使用函数式编程来开发★ 使用函数式方式开发Web Flux 使用函数式开发WebFlux时需要开发两个组件&#xff1a; ▲ Han…

一.使用qt creator 设计显示GUI

一.安装qt creator 二.创建项目 文件-》新建项目 三.使用设计 可以直接使用鼠标拖拽 四.转换为py文件 # from123.py 为导出 py文件的文件名 form.ui 为 qt creator创造的 ui 文件 pyuic5 -o x:\xxx\from123.py form.ui五.显示GUI from PyQt5.QtWidgets import * fr…