这是一个神奇的文章,打开以后你才知道

总记

1.小程序的的表单验证

1.1表单选项

1.1.1编译xml文件
<form catchsubmit="bindFormSubmit">
	<input name="">  //添加name
	//按钮去控制
    <button formType="submit" class="but">确认			</button>
</form>
1.1.2创建表单验证文件

/**
 * 表单验证
 *
 * @param {Object} rules 验证字段的规则
 * @param {Object} messages 验证字段的提示信息
 *
 */
class WxValidate {
	constructor(rules = {}, messages = {}) {
		Object.assign(this, {
			data: {},
			rules,
			messages,
		})
		this.__init()
	}

	/**
	 * __init
	 */
	__init() {
		this.__initMethods()
		this.__initDefaults()
		this.__initData()
	}

	/**
	 * 初始化数据
	 */
	__initData() {
		this.form = {}
		this.errorList = []
	}

	/**
	 * 初始化默认提示信息
	 */
	__initDefaults() {
		this.defaults = {
			messages: {
				required: '这是必填字段。',
				email: '请输入有效的电子邮件地址。',
				tel: '请输入11位的手机号码。',
				url: '请输入有效的网址。',
				date: '请输入有效的日期。',
				dateISO: '请输入有效的日期(ISO),例如:2009-06-23,1998/01/22。',
				number: '请输入有效的数字。',
				digits: '只能输入数字。',
				idcard: '请输入18位的有效身份证。',
				equalTo: this.formatTpl('输入值必须和 {0} 相同。'),
				contains: this.formatTpl('输入值必须包含 {0}。'),
				minlength: this.formatTpl('最少要输入 {0} 个字符。'),
				maxlength: this.formatTpl('最多可以输入 {0} 个字符。'),
				rangelength: this.formatTpl('请输入长度在 {0} 到 {1} 之间的字符。'),
				min: this.formatTpl('请输入不小于 {0} 的数值。'),
				max: this.formatTpl('请输入不大于 {0} 的数值。'),
				range: this.formatTpl('请输入范围在 {0} 到 {1} 之间的数值。'),
			},
		}
	}

