我是靠谱客的博主 要减肥大米,最近开发中收集的这篇文章主要介绍Vue2在实际项目中的应用——公共组件介绍,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这个公共的库在项目中是通过dependencies引入进来的:

"dependencies": {
    。。。
    "frontend-library": "git+https://git.com/Frontend/library.git",
    。。。
  },

在开发的时候可以换成file协议,这样方便调试。

在ci中,依赖的库不是每次都用npm install/update来处理,因为这样非常耗时间。所以会提前把依赖的库打到一个docker中去,那么这样就会有一个问题,一旦更新了library库,就需要更新这个docker镜像,这样不是很合理。所以我们的处理方式就是,在build之前,先会checkout下来library项目,然后执行以下两条命令,进行手工同步最新代码。

rm -rf node_modules/frontend-library/*
mv library/* node_modules/frontend-library

下面简单介绍库中的几个组件,基于element-ui:

  • 三种状态的checkbox

初始是ignore状态,然后选中,然后取消选中。每次点击在这三种状态循环

<template>
	<el-row class="tri-state-checkbox clearfix">
		<el-col :span="4"><span class="title">{{item.name}}</span></el-col>
		<el-col :span="20" role="checkboxgroup" :class="'el-checkbox-group checkbox-group-' + item.key" v-if="item.options">
			<label role="checkbox" tabindex="-1" :class="['multi-checkbox el-checkbox-button is-ignored']" v-for="option in item.options" :key="option.key">
				<input type="checkbox" tabindex="-1" 
					@click="select" 
					:name="'option' + option.key" 
					class="el-checkbox-button__original" 
					:value="option.key">
				<span class="el-checkbox-button__inner">{{option.name}}</span>
			</label>
		</el-col>
	</el-row>
			
</template>

<script>
import $ from 'jquery';
/**
	* TriStateCheckbox组件,三种状态多选组件
	* @module TriStateCheckbox
	* @fires change
	* @example
	* 具体使用参考{@tutorial 其它组件介绍}
*/
const STATE = ['is-ignored', 'is-checked', 'is-unchecked'],
	STATE_VALUE = {'is-ignored': null, 'is-checked': true, 'is-unchecked': false};
export default {
	name: 'TriStateCheckbox',
	/**
   		* Props 接受父组件的传值
   		* @property {object} item 必填,需要展示的选项
   		* @property {string} item.name 多选的label
   		* @property {object} item.key 多选的key
   		* @property {array} item.options 多选选项[{key:,name:},{key:,name:}]
   	*/
	props: {
		item: Object
	},
	data () {
		return {
			
		};
	},
	methods: {
		select (evt) {
			let curTarget = evt.currentTarget,
				classes = $(curTarget).closest('.el-checkbox-button').attr('class').split(/s+/),
				state = classes.filter(clazz => clazz.startsWith('is-'))[0],
				nextState = (STATE.indexOf(state) + 1) % 3;

			$(curTarget).closest('.el-checkbox-button').removeClass(state).addClass(STATE[nextState]);
			this.$emit('change');
		},

		/**
	   		* 获取结果方法,父组件可以通过定义ref,调用此组件的result方法
	   		* @method result
	   		* @returns {object} item
	   		* @example
	   		* //此方法会把传入的item返回,并且会在options里面的每个选项添加checked属性
	   		* //true:选中,false:未选中,null:没有选择
	   	*/		
		result () {
			this.item.options && this.item.options.forEach((opt) => {
				let classes = $('.checkbox-group-' + this.item.key + ' input[value=' + opt.key + ']').closest('.el-checkbox-button').attr('class').split(/s+/),
					state = classes.filter(clazz => clazz.startsWith('is-'))[0];
				opt.checked = STATE_VALUE[state];
			});
			return this.item;
		}
	},
	mounted () {
		
	}
};
</script>
  • 可取消的单选
<template>
	<el-row class="unchecked-radio clearfix">
		<el-col :span="4"><span class="title">{{item.name}}</span></el-col>
		<el-col :span="20" role="radiogroup" :class="'el-radio-group radio-group-' + item.key" v-if="item.options">
			<label role="radio" tabindex="-1" :class="['el-radio-button']" v-for="option in itemOptions" :key="option.value">
				<input type="radio" tabindex="-1" 
					@click="select" 
					:name="'option' + item.key" 
					class="el-radio-button__orig-radio" 
					:value="option.value">
				<span class="el-radio-button__inner">{{option.name}}</span>
			</label>
		</el-col>
	</el-row>
			
