微信小程序 - 核心

article/2025/10/4 22:50:25

1、Web页面

2、项目结构

Ps1:应用程序的三个文件app.js、app.json、app.wxss在整个小程序中是唯一的,是全局的;页面级别的会覆盖全局的样式和json(配置),就近原则。

Ps2:project.config.json是自动生成的, 老版没有,不需要改;utils文件是帮助文件、pages(可改名字)下放页面文件;目录结构中可增减文件。

Ps3:小程序规定pages数组下第一个元素代表你要启动显示的第一个页面,每新建一个页面,则在 pages 下注册添加路径目录。

Ps4:因为app.json全局配置类型很多,但是普通的页面配置只针对“window”,所以可以省略“window”字。

3、页面层级

Ps:小程序页面层级限定根据小程序现状而定(推荐不要超过5级)。

​​​​4、缓存

微信小程序缓存最大10M 需要用户自己清除。

5、页面生命周期

page生命周期:

执行顺序:onload(页面初始化)——onshow(页面显示)——onready(页面渲染完成)——onhide(页面隐藏)——onunload(页面关闭)。

JS文件结构:小程序的所有脚本都需要放在page结构体系里面完成。

6、初级数据绑定

6.0、语法:{{数据绑定}}

6.1、小程序没有dom节点,也不需要获取dom可以直接做数据绑定。

6.2、小程序的数据绑定使用{{ }},单向数据绑定。

6.3、从服务器上请求的数据放在onload里面,加上 this.setData(接收服务器数据的变量。名),相当于把数据写入data{}里面,然后只需要将对应的数据变量用{{ }}绑定到wxml文件中相应位置即可。

6.4、绑定的数据是放到标签的属性里面的话,应该有引号,例如src="{{}}"; 如果是绑定在标签内容里的话,如text元素,则不需要引号。

6.5、如果面向布尔值时,如果是“true”的话,无所谓,但如果是“false”的话,必须要加“{{}}”,因为小程序解析的true或false时,是看是否有值,所以这里的“true”也可以写成“任意字符,甚至是false都可以”。

6.6、控制标签元素的显示和隐藏   wx:if="{{true/false}}";也可设置成wx:if="{{变量名}}",从脚本文件js控制 变量名:true/false 来动态变化 (这里true/false为布尔值,不加引号),但如果该变量没有定义,就是false的效果。

6.7、能进行字符串运算{{“hello”+ date}},数值运算{a+b+c}(a:1,b:2,c:3==>6)。

6.8、如果{{img.pic1}},则需要在var变量里面定义img{pic1:…,pic2:…}。

6.9、循环列表

6.9.1、把数据整合成数组,var post_content=[{},{}]

6.9.2、this.setData{{post_key:posts_content}}

6.9.3、<block wx:for="{{post_key}}" wx:for-item="item"  wx:for-index="idx"></block>整体中间的代码视为一个整体,为for循环。

6.9.4、wx:for-item="item"指代子元素,代码中可加可不加,小程序默认是item,使用时用item.xxx。形如{{...item}}中的三个点表示数据平铺,即之后调用其属性不必是item.attr而可以直接attr,类似Java中的静态引入。

6.9.5、  wx:for-index="idx" 指代子元素的索引,小程序默认是index, 使用时用 {{idx}}。

6.10、多参数绑定语法:{{a:b, c:d}}

7、事件机制

7.0、bind/catch

7.1、从启动页跳转到文章列表:点击事件和导航API。

7.2、tap事件,但是要写成bindtap或者catchtap,默认规定。

7.3、bug:点击一次执行事件两次,解决方法:关闭程序重新打开即可。

7.4、wx.navigateTo({ url: '../posts/post', })是跳到下一子级的页面,有对应的返回按钮,当前页面触发的是onHide()事件。(限制五级跳转!!!)

7.5、wx.redirectTo({ url: '../posts/post', })是平行页面跳转(关闭当前页面),无返回按钮,触发的是onUnload()事件。

7.6、冒泡 & 非冒泡

冒泡:子节点触发事件时,父节点也触发自身事件。

非冒泡:子节点触发事件时不牵涉父节点。

bind绑定:允许冒泡。