	/**
	 * 初始化默认验证方法
	 */
	__initMethods() {
		const that = this
		that.methods = {
			/**
			 * 验证必填元素
			 */
			required(value, param) {
				if (!that.depend(param)) {
					return 'dependency-mismatch'
				} else if (typeof value === 'number') {
					value = value.toString()
				} else if (typeof value === 'boolean') {
					return !0
				}

				return value.length > 0
			},
			/**
			 * 验证电子邮箱格式
			 */
			email(value) {
				return (
					that.optional(value) ||
					/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(
						value
					)
				)
			},
			/**
			 * 验证手机格式
			 */
			tel(value) {
				return that.optional(value) || /^1[35789]\d{9}$/.test(value)
			},
			/**
			 * 验证URL格式
			 */
			url(value) {
				return (
					that.optional(value) ||
					/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(
						value
					)
				)
			},
			/**
			 * 验证日期格式
			 */
			date(value) {
				return (
					that.optional(value) ||
					!/Invalid|NaN/.test(new Date(value).toString())
				)
			},
			/**
			 * 验证ISO类型的日期格式
			 */
			dateISO(value) {
				return (
					that.optional(value) ||
					/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(
						value
					)
				)
			},
			/**
			 * 验证十进制数字
			 */
			number(value) {
				return (
					that.optional(value) ||
					/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value)
				)
			},
			/**
			 * 验证整数
			 */
			digits(value) {
				return that.optional(value) || /^\d+$/.test(value)
			},
			/**
			 * 验证身份证号码
			 */
			idcard(value) {
				return (
					that.optional(value) ||
					/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
						value
					)
				)
			},
			/**
			 * 验证两个输入框的内容是否相同
			 */
			equalTo(value, param) {
				return that.optional(value) || value === that.data[param]
			},
			/**
			 * 验证是否包含某个值
			 */
			contains(value, param) {
				return that.optional(value) || value.indexOf(param) >= 0
			},
			/**
			 * 验证最小长度
			 */
			minlength(value, param) {
				return that.optional(value) || value.length >= param
			},
			/**
			 * 验证最大长度
			 */
			maxlength(value, param) {
				return that.optional(value) || value.length <= param
			},
			/**
			 * 验证一个长度范围[min, max]
			 */
			rangelength(value, param) {
				return (
					that.optional(value) ||
					(value.length >= param[0] && value.length <= param[1])
				)
			},
			/**
			 * 验证最小值
			 */
			min(value, param) {
				return that.optional(value) || value >= param
			},
			/**
			 * 验证最大值
			 */
			max(value, param) {
				return that.optional(value) || value <= param
			},
			/**
			 * 验证一个值范围[min, max]
			 */
			range(value, param) {
				return that.optional(value) || (value >= param[0] && value <= param[1])
			},
		}
	}

	/**
	 * 添加自定义验证方法
	 * @param {String} name 方法名
	 * @param {Function} method 函数体,接收两个参数(value, param),value表示元素的值,param表示参数
	 * @param {String} message 提示信息
	 */
	addMethod(name, method, message) {
		this.methods[name] = method
		this.defaults.messages[name] =
			message !== undefined ? message : this.defaults.messages[name]
	}

	/**
	 * 判断验证方法是否存在
	 */
	isValidMethod(value) {
		let methods = []
		for (let method in this.methods) {
			if (method && typeof this.methods[method] === 'function') {
				methods.push(method)
			}
		}
		return methods.indexOf(value) !== -1
	}

	/**
	 * 格式化提示信息模板
	 */
	formatTpl(source, params) {
		const that = this
		if (arguments.length === 1) {
			return function () {
				let args = Array.from(arguments)
				args.unshift(source)
				return that.formatTpl.apply(this, args)
			}
		}
		if (params === undefined) {
			return source
		}
		if (arguments.length > 2 && params.constructor !== Array) {
			params = Array.from(arguments).slice(1)
		}
		if (params.constructor !== Array) {
			params = [params]
		}
		params.forEach(function (n, i) {
			source = source.replace(new RegExp('\\{' + i + '\\}', 'g'), function () {
				return n
			})
		})
		return source
	}

	/**
	 * 判断规则依赖是否存在
	 */
	depend(param) {
		switch (typeof param) {
			case 'boolean':
				param = param
				break
			case 'string':
				param = !!param.length
				break
			case 'function':
				param = param()
			default:
				param = !0
		}
		return param
	}

	/**
	 * 判断输入值是否为空
	 */
	optional(value) {
		return !this.methods.required(value) && 'dependency-mismatch'
	}

	/**
	 * 获取自定义字段的提示信息
	 * @param {String} param 字段名
	 * @param {Object} rule 规则
	 */
	customMessage(param, rule) {
		const params = this.messages[param]
		const isObject = typeof params === 'object'
		if (params && isObject) return params[rule.method]
	}

	/**
	 * 获取某个指定字段的提示信息
	 * @param {String} param 字段名
	 * @param {Object} rule 规则
	 */
	defaultMessage(param, rule) {
		let message =
			this.customMessage(param, rule) || this.defaults.messages[rule.method]
		let type = typeof message

		if (type === 'undefined') {
			message = `Warning: No message defined for ${rule.method}.`
		} else if (type === 'function') {
			message = message.call(this, rule.parameters)
		}

		return message
	}

	/**
	 * 缓存错误信息
	 * @param {String} param 字段名
	 * @param {Object} rule 规则
	 * @param {String} value 元素的值
	 */
	formatTplAndAdd(param, rule, value) {
		let msg = this.defaultMessage(param, rule)

		this.errorList.push({
			param: param,
			msg: msg,
			value: value,
		})
	}

	/**
	 * 验证某个指定字段的规则
	 * @param {String} param 字段名
	 * @param {Object} rules 规则
	 * @param {Object} data 需要验证的数据对象
	 */
	checkParam(param, rules, data) {
		// 缓存数据对象
		this.data = data

		// 缓存字段对应的值
		const value =
			data[param] !== null && data[param] !== undefined ? data[param] : ''

		// 遍历某个指定字段的所有规则,依次验证规则,否则缓存错误信息
		for (let method in rules) {
			// 判断验证方法是否存在
			if (this.isValidMethod(method)) {
				// 缓存规则的属性及值
				const rule = {
					method: method,
					parameters: rules[method],
				}

				// 调用验证方法
				const result = this.methods[method](value, rule.parameters)

				// 若result返回值为dependency-mismatch,则说明该字段的值为空或非必填字段
				if (result === 'dependency-mismatch') {
					continue
				}

				this.setValue(param, method, result, value)

				// 判断是否通过验证,否则缓存错误信息,跳出循环
				if (!result) {
					this.formatTplAndAdd(param, rule, value)
					break
				}
			}
		}
	}

	/**
	 * 设置字段的默认验证值
	 * @param {String} param 字段名
	 */
	setView(param) {
		this.form[param] = {
			$name: param,
			$valid: true,
			$invalid: false,
			$error: {},
			$success: {},
			$viewValue: ``,
		}
	}

	/**
	 * 设置字段的验证值
	 * @param {String} param 字段名
	 * @param {String} method 字段的方法
	 * @param {Boolean} result 是否通过验证
	 * @param {String} value 字段的值
	 */
	setValue(param, method, result, value) {
		const params = this.form[param]
		params.$valid = result
		params.$invalid = !result
		params.$error[method] = !result
		params.$success[method] = result
		params.$viewValue = value
	}

	/**
	 * 验证所有字段的规则,返回验证是否通过
	 * @param {Object} data 需要验证数据对象
	 */
	checkForm(data) {
		this.__initData()

		for (let param in this.rules) {
			this.setView(param)
			this.checkParam(param, this.rules[param], data)
		}

		return this.valid()
	}

	/**
	 * 返回验证是否通过
	 */
	valid() {
		return this.size() === 0
	}

	/**
	 * 返回错误信息的个数
	 */
	size() {
		return this.errorList.length
	}

	/**
	 * 返回所有错误信息
	 */
	validationErrors() {
		return this.errorList
	}
}

