Appearance
数据绑定
C(创建数据)
- Vue
- 在组件配置对象中,具有data工厂函数,可以返回出data对象
- 面试题:为什么data必须是一个函数
- 如果data是一个对象,那么通过当前组件构造函数创建的多个组件实例,会共享这一个data对象,导致多组件没有各自的独立状态
- React
- 在class组件中,class结构中具有state属性,属性值为一个对象
- 小程序
- 在组件配置对象中,具有data对象
- 注意:小程序会将data对象进行JSON化,实现对象深克隆,所以不需要像Vue一样
- 小程序的data属性可以后续直接通过setData新增,没有任何区别
- Vue
R(读取数据)
- 在模版中渲染
- Vue
- 在template中使用插值语法,将data中的属性名写入内部即可使用
- 注意:在template中,想要把data中的数据作为文本内容显示出来,才需要使用插值语法
- React
- 在render函数的return中.使用{},大括号中书写this.state.msg即可
- 小程序
- 与Vue相同
- 注意:只要想在wxml中使用data中的数据,一定要加插值语法
- Vue
- 在js代码中读取数据
- Vue
- 通过this.msg可以读取到数值
- 流程:this.msg->数据代理get->this.$data.msg->数据劫持get->返回通过闭包保存的msg数据
- React
- 通过this.state.msg可以读取到数值
- 小程序
- 通过this.data.msg可以读取到数值
- 说明:小程序没有数据代理和数据劫持
- Vue
- 在模版中渲染
U(修改数据)
- Vue
- 通过this.msg="我是修改之后的数据"
- 流程:this.msg="我是修改之后的数据" => 数据代理set => this.$data.msg="我是修改之后的数据" => 数据劫持set => 通过dep调用notify方法,通知所有的watcher实例进行视图更新
- 面试题1:Vue更新data数据是同步还是异步?
- 同步修改data中的数据
- 面试题2:Vue更新data数据,重新渲染视图是同步还是异步?
- Vue更新视图永远是异步更新
- React(持久化状态框架)
- 通过this.setState({msg:"我是修改之后的数据"})
- 面试题一:setState的执行是同步执行还是异步执行?
- 同步执行
- 面试题二:setState更新数据的效果是同步的还是异步的?
- 即使同步又是异步
- React更新机制较为特殊:
- 同步
- 原生事件
- 定时器
- 异步
- 合成事件(如果事件名称是驼峰命名法,那就是合成事件)
- 注意:合成事件使用到了事件委托,它将事件绑定在#root元素身上
- 生命周期
- 合成事件(如果事件名称是驼峰命名法,那就是合成事件)
- 同步
- 小程序
- 通过this.setData({msg:"我是修改之后的数据"})
- 注意:
- 小程序中,setData会同步修改data数据,但是会异步更新视图
- 说明**:setData执行结束,得到的数据一定是最新的**
- Vue
总结:无论是Vue,React,小程序,都有一个共同特点,就是会将更新视图操作进行类似防抖效果
数据流向
Vue
单向(或者可以成为伪双向,上课提到的双向,是指双向数据绑定,不是双向数据流)
主要:双向数据绑定特指v-model指令,看起来似乎是input内容发生变化,data中的数据立马发生变化,但是及原理还是经过了事件监听
v-model原理:
将data中的数据作为input框的默认值显示
- vue
<input type="text" :value="msg"/>
当input内容发生变化的时候,要将data中的对应属性值进行修改
- vue
<input type="text" @input="(event)=>{this.msg=event.target.value}"/>
React
- 单向
小程序
- 单向
事件绑定
- 事件类型分类:
- 冒泡事件和非冒泡事件
- 冒泡事件
- 当一个组件上的事件被触发后,该事件会向父节点传递(相当于原生事件机制中的冒泡阶段事件回调)
- 语法:bind+事件名="事件回调函数名称"
- 注意:事件回调函数声明位置,与生命周期同级
- 非冒泡事件
- 当一个组件上的事件被触发后,该事件不会向父节点传递。(相当于是原生事件机制中的阻止冒泡的事件回调)
- 语法:catch+事件名="事件回调函数名称"
- 注意:阻止冒泡只是说明当前事件不会通知父节点,但是自身的回调函数还是会触发的
- 冒泡事件
- 捕获事件和非捕获事件
- 捕获事件
- 语法:capture-bind+":"+事件名="事件回调函数名称"
- 注意:捕获事件绑定,必须加上冒号,不能省略
- 非捕获事件
- 语法:capture-catch+":"+事件名="事件回调函数名称"
- 捕获事件
- 冒泡事件和非冒泡事件
路由跳转
- 单页面应用
- 实际上就是说只请求回来一个html文件,后续页面的变化,都是通过dom的CRUD操作,对页面进行展示效果变化
- 小程序其实是一个多页面应用
- VueRouter路由跳转的方法
- 声明式导航
- 以标签形式引导用户进行跳转的方式(router-link)
- 编程式导航
- 通过js中的某些API控制路由跳转的方式(push,replace,go,back)
- 总结:在原生html和js中,也可以通过a标签和location对象的属性控制页面跳转,但是VueRouter的跳转不会刷新或者请求页面
- 声明式导航
- 小程序路由跳转
- 声明式导航
- navigator组件
- 编程式导航
- wx.navigateTo(Object object)
- 当前API跳转页面,会保留当前页面(保留页面实例对象,后续回到当前页面不会重新挂载)
- 注意:
- url必传
- url可以写相对路径,路径会参考当前所在文件夹
- url可以写绝对路径,路径会参考当前项目根路径(app.json文件所在位置)
- 小程序中页面栈最多十层,小程序早期页面栈最多五层
- 页面栈上限规则:如果页面栈已经达到上限,那么将无法跳转新的页面
- wx.redirectTo(Object object)
- 当前API跳转页面,会关闭当前页面(销毁页面实例对象,后续回到当前页面会重新挂载)
- 当前API不需要考虑页面栈层数问题,因为他始终会先销毁当前页面,在开启新页面
- wx.navigateTo(Object object)
- 声明式导航
- keep-alive组件
- keep-alive能够缓存内部组件的状态,实际上是将整个组件实例对象都缓存下来了
- include属性可以控制只缓存对应名字的几个组件
- exclude属性可以控制不缓存对应名字的几个组件
- max属性可以控制总共缓存多少个组件实例(默认值没有)
- 注意:在新实例被创建之前,已缓存组件中最久没有被访问的实例会被销毁掉
生命周期
- 小程序一共有5个生命周期
- 初始化阶段
- onLoad->页面开始加载(类似于created)
- onShow->页面开始显示(类似activated)
- onReady->页面首次渲染完成(类似于Vue的mounted)
- onReady相当于Vue的mounted中使用$nextTick
- 挂载不等于渲染,挂载是将内存中的节点插入到页面的html结构中,但是浏览器什么时候绘制该节点由浏览器决定
- 离开阶段
- onHide->页面隐藏(类似deactivated)
- 该生命周期和wx.navigateTo挂钩
- onUnload->页面卸载(类似于beforeDestroy)
- 该生命周期和wx.redirectTo挂钩
- 回退按钮也会触发该生命周期
- onHide->页面隐藏(类似deactivated)
- 初始化阶段
- 注意:
- 生命周期和实际效果唯一不相符的地方,在onLoad中打断点,按照生命周期图所示,此处模拟器应该看不到数据,但是实际效果可以看到
- 个人认为,应该是debugger拦截时间晚了
数据请求
- 发送请求
- API:wx.request()
- 注意点:
- 配置相关
- 上线时
- 小程序要求开发者必须要提前配置好未来会请求的服务器域名,如果不提前配置,将请求失败
- 配置流程:开发者中心->开发管理->开发设置->往下滑找到配置服务器域名
- 开发中
- 小程序允许开发者在开发过程中,暂时不校验合法域名
- 配置流程:开发者工具->详情->本地设置->勾选"不校验合法域名"
- 上线时
- 基础知识
- 默认超时时间和最大超时时间都是60s
- 小程序发送请求最大并发限制10个,Chorme和FireFox最大并发数是6个
- 服务器返回值使用 UTF-8 编码
- 小程序只能发送HTTPS请求
- 配置相关
列表渲染
语法
可以通过wx:for指令,遍历对应的data数据,从而产生多个节点
- js
<swiper-item wx:for="{{banners}}" class="bannerItem">
小程序会将遍历出来的内容默认存放在item变量上
小程序会将遍历出来的下标默认存放在index变量上
小程序可以通过wx:for-item可以自定义遍历数据存放变量的名称
小程序可以通过wx:for-index可以自定义遍历下标存放变量的名称
小程序需要给每个遍历生成的节点添加唯一标识wx:key
- 注意:此处写法与Vue有所不同,我们给wx:key提供一个字符串,小程序会将该字符串作为属性名,自动从item身上查找该属性
- :key="item.id" => wx:key="id"
- 假如当前有一个数组,数组内部的数据是图片的字符串地址,那么可以使用item作为唯一标识,但是由于小程序的wx:key的写法很特殊,所以此处可以使用关键字*this
本地存储
增加/修改
- API:
- wx.setStorage
- 接收参数一个,配置对象
- 必传属性:key,data,success(成功回调选传)
- 异步设置Storage(下一行代码立马读取Storage不会得到最新数据)
- 接收参数一个,配置对象
- wx.setStorageSync
- 接收参数两个
- key值
- value值
- 同步设置Storage(下一行代码立马读取Storage,一定能得到最新的)
- 接收参数两个
- wx.setStorage
- API:
读取
API:
wx.getStorage
- 接收参数一个,配置对象
- 必传属性:key,success(成功回调选传)
- 异步读取Storage(该函数需要传入回调函数,等读取成功之后,会执行回调函数)
- 接收参数一个,配置对象
wx.getStorageSync
- 接收参数一个
- key值
- 接收参数一个
同步读取Storage
删除
API:
wx.removeStorage
- 异步删除某个key值的Storage
wx.removeStorageSync
- 同步删除某个key值的Storage
清空
API:
wx.clearStorage
- 异步清空所有key值的Storage
wx.clearStorageSync
- 同步清空所有key值的Storage
用户授权
- 到2021/8/14为止,一共出现了三种获取用户授权方法,目前可用一种
- 用户首次登陆授权:
- 早期
- 直接调用wx.getUserInfo({}),可以弹出授权窗口,实现用户授权(目前已经废弃,因为非常影响用户体验,所以才换成中期版本)
- 中期(21/4月,该方法废弃,正式出现第三种)
- 通过button组件获取用户个人信息,需要配置标签属性open-type="getUserInfo"
- 用户选择之后(无论用户选择取消还是确定,都会执行success回调),获取到用户的个人信息,需要绑定事件,事件名getuserinfo
- 在事件回调函数中,通过形参res.detail可以获取到用户个人信息
- 将获取到的个人信息更新到data中,在wxml中展示即可
- 注意:data的属性可以不需要提前声明,可以后续通过setData新增
- 最新
- API:wx.getUserProfile()
- 注意:
- 问题一: 报错信息"wx.getUserProfile is not a function"
- 说明:当前版本库不支持该API,需要调整版本库(版本必须是2.15.0以上)
- 可以通过wx.canIUse检查当前API是否适用
- 每次调用该API都会弹出授权窗口
- 该API必须在点击事件的回调函数中执行才有用,否则无效(例如onLoad)
- 如果还想实现二次登录免授权功能,可以在首次获取到信息之后,将信息缓存到本地存储中(Storage)中
- 问题一: 报错信息"wx.getUserProfile is not a function"
- 早期
- 用户二次登录免授权(静默登录):
- API:wx.getUserInfo({})
- 通过该API可以获取到用户的个人信息
- 注意点:该API只能在用户经过了首次登录授权流程之后,才能够直接获取到用户个人信息
- 奇特的组件
- 组件名:open-data
- 该组件很鸡肋,仅用于给用户观看,开发者想要获取到内部数据,无法获取
其他重要功能
从当前小程序跳转到另外一个小程序
- API:wx.navigateToMiniProgram
- 文档位置:API->开放接口->小程序跳转
- 该API需要传递另外一个小程序的appid,才可以实现跳转
小程序插件使用
前往fuwu.weixin.qq.com寻找自己想要的插件
进入插件详情页面,点击添加插件
进入微信公众平台后台,可以在设置->第三方设置
由于当前学习的插件是定位以及城市选择器,所以需要使用到定位功能
- 需要申请开启定位功能
- 微信公众平台后台->开发->开发工具,点击腾讯位置服务
- 扫码授权之后,会自动跳转到腾讯位置服务官网,点击进入控制台(第一次需要注册账号)
- 控制台->左侧导航->应用管理->我的应用中,添加新的key值
- 需要申请开启定位功能
在小程序中引入插件
在app.json中添加一个plugins配置项,用于声明当前项目使用到的插件
- json
{ "plugins": { "citySelector": { "version": "1.0.0", "provider": "wx63ffb7b7894e99ae" } } }
在app.json中添加一个permission配置项,用于申请获取用户定位信息
- json
{ "permission": { "scope.userLocation": { "desc": "你的位置信息将用于小程序定位" } } }
使用插件
通过某个按钮的点击事件,用于跳转到对应的插件页面
- javascript
const key = 'BZ7BZ-QQWCU-DHWV2-BFJJG-B2JZF-KSBT3'; // 使用在腾讯位置服务申请的key const referer = '七月入栈'; // 调用插件的app的名称 const hotCitys = '上海,北京,深圳,泉州'; // 用户自定义的的热门城市 wx.navigateTo({ url: `plugin://citySelector/index?key=${key}&referer=${referer}&hotCitys=${hotCitys}`, })
7.获取当前用户选择的城市信息
1.引入组件
javascriptconst citySelector = requirePlugin('citySelector');
1.在当前页面的onShow中,调用该组件的getCity方法获取到用户的选择结果
javascriptconst selectedCity = citySelector.getCity();
3.强制更新
前言:小程序的启动一共分两种,分别是热启动和冷启动
冷启动:根据小程序机制,首次开启的时候,小程序需要初始化渲染
热启动:根据小程序机制,如果用户离开当前小程序不超过5分钟(期间用户的内存足够),再次进入小程序,小程序会保持离开之前的状态,不会关闭
1.获取全局唯一的更新管理器实例
javascript
let updateManager = wx.getUpdateManager();
2.绑定checkforupdate事件监听
1.他会不断向微信官方服务器发送请求,检测当前小程序版本是否为最新版本
2.如果出现比本地更新的版本,会自动下载
javascript
updateManager.onCheckForUpdate(function (res) {
// 请求完新版本信息的回调
//res中的hasUpdate可以知道是否需要更新
if (res.hasUpdate) {
//弹窗提示用户
}
})
3.绑定updateReady事件,监听小程序更新是否下载完成
javascript
updateManager.onUpdateReady(function () {
//调用该API实现更新包安装,强制更新
updateManager.applyUpdate()
})
注意:一般来说不会直接调用updateManager.applyUpdate(),因为这个代码会直接关闭小程序,并开始更新的安装操作,为了防止用户正在做某些大事,我们一般会友好的弹出窗口提示用户有最新版本,咨询是否更新
开发注意事项
- swiper组件
- swiper组件内部只能使用swiper-item组件
- swiper-item组件也只能在swiper中使用
- swiper-item组件代表着轮播图中的一页的内容
- 注意:swiper组件自带overflow:hidden效果
- scroll-view组件
- scroll-view组件的功能是实现局部区域滑动效果
- scroll-view组件内部可以书写任意内容
- 标签属性:
- enable-flex属性,该属性可以使当前节点中display:flex样式生效
- scroll-x属性,该属性用于开启scroll-view组件X轴滑动效果
- 该组件的BUG:
- 虽然开启enable-flex属性,可以让内部子元素横向排列,但是在页面布局计算时,他依旧会按照开启之前的高度进行计算
- 解决方案:
- 多行文本溢出隐藏,显示省略号效果
- 开启webkit内核的盒模型
- display:-webkit-box
- 设置几行之后出现省略号
- -webkit-line-clamp:2
- 设置当前元素内部文本排列方向
- -webkit-box-orient:vertical
- 溢出隐藏
- overflow:hidden
- 开启webkit内核的盒模型
- 小程序数据请求
- API:wx.request({})
- 注意点:
- 小程序中没有window,全局对象是wx(所以无法使用axios)
- 只能发送HTTPS请求(也就是说,公司必须有CA证书)
- 超时时间:默认超时时间和最大超时时间都是60s
- 小程序请求最大并发数10个,chrome和firefox最大为6个
- 服务器返回值使用 UTF-8 编码
- 小程序只可以跟指定的域名进行网络通信
- 上线时
- 小程序需要提前配置好即将请求的域名
- 配置流程:开发者中心->开发管理->开发设置->配置服务器域名
- 开发中
- 小程序允许在开发过程中,暂时忽略该方面的检测
- 配置流程:开发工具->详情->本地设置->勾选"不校验合法域名"
- 上线时