catch绑定:不允许冒泡。


Ps:可以在每个img中添加catch,但可以运用冒泡机制,直接在父组件swiper中添加catch。

​​​​​8、模板化 & 模块化

8.1、业务与数据分离,从业务中访问数据,理解数据绑定的生命周期,对以后做复杂的业务逻辑处理是很有帮助的。将业务中的数据分离到单独的数据文件中,数据放在data/data-json.js中,是js文件不是json文件。

8.2、this.data做数据绑定的方法已经失效,请在以后所有数据绑定的地方,使用this.setData,

如:

this.setData({posts_key:postsData.postList
});

8.4、小程序总会去访问js文件中的data对象,而且这个访问动作是在onLoad()方法后执行的。

8.5、数据分离读取流程

在数据文件中,使用module.exports作为出口对象,然后在需要用到数据的js文件中使用require函数接收该对象并获取数据。

数据文件中:

module.exports = {a : data};

其中data是数据,将其作为一个属性赋值给module.exports对象。

require方法加载js模块文件:

var data = require("....");

var postsData = reuqire('../../data/posts-data.js') ,只能是相对路径。

执行之后,data对象即是前面的module.exports对象,于是,使用data.a即可获取数据。

8.6、template模板化使用

8.6.0、小程序使用的template模板化技术,而不是组件化技术。

8.6.1、template文件只需要wxml、wxss文件即可

8.6.2、temp.wxml下,创建模板<template name="postItem(模板名字)"></template>

8.6.3、post.wxml中,引用模板:<import src="文件路径(绝对或相对)" />,

在具体地方引用:<template is="模板名字(name)"  data="{{item(数据传递)}}" />,形如{{...item}}中的三个点表示数据平铺,即之后调用其属性不必是item.attr而可以直接attr,类似Java中的静态引入。

8.6.4、post.wxss中,样式引入:@import "相对路径";

8.6.5、js不支持template 模板化。

8.6.6、模板嵌套中的样式引用:由里至外,在上一级中逐层 @import 下一级的样式。

8.6.7、在模板嵌套中,常用前缀控制样式的区分。

9、组件自定义属性及获取属性

template只是个占位符,提高了代码的复用性,但是在程序编译之后的代码中是不包含template标签的。所以不能再template标签加上响应属性。在<template />上绑定事件是不行的,他只是一个占位符,想要绑定事件,在<template>外面包一层<view catchtap="onPosttap"></view>。

自定义属性: data-开头,后加字母和"-"符号的组合。

例如: data-custom-data

点击事件发生后,自定义属性可以在事件对象中找到,event.currentTarget.dataset.customData

event:事件对象;currentTarget:当前点击的对象;dataset:所有自定义属性的集合

注意,前面是data-custom-data,但在后面data-没了,先把“-”分割后的单词全部变为小写,并且后面的"-"也没了而且“-”后的首字母变成大写。

10、数据传递(一)

1、列表页跳转链接绑定id,url:"路径?XXX"+postId

2、接收postId参数

onLoad:function (option) {var postId= option.XXX;
})

3、详情页获取数据,引用数据文件

var postsData = require('../../../data/posts-data.js');

4、获取postId对应的文章数据

var postData=postsData.postList[postId];

(这里不能写成postsData[postId],为undefined,postsData.postList才是数组)

5、AppData可以查看所有数据绑定的情况

6、绑定数据统一使用this.setData({postData:postData})可忽视同步异步差别,而且在新版本中this.data已失效

10、数据传递(二)

在html的属性中添加 data-xxx="yyy" ,则xxx将会是一个值为yyy的变量,通过事件传递给逻辑层,然后逻辑层用event.currentTarget.dataset.xxx来获取。

11、缓存

小程序的缓存上限不能超过10MB,缓存不清除,将永久存在。

在Storage页面查看缓存的情况。

共有4类操作,8种方法,每类操作,同时具有同步和异步两种方法,

1.设置缓存:setStorageSync(key,value);

2.获取缓存:getStorageSync(key);

3.删除缓存:removeStorageSync(key);

4.清除所有缓存:clearStorageSync();

同步后缀Sync,如clearStorage()异步,clearStorageSync()同步。