export default WxValidate

1.1.3页面js引入验证表单的文件
import init from '...'
在程序加载的时候引入组件
onload(){
	this.initform()  //添加验证规则
}
	// 验证规则
initValidate() {
  // 添加字段的验证规则
  const rules = {
  //约束的字段
  	Author: {
  		required: true,
  	},
  	reson: {
  		required: true,
  	}
  
  }
 //约束触发的效果
  const messages = {
  	Author: {
  		required: '请输入真实姓名',
  	},
  	reson: {
  		required: '请输入审核原因、否则无法通过审核',
  	},
  }
  // 创建实例对象
 this.init = new init(rules, messages)
},
表单事件
bindFormSubmit: function (e) {
	const params = e.detail.value
	// 传入表单数据,调用验证方法
	if (!this.init.checkForm(params)) {
		const error = this.init.errorList[0]
		this.showModal(error)   //创建错误的提示方法
		return false
	}
	this.send(params)
},
	//错误提示
	showModal(error) {
		wx.showModal({
			content: error.msg,
			showCancel: false,
		})
	},
	

2.时间的格式化

2.1补零时间函数
getTime(){
	let data = new Date()
		let y = data.getFullYear()
		let m = data.getMonth() + 1
		let d = data.getDate()
		if(m<10){
			m = '0' + "m"
		}
		if(d<10){
			d = "0" + "d"
		}
		let result = y + '-' + m + '-' + d
		let result = y + '年' + m + '月' + d + '日'
}
如果时间是一个字符串的情况

2020-07-08 17:23:900 – 直接用slice(0,10)截取前十位即可

3.小程序回滚到顶部

	getTop() {
		if (wx.pageScrollTo) {
			wx.pageScrollTo({
				scrollTop: 0,   //创建变量
			})
		} else {
			wx.showModal({
				title: '提示',
				content:'当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。',
			})
		}
	},

4.小程序版本自动更新

 autoUpdate: function() {
    var that = this
    // 获取小程序更新机制兼容
    if (wx.canIUse('getUpdateManager')) {
      const updateManager = wx.getUpdateManager()
      //1. 检查小程序是否有新版本发布
      updateManager.onCheckForUpdate(function(res) {
        //console.log(res)
        // 请求完新版本信息的回调
        if (res.hasUpdate) {
          //检测到新版本,需要更新,给出提示
          wx.showModal({
            title: '更新提示',
            content: '检测到新版本,是否重启小程序?',
            success: function(res) {
              if (res.confirm) {
                //2. 用户确定下载更新小程序,小程序下载及更新静默进行
                that.downLoadAndUpdate(updateManager)
              } else if (res.cancel) {
                //用户点击取消按钮的处理,如果需要强制更新,则给出二次弹窗,如果不需要,则这里的代码都可以删掉了
                wx.showModal({
                  title: '温馨提示~',
                  content: '本次版本更新涉及到新的功能添加,旧版本无法正常访问的哦~',
                  showCancel:false,//隐藏取消按钮
                  confirmText:"确定更新",//只保留确定更新按钮
                  success: function(res) {
                    if (res.confirm) {
                      //下载新版本,并重新应用
                      that.downLoadAndUpdate(updateManager)
                    }
                  }
                })
              }
            }
          })
        }
      })
    } else {
      // 如果希望用户在最新版本的客户端上体验您的小程序
      wx.showModal({
        title: '提示',
        content: '当前微信版本过低,无法自动更新,请升级到最新版微信。'
      })
    }
  },
  /**
   * 下载小程序新版本并重启应用
   */
  downLoadAndUpdate: function (updateManager){
    var that=this
    wx.showLoading();
    //下载更新小程序新版本
    updateManager.onUpdateReady(function () {
      wx.hideLoading()
      //最新的版本已经下载好,调用 applyUpdate 应用新版本并重启
      updateManager.applyUpdate()
    })
    updateManager.onUpdateFailed(function () {
      // 新的版本下载失败
      wx.showModal({
        title: '已经有新版本了~',
        content: '新版本已上线,请您删除当前小程序,重新搜索打开~',
      })
    })
  },

