# vue directive -- 案例合集

# input 默认输入数字

# 备注: 传入特定参数 可输入 中英文

import Vue from 'vue';
// 根据参数设置是否可首位为 0 , 是否可输入英文
Vue.directive('enterIntNumber', {
	inserted: function (el, binding) {
		let expression = binding.value || {};
		let trigger = (el, type) => {
			const e = document.createEvent('HTMLEvents');
			e.initEvent(type, true, true);
			el.dispatchEvent(e);
		};
		el.addEventListener('keyup', function (e) {
			let input = e.target;
			// let reg = new RegExp("^\\d{1}\\d*$"); //正则验证是否是数字
			let reg = /^([0-9])+$/; //正则验证是否是数字
			let correctReg = /^([0-9])*/; //正则获取是数字的部分
			if (expression.en) {
				//支持字母
				reg = /^[A-Za-z0-9]+$/;
				correctReg = /^[A-Za-z0-9]*/;
			}
			let matchRes = input.value.match(reg);
			if (matchRes === null) {
				//若不是纯数字 把纯数字部分用正则获取出来替换掉
				let correctMatchRes = input.value.match(correctReg);
				if (correctMatchRes) {
					input.value = correctMatchRes[0];
				} else {
					if (!expression.zero) {
						input.value = '';
					}
				}
			} else if (matchRes[0] == 0) {
				if (!expression.zero) {
					input.value = '';
				}
			}
			trigger(input, 'input');
		});
	},
});
// === template
// 允许输入中英文 // zero中文   en英文
<el-input v-model="params.v_no" v-enterIntNumber:map="{ zero: true, en: true }" placeholder="请输入会员编号(数字或字母)"></el-input>;
// 或  禁止中文输入
<el-input v-model="params.v_no" v-enterIntNumber placeholder="请输入数字"></el-input>;
// 或  数字输入框  禁止输入
<el-input-number v-model="params.v_no" :min="0" :max="999" size="small" v-enterIntNumber ></el-input-number>

# input 只能输入数字

import Vue from 'vue';
Vue.directive('enterNumberPoint2', {
	componentUpdated: function (el, binding) {
		let expression = binding.value || {};
		let trigger = (el, type) => {
			const e = document.createEvent('HTMLEvents');
			e.initEvent(type, true, true);
			el.dispatchEvent(e);
		};

		el.addEventListener('keyup', function (e) {
			let input = e.target;
			let num = isNaN(expression.num) ? 2 : expression.num;
			let reg = new RegExp(`^((?:(?:[1-9]{1}\\d*)|(?:[0]{1}))(?:\\.(?:\\d){0,${num}})?)(?:\\d*)?$`); //正则验证是否是数字(小数整数均可)
			let matchRes = input.value.match(reg);
			if (matchRes === null) {
				input.value = '';
			} else {
				//matchRes[0]是匹配的无限位的小数
				if (matchRes[1] !== matchRes[0]) {
					input.value = matchRes[1];
				}
			}
			trigger(input, 'input');
		});
	},
});
// === template
<el-input v-model="params.v_no" v-enterNumberPoint2 placeholder="请输入数字"></el-input>;

# 表格高度自适应

# 备注: 控制好底部距离

import Vue from 'vue';
/**
 *
 * @param {*} el
 * @param {*} binding
 * binding.value 格式为 {
 *      table: $refs.table, //  表格对象
 *      topHeight: 140      //  表格顶边 距离顶部高度,默认值为  140
 *      footerHeight: 120   //  表格底部 距离底部高度,默认值为  120
 * }
 * @param {*} vnode
 * @param {*} oldVnode
 */
Vue.directive('table-height-adaptive', {
	update(el, binding) {
		let topHeight = binding.value.topHeight ? binding.value.topHeight : 0;
		let footerHeight = binding.value.footerHeight ? binding.value.footerHeight : 0;
		let minHeight = binding.value.minHeight ? binding.value.minHeight : 400;
		let isMyTable = binding.value.isMyTable;
		let table = binding.value.table;
		if (isMyTable) {
			const index = table.$children.length - 1;
			table = table.$children[index];
		}
		const px32 = 96; //表格外层加入了padding上下16px;
		let tableHeight = window.innerHeight - el.offsetTop - footerHeight - topHeight - px32;
		let finalHeight = tableHeight > minHeight ? tableHeight : minHeight;
		table.layout && table.layout.setHeight(finalHeight);
		table.doLayout && table.doLayout();

		// 监听窗口大小变化
		window.addEventListener('resize', () => {
			tableHeight = window.innerHeight - el.offsetTop - footerHeight - topHeight - px32;
			let finalHeight = tableHeight > minHeight ? tableHeight : minHeight;
			table.layout && table.layout.setHeight(finalHeight);
			table.doLayout && table.doLayout();
		});
	},
});
// === template
<el-table :data="list" ref="multipleTable" stripe height="450" v-table-height-adaptive="{ table: $refs.multipleTable, footerHeight: 68, topHeight: 0 }" > </el-table>
// 备注:  若是 底部没有 el-pagination   表格上部没有 自定义行内容,  只有一个显示的表格   设置 footerHeight: 0, topHeight: 0

# 颜色区别化: 数值 >0 或 <0

/**
 *
 * @param {*} el
 * @param {*} binding
 * binding.value 格式为 {
 *      value: Number, //  要判断的值
 *      positive: true/false  //  >0 的数是否要有颜色
 * }
 * @param {*} vnode
 * @param {*} oldVnode
 */
Vue.directive('colors', (el, binding) => {
	let value = binding.value.value;
	if (!Number(value) && value != 0) return;
	if (!value) return;
	if (+value <= 0) el.style.color = '#ff5151';
	else {
		if (!binding.value.positive) el.style.color = '#34c635';
	}
});
// === template
// > 0  但无颜色
<div class="col f1" v-colors="{ value: 1 }">&yen; 1</div>
// 或 > 0  有颜色
<div class="col f1" v-colors="{ value: 1, positive:true }">&yen; 1</div>
// 或 < 0 
<div class="col f1" v-colors="{ value: -1 }">&yen; -1</div>
上次更新: 1/13/2022, 10:37:58 AM