wxlings / mini-framework

Mini-program `s framework...

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

基础

   变量声明: var ,let ,const
   `var` 全局有效 可以重复声明
   `let` 声明的变量只在'let'命令所在的代码块内有效。并且范围内只能声明一次 ,for循环时非常适合使用
   `const` 声明一个常量,一但声明,常量的值就不能改变。如果是引用类型的值,引用数据内部数据可以修改,如canst arr = [person] person.name = 'w' person.name = 'x'

常量符号:

   人民币符号:  `¥`  `¥`
   html实体符号: `空格` => `&nbsp` , `>` => `&gt;` , `<` => `&lt;` , `"` =>`&quot;` , `&` => `&amp;`
	基本类型(基本数值、基本数据类型)是一种既非对象也无方法的数据 所有基本类型的值都是不可改变的。
	>  JavaScript 中,共有7种基本类型:
	[String](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String)
	[Number](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number)
	[Boolean](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Boolean)
	> BigInt,Null,Undefined,Symbol (ECMAScript 2016新增)
	
	全局类型转换:
		parseInt() parseFloat() toString()
		
	Boolean: 对象是一个布尔值的对象包装器, 0-0、null、false、NaN、undefined、或者空字符串(""),则生成的 Boolean 对象的值为 false。
			> 注意:字符串'false'是真值,let a = Boolean("false") // a === true
	
	Number: 对象是经过封装的能让你处理数字值的对象,
			> Number.isNaN(param) 确定传递的值是否为 NaN,并且检查其类型是否为 Number。
			> Number.MAX_VALUE 能表示的最大正数。
			> let a = Number("123") // a === 123  等同于全局方法:parseInt("123")
			> let b = Number('adb') // b ==== NaN
			>>> console.log(a,b
			
	String: 对象是一个用于字符串或一个字符序列的构造函数。和其他语言一样使用''或者""进行包裹
			> 转义: \0, \' , \" , \\ , \n (next) , \r (return), \t
			> 可以使用 '+'把多个字符拼接: let a = 'This is ' + 'letter ' + 'a'
			> 如果字符串过长可以使用 '\' 进行标识 
			let str = "Hello(h e l l o),\
						world(w o r l d)\
						!!!(speech)" 
			>>> console.log(str,str.length)
			
			str.concat('@#$$%') // 不建议使用;将一个或多个字符串与原字符串连接合并,形成一个新的字符串并返回 建议使用 赋值操作符(+, +=)代替 concat 方法。		
			str.startsWith('Hello',startIndex) // 是否以指定字符开始
			str.endsWith('speech',startIndex) // 是否以指定字符结束 
			str.indexOf('world',startIndex) // 从指定的index开始查找是否包含指定的子串,并返回index,没有即返回-1,index 不声明默认为0,支持负数
			str.includes('hello',startIndex) // 是否包含指定的字符
			str.substring(5,10) // 返回指定index之间的字串,末位index不声明默认字符串最后一位,不可以是负数
			str.substr(1,2) // 不建议使用,可能会被废弃,请使用subString()替换
			str.slice() //与subStrin()相同,但是支持负数
			str.trim() //从一个字符串的两端删除空白字符,并返回除空的新值
			str.trimStart() //从字符串的开头删除空格。trimLeft() 是此方法的别名
			str.trimEnd() // 从一个字符串的末端移除空白字符.trimRight() 是此方法的别名
			str.toUpperCase() //转为大写,并返回
			str.toLowerCase() // 转为小写,并返回
			str.split(',') // 根据参数把字符串分割为数组返回
			str.padStart(totalLength,'tag') // 左侧补全,使用指定tag补全到指定位数 ,例如 :h.padStart(5,'-')  => 'h----'
			str.padEnd(totalLength,'tag') // 右侧补全,使用指定tag补全到指定位数,例如 :h.padEnd(5,'-')  => '----h'
			str.match(RegExp) // 检索返回一个字符串匹配正则表达式的的结果。
			regExp.text(str) // 返回Boolean ,字符串是否满足正则条件 	
			
			字符串模板: 使用 `${variable}`
			let a = 100
			function add(params){
				return "params:" + params
			}
			let b = `This is ${a},and ${add(100)}` 
			>>> console.log(b)  //This is 100,and params:100
		

Promise 对象用于表示一个异步操作的最终完成 (或失败), 及其结果值 ;Promise是一个函数返回的对象,我们可以在它上面绑定回调函数,这样我们就不需要在一开始把回调函数作为参数传入这个函数了。

   let request = new Promise((resolve,reject) =>{
   	setTimeout(()=>{
   		let success = {
   			code:1,
   			msg:'success'
   		}
   		let fail={
   			code:0,
   			msg:'fail'
   		}
   		resolve(success)
   		//reject(fail)
   	},3000)
   })
   
   request.then(res=>{
   	console.log("resolve:",res)
   },err=>{
   	console.log("reject:",res)
   })
   
   Promist 支持链式调用

Map 保存键值对,能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。

   let map = new Map([['k','v'],['key','value']]) // 可以在构造函数直接初始化值,类似数组包数组
   map.set('keys','values') // 设置 key-value 键值对
   let hasKey = map.has(key) // 是否含有key值,返回Boolean值
   let value = map.get(key) // 获取key对应的value,如果没有则返回undefine
   let keys = map.keys() // 返回所有key的Iterator
   let values = map.values() // 返回所有value的Iterator
   let entries = map.entries() // 返回一个key-value键值对的Iterator
   map.delete(key) // 移除指定的key关联的键值对
   map.clear() // 移除所有键值对
   map.forEach((value,key,map)=>{ // 遍历Map并执行函数
   	console.log('key:',key,'value:',value,'lenth:',map.length)
   })

Object 一个对象包装器。

	let person = {
		name:'Jeck',
		age:18,
		eat(food='apple'){
			console.log('This person eat:',food)
			return food
		},
		funcation: listen(someting){
			console.log('This person listen:',something)
			return something
		}
	}
	
	> 获取属性: object.key  object['key']
	>>> console.log('Person`s name:',person.name)
	>>> console.log('Person`s age:',person['age'])
	>>> person.eat()
	>>> person.listen('content')
	
	let title = 'hello,world'
	let content = "This is a text!"
	let article = {title,content} // 使用字面量创建对象
	article.autor = 'Jeck' // 如果对象中没有声明该字段,支持设置
	>>> console.log(article)
	
	`let t = Object.assign(target,sourse,sourse,...)` //把所有sourse 对象的枚举属性复制并赋值给target,如果key有相同,以最后赋值为准
	
	let a = {name:'wxl',age:21}
	let b = {name:'jeck',gender:1}
	let c = {job:'sleep'}
	
	将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
	let d = Object.assin(a,b,c) //它将返回目标对象。{name:'jeck',age:21,gender:'male'}
	>>> console.log(a,b,c,d) // a === d 

	深层次复制对象,生成一个新对象
	let f = Object.create(a)
	f = Object.assign({},a) //  有同样的作用
	console.log(f === a) // false 只是内容相同,内存引用不同
	
	`...`  对象的拓展运算符:用于取出参数对象所有可遍历属性然后拷贝到当前对象。
	let e = {...b} // d 与 b的属性相同
	let g = {...b,...c} // 把两个对象合并生成一个新的对象
	>>> console.log(e,g)
	
	遍历对象:
	for(let key in person){
		console.log('key',key)
	}
	
	判断对象是否包含给出的属性值,建议使用 `in` 逻辑
	let hasKey = person.hasOwnProperty('key')
	hasKey = 'name' in person
	
	基本函数:
	`function` 关键字可以用来在一个表达式中定义一个函数。
	基本函数可以简单看做是一个对象,可以作为值赋值给一个引用变量,并且有自己的上下文对象 `this`
	
	let a = funcation f_name(params='no'){	// 参数可以有默认值
		console.log(params)
	}
	>>> a()

	let b = funcation (params){	//没有名字的叫匿名函数 
		console.log(params)
	}
	>>> b('content')
	
	function c(){	//没有赋值引用变量,直接使用函数名称
		console.log('...')
	}
	>>> c()
	
	箭头函数:
	`()=>{}` 没有自己的`this`,`arguments`,`super`,``
	let f = (para) =>{
		console.log(params)
	}
	>>> f()

JSON 对象包含两个方法,除了这两个方法, JSON这个对象本身并没有其他作用,也不能被调用或者作为构造函数调用。

	`JSON.parse()` 解析JSON字符串并返回对应的值,可以额外传入一个转换函数,用来将生成的值和其属性, 在返回之前进行某些修改。
	`JSON.stringify()` 返回与指定值对应的JSON字符串,可以通过额外的参数, 控制仅包含某些属性, 或者以自定义方法来替换某些key对应的属性值。
	
	let p = {
		name:'Jeck',
		age:18,
		male:True
	}
	>>> let s = JSON.stringify(p)
	>>> let o = JSON.parse(s)
	>>> console.log(s,o)
	let arr = ['a','b','c']
	let temp = arr[0]
	>>> console.log(arr,arr.length,temp)
	
	添加一个元素到末尾
	arr.push('d')
	移除末尾元素
	arr.pop()
	添加一个元素到首部(index=0)
	arr.unshift('letter')
	移除首部的一个元素(index=0)
	arr.shift()
	找到元素在数组中的索引,如果没有返回-1,与String.indexOf()相同
	let index = arr.indexOf('e')
	通过给出的索引位置删除给出数量的元素
	arr.splice(index,num) 
	>>> arr.splice(1,2) // ['a']
	倒序排列一个数组
	let reverse = arr.reverse()
	复制一个数组
	let array = arr.splice() 
	按照字典进行排序
	arr.sort()
	拼接多个数组
	let array = arr.concat(arr,arr,arr)
	是否包含给出的元素 boolean
	let hasValue = arr.includes('d')
	连接所有元素与指定标识符
	let str = arr.join('-')
	>>> console.log(str) // a-b-c
	从类数组对象或者可迭代对象中创建一个新的数组实例。
	Array.from(arr)
	用来判断某个变量是否是一个数组对象。
	Array.isArray()
	根据一组参数来创建新的数组实例,支持任意的参数数量和类型。
	Array.of()
	
	遍历数组1.
	arr.forEach((item,index,arr) => {
		console.log('index:',index,'value:',item,'array:',arr)
	})
	遍历数组2.不建议使用
	for(let key in arr){
		console.log(key) // 所有索引
	}
	遍历数组3.
	for(let value of arr){
		console.log(key) // 所有值
	}
	遍历数组4.
	for(let i = 0;i<arr.length;i++){
		console.log('index:',i)
	}
	
	遍历: 对象用`in`,数组用`of`

Vue 渐进式框架

	基础:声明周期:beforeCreate() => created() => beforeMount() => mounted() => updated() => beforeDestroy() => destoryed()
	文本插值: `{{variable}}` 
	计算属性: computed:{ function()=>{}} 类似methods:{},	区别在于计算属性是基于它们的响应式依赖进行缓存的,就是如果绑定了数据不变,那么是不会重新计算结果的 
	侦听属性: watch:{ property:function(old,new){console.log(old,new)}} 只要`property`(通常在`data`中声明)发生变化就会触发该方法,
	
	`class`与`style`绑定:都支持`对象语法`和`数组语法` 
	<!-- 对象语法 支持变量引用,支持内部三元运算-->
	<div :class="{'show-box':show,'show-error':error}"> 
		<div :style="{'background-color':show?'res':'yellow'}"></div>
		<div :style="{color:activeColor,fontSize:fontSize +'rpx'}"></div>
		<div :style="sObject"></div>
	</div>
	 <!-- 数组语法 -->
	<div :class="[content,base,error?has_error:'']">
		<div :class="[con,desc,{'error':hasError}]" ></div> 
		<div :style="[aObject,sObject]"></div>
	</div>
	
	data:{
		activeColor:'red',
		fontSize:16,
		sObject:{
			color:'green',
			display:'flex'
		},
		aObject:{
			color:'red'
		}
	}
	条件渲染:
	`v-if="condition"`,`v-else-if = "condition"`,`v-else` `:key = 'unique-variable'`(强烈建议添加)
	`v-show`在显示与隐藏藏频率较高时使用
	`v-once` 仅仅响应渲染一次 
	列表渲染:
	`v-for="(item,index) in array",:key="index"` 列表数据在数组
	注意: `v-if`与`v-for`不可一起使用,性能问题
	数组更新检测:犹豫`v-for`bind array
	变异方法: `push()`,`pop()`,`shift()`,`unshift()`,`splice()`,`sort()`,`rerverse()`这些方法是可以触发视图变化的 
	而那些返回新数组的例如:`concat()`,`slice()`,`filter()`是完全可以触发视图变化的,而且还不会丢弃已经渲染的dom
	对象变更检测: Vue 不能检测对象属性的添加或删除
	data:{
		name:'w'
	}
	data.desc = 'desc' // 新增的属性是不会被`vue`检测到的,需要使用 set()
	Vue.set(data,'desc','simple')  || this.$set(data,'desc','desc') // 这样是可以的\
	同时Object.assin()也不会被Vue检测到!!
	this.data = Object.assin({},this.data,new) // 这样会生成一个不同于origin的新对象
	数据过滤:`filter`
	data:{num:[1,2,3,4,5,6]},
	computed:{
		filterNum:()=>{
			return this.num.filter((number)=>{
				return number %2 === 0
			})
		}
	}
	
	js事件传递类型:
	事件冒泡:是由IE开发团队提出来的,即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播。
	事件捕获:是由Netscape Communicator团队提出来的,是先由最上一级的节点先接收事件,然后向下传播到具体的节点。

image

	事件处理:`v-on` 使用`@`进行替代 如果没有参数传递可以省去括号
	<div @click="onItemClick('param')"></div>
	事件修饰符: 修饰符可以串联
	`prevent` 对应`event.preventDefault()` 如果此事件没有被显式处理,此事件还是继续传播,除非碰到事件侦听器调用stopPropagation() 或stopImmediatePropagation(),才停止传播。
	
	`stop` 阻止事件向下传递,对应`event.stopPropagation()`
	<div @click.stop="onClick"></div>
	
	`once` 只会触发一次``
	<div @click.stop.once="onclick"></div>

	双向数据绑定:`v-model`
	`v-model` 适合 `input`,`cheked`及`select`标签,会忽略`value`,`selected`,`checked`的初始化属性
	
	组件:components
	导入组件: 
	>>> import { comp } from './../../components/**.vue'
	>>> export default{
	>>> 	component:{comp}
	>>> }
	
	Props:组件传值
	子组件中声明传值的类型及默认值,type支持:`String`,`Number`,`Boolean`,`Array`,`Object`,`Date`,`Function`,`Symbol`,指定`type`后会使用`instanceof`进行检查
	props:{
		name:'',
		product:{
			type:Object, // 如果指定了属性的类型,将严格按照属性执行,错误的类型是不会接收的,例如指定了`Number`而实际串字符串是不行的
			default:{
				title:'',
				id:565656
			}
		}
	}
	父组件中bind值:
	<comp name="comp`s name" :product="product"></comp>
	
	自定义事件:
	子组件使用 `this.$emit('event_name',data)` data可选
	父类组件使用`@event_name = "local"` 进行接收处理
	
	插槽:`v-slot`
	子组件中声明`slot`及`name`标识,如果没有声明`name`则`name=default`
	<div class='box'>
		<slot name="header">
			<div class='default'>default use</div>
		</slot>
	</div>
	父类组件:新版本中`v-slot`只能添加在`template`标签上
	<comp>
		<template v-slot='header'>target content</template>
	</comp>

Vuex 应用的核心就是 store(仓库)“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。

Vuex 和单纯的全局对象有以下两点不同: Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我 > 们更好地了解我们的应用。

   基本使用:
   Vue.use(Vuex);
   const store = new Vuex.store({
   	// 声明状态数据对象
   	state:{
   		logined:false,
   		user:{},
   		product:{}
   	},
   	// 提供方法快速获取state状态值
   	getters:{
   		getUserSn(state){
   			return state.user.sn
   		},
   		getUserToken:state=>{
   			return state.user.token
   		}
   	},
   	// 提供统一非方法修改状态数据,Mutation必须是同步函数
   	mutations: {
   		login(state,data){
   			state.logined = true
   			state.user = data
   		},
   		logout(state,data={}){
   			state.logined = false
   			state.user = data
   		}
   		product:(state,data)=>{
   			state.product = data
   		}
   	},
   	// 使用的异步进行调用	`mutation`commit
   	actions:{
   		tLogin(context,data){
   			setTimeout(()=>{
   				context.commit('logout',data)
   			},3000)
   		},
   		tLogout:({commit})=>{
   			setTimeout(()=>{
   				commit('logout')
   			},3000)
   		}
   	}
   })
   
   Js 文件: 要在根实例中注册`store`到应用进程里面,否则不能直接使用 `this.$store` 

   `State` 应用级状态管理对象
   操作方式一:使用`this.$store.state.***`获取指定状态变量值
   >>> let logined = this.$store.state.logined
   >>> console.log(logined)
   >>> let user = this.$store.state.user
   >>> console.log(user)
   
   操作方式二:引入Vuex module对象,使用辅助函数`mapState`,在computed中监听计算,可以绑定到组件
   >>> import { mapState } from 'vuex';
   >>> computed:{
   >>>		...mapState{['logined','user','product']} //  每当store.state的数据发生变化都会触发computed重新计算
   >>> }
   >>> console.log(this.logined,this.user,this.product)
   
   `Getter` 获取`state`的状态变量的简单方式,可以假设看做是	`state` 的属性
   操作方式一:使用 `this.$store.getters.***`
   >>>let sn = this.$store.getters.getUserSn
   >>> console.log(sn)
   
   操作方式二:在`computed`中监听状态
   >>> computed:{
   >>> 	userSn(){
   >>> 		return this.$store.getters.getUserSn
   >>>	 	}
   >>> }
   
   操作方式三:引入Vuex module对象,使用辅助函数`mapGetters`
   >>> computed:{
   >>> 	...mapGetters({userToken:'getUserToken'}) // 需要把方法映射一下
   >>> }
   >>> onShow(options){
   >>> 	let token = this.userToken
   >>> 	console.log(token)
   >>> }
   
   `Mutation`:主要作用就是对外提供修改`state`状态变量的方法,Mutation必须是同步函数
   操作方式一:使用 `this.$store.commit('function',data)` 进行提交式修改,`data`为参数选填
   >>> this.$store.commit('login',{name:'w',age:24,gender:'male'})
   >>> let user = this.$store.state.user
   >>> console.log(user)
   
   操作方式二:引入Vuex module对象,使用辅助函数`mapMutations`,`methods`引入
   >>> import { mapMutations  } from 'vuex'
   >>> methods:{
   >>> 	...mapMutations (['login','logout'])
   >>> }
   >>> onShow(options){
   >>> 	this.login({name:'w',age:23,gender:'female'})
   >>> 	console.log(this.$store.state.logined)
   >>> }
   
   注意:`mapMutations`是在`methods`中注入,而`mapState`是在`computed`中注入
    
   `Action` 类似Mutation 区别:
   	1.> Action是提交的mutation而不是直接修改state;
   	2.> 但是它是支持异步函数的; 
   	3.> 函数接受一个与`store`实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state  context.getters 来获取 state  getters。可以假设看做是`mutation`的异步形式
   
   >>> 操作方式一:使用	`this.$store.dispatch('function',data)` data可选
   >>> this.$store.dipatch('login',{name:'w',age:44})
   >>> console.log(this.$store.state.user)
   
   >>> 操作方式二: 引入Vuex module 对象,使用辅助函数	`mapActions`,`methods`中映射
   >>> import { mapActions } from `vues`
   >>> methods:{
   >>> 	...mapActions(['tLogin','tLogout'])
   >>>	}
   >>> onShow(){
   >>> 	this.tLogin({name:'x',age:44,gender:'female',token:'asdujfioadj',sn:'dfererr'})
   >>> 	setTimeout(()=>{
   >>>			console.log(this.$store.state.logined)
   >>>			this.tLogout()
   >>>			setTimeout(()=>{
   >>>				console.log(this.$store.state.logined)
   >>>			},400)
   >>> 	},4000)	
   >>> }
   
   Module 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。Vuex 允许将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块
   	

单一状态树:用一个对象就包含了全部的应用层级状态,每个应用将仅仅包含一个 store 实例

About

Mini-program `s framework...


Languages

Language:Vue 69.2%Language:JavaScript 25.9%Language:CSS 4.9%