5.异步 promsie的问题

5.1promise的形式

let p = new Promise(( resolve ,reject)=>{	

​	 resolve ( value)   //成功状态的返回

​	reject( reason )  //失败状态的返回 

​	每次只返回一个状态值

})

p.then(

​	value =>{

​		调用成功之后返回的值

​	}

​	reason =>{

​	错误

​	}

)

5.2 小程序封装的promise 合并post get

var host = "...."
var token = '....'

export default function (url,data.method="get"){
	wx.showLoading({
		title:"加载中"
	})
	return new Promise((reslove,reject)=>{
		wx.request({
			url:host +url,
			data,
			method,
			header{
	//默认	   'Content-Type':'application/x-www-form-urlencoded;charset=UTF-8'
				authorization: 'Bearer ' + token ,
			},
			success(res){
				wx.hideLoading()
				reslove(res)
			},
			fail(err){
				wx.hideLoading()
				reject(err)
			}
			
		})
	})
}

5.2.1 使用promise

import request from '...'

async fn (){
	try(
		await request('',{})
	).catch(
		提示错误信息
	)
}

5.3 小程序封装promise 方法拆开

post请求
function POST(url, params) {
	wx.showLoading({
		title: '加载中',
		mask: true,
	})
	let promise = new Promis(function (resolve, reject) {
		wx.request({
			url: 'url',
			data: params,
			header: {
				'Content-Type': 'application/x-www-form-urlencoded',
			},
			method: 'POST',
			success: (res) => {
				resolve(res)
			},
			fail: (res) => {
				reject(res)
			},
			complete: () => {
				wx.hideLoading()
			},
		})
	})
	return promise
}
get 请求
function GET(url, params) {
	let promise = new Promise(function (resolve, reject) {
		wx.request({
			url: '',
			data: params,
			method: 'GET',
			header: {},
			success: (res) => {
				resolve(res)
			},
			fail: (res) => {
				reject(res)
			},
		})
	})
	return promise
}

module.exports = {
	post: POST,
	get: GET,
}

const request = require('..../promise')

request
	.post('地址', '参数')
	.then((result) => {})
	.catch((err) => {})
request
	.get('地址', '参数')
	.then((result) => {})
	.catch((err) => {})

6. axios 配置

axios拦截器

// 创建实例时配置默认值
const request = axios.create({
  baseURL: 'https://api.example.com'
});
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });

7. vue导出表格的一种处理

https://xuliangzhan_admin.gitee.io/vxe-table/#/table/start/install

8. 小程序富文本

8.1 页面写入

<editor id="editor" class="editor ql-container" placeholder="{{placeholder}}" bindblur="getEditorValue"
				bindstatuschange="onStatusChange" bindready="onEditorReady">
			</editor>

8.2 js配置 渲染完成

 async onEditorReady() {
    const that = this
    wx.createSelectorQuery()
      .select('#editor')
      .context(function (res) {
        that.editorCtx = res.context
        wx.showLoading({
          title: '加载内容中...',
        })
        setTimeout(function () {
          let data = that.data
          wx.hideLoading()
          that.editorCtx.setContents({
            html: data.pageData
              ? data.pageData.content
              : `
              <p>评价模板</p>
              <p>评价模板</p>
              <p>评价模板</p>
                `,
            success: (res) => {
              console.log(res)
            },
            fail: (res) => {
              console.log(res)
            },
          })
        }, 1000)
      })
      .exec()
  },

