如果不希望用缓存那么就用 methods
小程序的生命周期回调
1.onLaunch 生命周期回调-监听小程序初始化
2.onShow 生命周期回调-监听小程序显示(从后台显示到前台)
3.onHide 生命周期回调-监听小程序隐藏(从前台隐藏到后台)
4.onError 错误监听函数
5.onPageNotFound 页面不存在监听函数
其他 开发者可以添加任意的函数或数据到 Object 参数中,用 this 可以访问
如何获取用户的 openid
用 wx.login 调用接口获取登录凭证(code),通过凭证进而换取用户登录态信息(包含用户的唯一标识 openid 以及本次登录的会话密钥等)
app.json 是全局配置,包含所有页面路径、界面表现、网络超时时间、底部 tab 等
点击事件 bindtap=“handleStart”
页面路由跳转 wx.switchTab({url:“./index”})
观察者模式=订阅/发布模式,该模式中有观察者(订阅者)和被观察者(发布者)
比如 vue 中的$emit
mvc 框架:是 Model View Controller.是模型(model)-视图(view)-控制器(controller)的缩写。
MVC 是一种使用 MVC 设计创建 Web 应用程序的模式:
Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象复杂在数据库中存取数据
View(视图):是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的
Controller(控制器):是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
注意:MVC 框架不是设计模式
框架和设计模式的区别:框架是代码重用,而设计模式是设计重用,架构介于两者之间。
设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比框 架更抽象;
框架可以用代码表示,也能执行或者复用,而对模式而言只能实例才能用代码表 示,设计模式是
比框架更小的元素,一个框架中往往包含 1 或多个设计模式,框架总是针对某一特定应用领域,但
同一模式可适用于各种应用。即框架是软件,而设计模式是软件的知识。
MVC:Model-view-controller:是通过 controller 来控制,
mvc 有两种流程:
- 通过 view 接受指令,传递给 controller.然后对模型进行修改或者查找底层数据,最后把改动渲染在视图上,即 view->controller->model>view
- 通过 controller 接受指令,传给 controller; 即controller->model->view
mvc 优点:
- 耦合性低。视图层和业务层分离。
- 重用性高
- 生命周期成本低
- 可维护性高
- 部署快
mvc 缺点:
- 不适合小型中型的应用程序
- 视图与控制器之间过于紧密连接
- 视图对模型数据的低效率访问
mvc 用在 java(struts2)和 c#(asp.net)服务端应用中
MVVM:model-view-viewModel
- 函数表达式 即字面量声明 var a = function(){}
- 函数关键字声明 function a(){}
注意:js中的函数声明会提前
- 构造函数和实例的关系:
person1和person2都是构造函数Person的实例。
实例的构造函数属性(constructor)指向构造函数。person1.constructor==Person- 构造函数和原型的关系
Person.prototype == 原型对象;
Person.prototype.constructor = Person
- 实例和原型对象的关系
实例会继承原型对象的属性,在隐式属性__proto__里面找。
person1.proto===Person.prototype;
注意:原型对象和实例都是Person的实例,都是普通对象,(但是Function.protype除外,
是函数对象,但是没有prototype属性)
Person.prototype.consotructor == Person;
person1.__proto__==Person.prototype;
person1.constructor ==Person;
这个连接存在于实例和构造函数的原型对象之间,不是存在于实例和构造函数之间
- 普通对象有var o1={};var o2 = new Object;var o3 = new f1();
- 函数对象有函数的3种声明方式,有字面量声明、函数声明、通过构造函数声明。函数对象是函数
总结:凡是通过new Function()创建的对象都是函数对象,其他的都是普通对象。
对象都有__proto__属性,函数对象才有prototype属性- 一个普通对象的构造函数===Object。
Person.prototype是一个普通对象,所以Person.prototype.proto==Object.prototype
var o = Object.create({a},{ name:{
enumerable: true,
value:"ssss"
}})
第一个参数a是将o.proto=a,第二个参数是给实例o添加自定义属性,默认是不可枚举不可改的,需要添加enumerable: true, writable: true,
- var obj = {};创建了一个空对象obj
- obj.proto=ClassA.prototype 将这个空对象的__proto__属性指向函数对象的prototype成员对象
- ClassA.call(obj).使用新对象调用函数,函数里面的this指向了新实例对象
- 将初始化完毕的新对象地址,保存到等号左边的变量中
注意:若构造函数中返回this或者返回值是基本类型的值,则返回新实例对象;若返回值是引用类型的值,则实际返回值是这个引用类型
- 添加defer属性:会在后台下载,等前边的脚本执行完毕后才会执行,按script的顺序来执行
- 添加async属性:会在加载完毕后执行。不会按着script在页面中的顺序来执行,而是谁先加载完谁执行。
- 使用场景:
defer,脚本代码依赖于页面中的DOM元素(文档是否解析完毕),或者被其他脚本文件依赖
async:脚本不关心页面中的DOM元素,并且也不会产生其他脚本需要的数据
- 实现js文件的异步加载,
- 管理模块之间的依赖性,便于代码的编写和维护。
- F10 一步一步执行,遇到方法的时候,一步执行完方法,不会进入到方法中,即不会看到方法里面详细的调试
- F11 一步一步执行,遇到方法的时候,会进入到方法的内部,一步一步执行方法里面的代码
- F11+Shift 从当前的方法中退出,即一步执行完方法,
- F8+Ctrl 使断点调试无效