12、同步 & 异步

简单来说,success,fail,complete里面有this基本要换成that代替,因为这里的this上下文环境变了。缓存能用同步最好用同步的方法.异步的选择最好根据业务的逻辑来选择,契合业务来写代码,双耦合。

(1)同步的缺陷是如果在这里执行不了,整个UI会在此处卡住,后面的代码走不了,这段时间耗时会非常长;

(2)在小程序中,能用同步用同步,尽量少用异步;

(3)京东订单系统用的是异步操作。

13、音乐播放器

13.1、关于调用音乐的组件方法其音乐和封面的图片需要用网络地址来调用。

13.2、进入页面监听音乐播放事件:

wx.onBackgroundAudioPlay(function callback)
wx.onBackgroundAudioPause(function callback) 重新播放会继续上次暂停的时刻
wx.onBackgroundAudioStop(function callback) 重新播放会真的从头开始

13.3、BUG:在模拟器上暂停监听——重新播放时会从头开始,但是真机上是正常的,会在上次暂停的时刻开始。

14、事件驱动思想

14.1. 事件驱动思想, 使用事件驱动来实现模块之间传递参数与解耦.比如在A模块发射一个事件,在B模块监听这个事件,中间使用数据来进行传递即可,像这里就是在总模块里面监听子模块里面的音乐播放状态;

14.2. 数据优先思想, 改变UI, 只需要改变该数据绑定的对应的数据就可以. 这点和angular,iOS中的RAC, 响应式编程思想类似;

14.3.数据绑定优势还有,一个数据可以绑定多个事件,这样只需要在js文件里面写上对应的多个事件即可,不用像jQuery一样要获取多个dom元素才能进行多个事件描述;

14.4.可能利于做单元测试。

15、APP生命周期

15.1、app.js里面定义全局变量和方法,格式为App({});

15.2、全局变量字段globalData

15.3、App只有三个生命周期函数

onLaunch(启动),onShow(启动后和隐藏后的显示),onHide(后台隐藏)

其他函数onError

15.4、page.js 中获取app.js:getApp()

16、taget & currentTarget

taget指的是当前点击的组件,例如swiper里的image,而currentTarget指的是事件捕获的组件,例如整个swiper滚动条,而swiper里并不存在id,所以程序并不能得到一个id参数,无法显示页面和数据。

 


17、路由

跳转到一个带tab选项卡的页面,必须使用wx.switchTab这个方法,但要跳转到一个不带tab选项卡的页面,也还是需要redirect或者navigate。如果使用navigate,redirect则页面跳转不了。

18、tabBar

如果你想让哪个页面出现tabBar,那么这个页面的页面文件路径,必须把它放到list数组下面成为list的子元素。

 

19、前端 & 后端衔接

19.1、wx.request

请求中header一定要填写,但是“content-type”后面不能写“application/json”和空字符串。建议写成“content-type”:“json”,这并不是小程序的问题,可能是该api对应的服务器的问题。

20、高级数据绑定

var obj={

     a=1,

     b=2

  }

this.setData(obj)与this.setData({

      objData:obj

})的区别:

第一种的结果就相当于直接平铺

data:{

a:1,

b:2

}

第二种相当于给data对象新增一个key,结果是

data:{

objData:{

a:1,

b:2

}

}

上面动态绑定数据结构,可以理解为

readyData[settedkey] = { movies:movies },

等价与

{

inTheaters :{movies(字符串):movies(数据结构)},

comingSoon :{movies(字符串):movies(数据结构)},

top250:{movies(字符串):movies(数据结构)}

}

21、异步函数回调

 

22、等待加载

wx.showNavigationBarLoading(Object object) // 代码执行前

wx.hideNavigationBarLoading(Object object) // 代码执行完

23、下拉刷新

page.json 配置"enablePullDownRefresh":"true"

scroll-view组件不能和onPullDownRefresh同时使用,上拉加载可使用onReachBottom页面上拉触底事件的处理函数。改用view 替换scroll-view,默认页面方法:

onPullDownRefresh 下拉刷新

onReachBottom 触底加载更多

(下拉刷新的时候,记得先清空数据,不然逻辑上会合并数据)