</template>

<script>
import $ from 'jquery';
/**
	* UncheckedRadio组件,可取消单选组件
	* @module UncheckedRadio
	* @fires change
	* @example
	* 具体使用参考{@tutorial 其它组件介绍}
*/
export default {
	name: 'UncheckedRadio',
	/**
   		* Props 接受父组件的传值
   		* @property {object} item 必填,需要展示的选项
   		* @property {string} item.name 多选的label
   		* @property {object} item.key 多选的key
   		* @property {array} item.options 多选选项[{value:,name:},{value:,name:}]
   	*/
	props: {
		item: Object
	},
	data () {
		return {
			lastCheckedOption: null
		};
	},
	computed: {
		itemOptions () {
			return this.item.options.filter(i => i.value && i.name);
		}
	},
	methods: {
		select (evt) {
			if (this.lastCheckedOption === evt.currentTarget && $(evt.currentTarget).closest('.el-radio-button').hasClass('is-active')) {
				$(evt.currentTarget).closest('.el-radio-button').removeClass('is-active');
				$(evt.currentTarget).prop('checked', false);
			} else {
				$(this.lastCheckedOption).prop('checked', false);
				$(evt.currentTarget).prop('checked', true).closest('.el-radio-button').addClass('is-active');
			}
			this.lastCheckedOption = evt.currentTarget;

			this.$emit('change');
		},

		/**
	   		* 获取结果方法,父组件可以通过定义ref,调用此组件的result方法
	   		* @method result
	   		* @returns {object} item
	   		* @example
	   		* //此方法会把传入的item返回,并且会在options里面的每个选项添加checked属性
	   		* //true:选中,false:未选中
	   	*/	
		result () {
			this.item.options && this.item.options.forEach((opt) => {
				opt.checked = $('.radio-group-' + this.item.key + ' input[value=' + opt.value + ']').prop('checked');
			});
			return this.item;
		}
	},
	mounted () {
	}
};
</script>
  • 使dialog可拖拽移动的指令
let DialogDraggerDirective = {
	name: 'DialogDragger',
	bind: function (el, binding, vnode) {

		let dlg = el.getElementsByClassName('el-dialog')[0],
			title = el.getElementsByClassName('job-title')[0];

		title.style.cursor = 'default';

		dlg.offsetX = 0;
		dlg.offsetY = 0;

		let move = function (e) {
			dlg.style.marginLeft = '0px';
			dlg.style.marginTop = '0px';
			dlg.style.left = (e.pageX - dlg.offsetX) + 'px';
			dlg.style.top = (e.pageY - dlg.offsetY) + 'px';
		};

		let up = function () {
			removeEventListener('mousemove', move);
			removeEventListener('mouseup', up);
		};

		let down = function (e) {
			dlg.offsetX = (e.pageX - dlg.offsetLeft);
			dlg.offsetY = (e.pageY - dlg.offsetTop);

			addEventListener('mousemove', move);
			addEventListener('mouseup', up);
		};

		let header = el.getElementsByClassName('el-dialog__header')[0];
		header.addEventListener('mousedown', down);
		header.style.cursor = 'move';
	}
};
  • 使textarea可以输入tab键的指令
//代码来自互联网,进行了封装
let TabKeyEnablerDirective = {
	name: 'TabKeyEnabler',
	bind: function (el, binding, vnode) {
		const input = $(el).find('textarea').get(0);
		if (input) {
			input.onkeydown = function (e) {
				if (e.keyCode === 9) { // tab was pressed

					// get caret position/selection
					var val = this.value,
						start = this.selectionStart,
						end = this.selectionEnd;

					// set textarea value to: text before caret + tab + text after caret
					this.value = val.substring(0, start) + 't' + val.substring(end);

					// put caret at right position again
					this.selectionStart = this.selectionEnd = start + 1;

					// prevent the focus lose
					return false;

				}
			};
		}
	}
};

 

封装的表格控件功能比较多,需要单独写篇文章

最后

以上就是要减肥大米为你收集整理的Vue2在实际项目中的应用——公共组件介绍的全部内容,希望文章能够帮你解决Vue2在实际项目中的应用——公共组件介绍所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部