8.3 失去焦点获取事件

 getEditorValue(e) {
    console.log(e.detail.html)
  },

9.pc建立富文本

9.1初始化 下载引入

下载   vue2-editor
引入   
	import { VueEditor } from 'vue2-editor'
	export default {
	components: { VueEditor },
	data: () => ({
		content: ``,
	})
	监听输入的改变
	watch:{
        content(value) {
        	this.$emit('changed', value)
		},
	 }
	 

9.2建立

	<vue-editor v-model="content" :editor-toolbar="customToolbar" />

10.

pc上传图片


11.小程序上传图片

可选择视频和照片

// 选择文件
  changeFile() {
    let that = this
    wx.chooseMedia({
      count: 9,
      mediaType: ['image', 'video'],
      sourceType: ['album', 'camera'],
      maxDuration: 30,
      camera: 'back',
      success(res) {
        wx.showLoading({
          title: '资源加载中',
        })
        const arr = res.tempFiles   //临死路径列表
        let a = arr.length
        if (arr[0].thumbTempFilePath) {
          that.setData({
          //临时路径视频的封面图
            temimg: arr[0].thumbTempFilePath,
          })
        }
        //选中多个文件时重复调用函数
        for (let i = 0; i < a; i++) {
          that.upImgs(arr[i].tempFilePath, res.type, that.data.temimg)
        }
      },
      fail(err) {
        wx.showToast({
          title: '图片或视频过大',
          icon: 'error',
          duration: 1000,
        })
      },
    })
  },

  //上传服务器
  upImgs: function (imgurl, type, tem) {
    var that = this
    wx.uploadFile({
      url: 'https://......./api/Common/upload',    //提交地址
      filePath: imgurl,
      name: 'file',
      header: {},
      success: function (res) {
        var data = JSON.parse(res.data)
        let arr = that.data.imgs
        arr.push({ url: data.data.url, type: type, temimg: tem })
        // 显示与隐藏
        if (arr.length < 10) {
          that.setData({
            imgs: arr,
            seenAdd: true,
          })
        } else {
          wx.showToast({
            title: '亲可以了哟',
            icon: 'error',
            duration: 2000,
          })
          this.setData({
            seenAdd: false,
          })
        }
        wx.hideLoading({})
      },
      fail: (err) => {
        console.log(err)
      },
    })
  },

12.$set(arr,index,value)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BkIybSOZ-1633587349282)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1633586204265.png)]

13.nextTick

在视图渲染完成后执行 vue采用的是异步更新的策略,通俗点说就是,同一事件循环内多次修改,会统一进行一次视图更新,这样才能节省性能嘛 会造成更显缓慢的

this.$nextTick(() => {
    console.log(this.$refs.testDiv.innerHTML) // 林三心
})

name = 小林  this.name = 小狗  console.log(name)  为"小林"

14ssr 服务端渲染

SSR首次加载更快,有更好的用户体验,有更好的seo优化,因为爬虫能看到整个页面的内容,

SON.parse(res.data)
let arr = that.data.imgs
arr.push({ url: data.data.url, type: type, temimg: tem })
// 显示与隐藏
if (arr.length < 10) {
that.setData({
imgs: arr,
seenAdd: true,
})
} else {
wx.showToast({
title: ‘亲可以了哟’,
icon: ‘error’,
duration: 2000,
})
this.setData({
seenAdd: false,
})
}
wx.hideLoading({})
},
fail: (err) => {
console.log(err)
},
})
},




## 12.$set(arr,index,value) 

[外链图片转存中...(img-BkIybSOZ-1633587349282)]

## 13.nextTick

在视图渲染完成后执行   vue采用的是`异步更新`的策略,通俗点说就是,`同一事件循环内`多次修改,会`统一`进行一次`视图更新`,这样才能节省性能嘛  会造成更显缓慢的

this.KaTeX parse error: Expected '}', got 'EOF' at end of input: …nsole.log(this.refs.testDiv.innerHTML) // 林三心
})

name = 小林 this.name = 小狗 console.log(name) 为"小林"


## 14ssr 服务端渲染

 `SSR`首次加载更快,有更好的用户体验,有更好的seo优化,因为爬虫能看到整个页面的内容, 

## 15.vue自定义指令  https://www.cnblogs.com/lzq035/p/14183553.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值