Ps:json文件里面配置的background-color是最低层的,就是下拉刷新露出来的那部分背景。

24、图片预览功能

24.1、在图片上增加绑定事件:data-src="{{movie.movieImg}}" catchtap="viewMoviePostImg"

24.2、在js中调用api:

  /*查看图片*/viewMoviePostImg: function (e) {var src = e.currentTarget.dataset.src;wx.previewImage({current: src, // 当前显示图片的http链接urls: [src] // 需要预览的图片http链接列表})}

25、登录授权获取用户信息

 

wx.login:不需要授权,静默登陆,登陆状态有时效性,多久失效由微信服务器决定;

wx.checkSession:可查看是否失效;

wx.getUserInfo:获取用户信息(明文信息,加密信息);

加密信息:包含unionID(可判断在同一主体下的公众号、服务号、企业号、小程序中用户是否时同一个人);

用户拒绝授权之后下次登陆不会弹出授权框,可主动引导用户到授权页。

 

26、用户设置界面

API:wx.openSetting

如果获取用户信息第一次拒绝过,再点击获取用户信息就直接失败,解决方案:通过用户设置界面,可以重新设置用户权限

27、动态设置分享按钮

 

28、场景值


http://chatgpt.dhexx.cn/article/PJmbZC5D.shtml

相关文章

微信小程序生态15- 批量提交微信小程序审核的一种方式

文章导航 微信小程序生态1-初识小程序 微信小程序生态2-创建一个微信小程序 微信小程序生态3-微信小程序登录流程设计 微信小程序生态4-扫普通二维码进入小程序、打开短链接进入小程序 微信小程序生态5-微信公众号扫码登录PC端网页 微信小程序生态6-微信公众号授权登录(适用于…

微信小程序订阅消息定时发送消息

微信小程序订阅消息定时发送消息 本人专注使用云开发&#xff0c;实现一个前端可以做后端以及整个项目的部署与上线。 如果觉得我讲的好就可以给我点个赞。也可以加我微信了解详情。 1.我们先要了解什么是订阅消息 而现在小程序支持云开发&#xff0c;使用云函数可以免鉴权。…

java 基本微信小程序的一起考研资料学习系统 uniapp 小程序

随着移动互联网技术的迅速发展,要求人们的知识水平和综合素质越来越高。自学能力成为提高自己水平的关键,因此出现了各种适合自学的在线学习网站。如手机APP,电脑软件,书本等等,其中用户量最多的还是不受时间,地点限制的手机应用,和各类微信小程序。其原因是手机及微信已经成了…

java后端-微信小程序使用七牛云存储

微信小程序使用七牛云存储 导读开发前的准备七牛云配置微信小程序测试号配置java配置-spring-boot 正式开始java端代码七牛云工具类编写响应类编写七牛云响应结果获取token的控制器 小程序代码七牛云工具类工具类的调用 总结查阅资料七牛云 导读 最近在做一个微信小程序项目&a…

微信小程序开发前端基础知识

文章目录 一、简介1、是什么2、为什么 二、准备工作1、环境准备1.1、注册账号1.2、获取APPID1.3、开发工具 2、创建微信小程序 三、组件1、目录及其作用介绍2、页面操作3、view 块级元素4、<navigator>导航跳转5、scroll-view滚动6、text 行标签7、swiper 轮播8、常用表单…

微信小程序——图片识别

我的微信小程序 期末大作业——基于百度大脑API的图片识别小程序 具体实现了动物识别、植物识别、车辆识别 三个功能 实验源码已经放到了我的GitHub&#xff0c;欢迎测试修改 GitHub仓库地址&#xff1a;https://github.com/ZHJ0125/ImageMaster 备用码云仓库地址&#xff1a;h…

微信小程序使用云开发

微信小程序使用云开发 1.序言2.初识云开发3.环境搭建4.正式使用5.使用感受6.结语 1.序言 最近给一位即将毕业的同学做了一个毕设(需求是一个小程序)&#xff0c;最开始我是使用自身最为熟悉的语言(Java) 进行编写的后端接口。然后做了几天&#xff0c;哪怕最熟悉&#xff0c;但…

微信小程序学习笔记

1. 小程序简介 小程序是一种全新的连接用户与服务的方式&#xff0c;它可以在微信内被便捷地获取和传播&#xff0c;同时具有出色的使用体验。 2.小程序运行环境 微信小程序API文档 boolean wx.canIUse(string schema) | 微信开放文档https://developers.weixin.qq.com/minipr…

微信小程序 audio 音频 组件

完整微信小程序(Java后端) 技术贴目录清单页面&#xff08;必看&#xff09; 音频。1.6.0版本开始&#xff0c;该组件不再维护。建议使用能力更强的 wx.createInnerAudioContext 接口 属性类型默认值必填说明最低版本idstring否audio 组件的唯一标识符1.0.0srcstring否要播放…

微信小程序三级分类

今天&#xff0c;在做一个电商小程序的分类页面&#xff0c;要实现三级分类。首先&#xff0c;先上图。 要完成这样一个功能&#xff0c;前端的界面就不说了&#xff0c;具体说说怎么实现的吧&#xff0c;说复杂也挺复杂的&#xff0c;说简单只要会了思路就不难了。其实思路就…

微信小程序如何获取数组下标

我们在写代码的时候我们经常会用到获取数组下标的方法&#xff0c;我们知道java通常是用for循环&#xff0c;i,输出i就出来了&#xff0c;那对于小程序该怎么实现呢&#xff0c;首先我们会想到直接用index,但是这种方法是不可行的。 1.首先要在js文件里写一个方法&#xff0c;…

Maven项目无法使用JSONObject.fromObject方法的解决方案

JSONArray jsonArray JSONArray.fromObject (arrayStr); 解决方案 导包依赖 import net.sf.json.JSONObject;<!-- JSONObject对象依赖的jar包 --> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils<…

Cannot deserialize value of type `java.lang.Integer` from Object value (token `JsonToken.START_OBJEC

错误信息&#xff1a;org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type java.lang.Integer from Object value (token JsonToken.START_OBJECT); nested exception is com.fasterxml.jackson.databin…

cannot deserialize from Object value (no delegate- or property-based Creator) 解决方法

问题描述 直接上图 报错 cannot deserialize from Object value (no delegate- or property-based Creator) 无法从Object值反序列化&#xff08;没有基于委托或属性的创建者&#xff09; 原因分析&#xff1a; 返回的pojo类&#xff0c;里面添加了一个全参构造函数&#x…

JsonArray.fromObject()将集合转换成字符串(案例学习)

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…

JSONObject没有fromObject方法(Json lib 库的使用)

刚开始还不知道为啥&#xff0c;最后到 jsonlib 网站上查看了原因&#xff0c;这个是连接地址 Json-lib comes in two flavors, depending on the jdk compatibility. json-lib-x.x-jdk13 is compatible with JDK 1.3.1 and upwards. json-lib-x.x-jdk15 is compatible with J…

关于JSONObject.fromObject方法报错解决方法

最近在学习web开发时&#xff0c;遇到了这样的一个报错&#xff1a; 查了很久才发现错误。 解决方案&#xff1a; 1、查看架包 一共是6个架包 下面是IDEA环境添加架包语句&#xff1a; <dependency><groupId>commons-beanutils</groupId><artifactId&…

JSONArray.fromObject(str)

com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex 根源 所在 引入的jar包重复了 &#xff01; 本次问题场景 &#xff1a; 使用 json 解析 [{"num":"D30","data":"23.6"},{"num":"D…

JSONObject.fromObject 日期类型转换问题

今天在开发的时候遇到的问题&#xff1a; 由于需要调用rest服务&#xff0c;所以将dto对象转换为JSON的时候出现了日期格式不正确的问题&#xff1a; 首先查看接收的DTO&#xff1a; 由于接口需要以数组的方式传输&#xff1a; JSONArray jsonArray array.fromObject ( Arra…

JSONObject.fromObject 找不到这个方法或是报错

本人是springboot快速创建项目生成&#xff0c;默认导入springboot json.jar。 JSONObject.fromObject 方法找不到。 解决&#xff1a;在pom依赖加入 <dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><ver…