【VUE】input输入框 WiFi-Mac地址输入组件及对应表单验证方法

34 篇文章 1 订阅
17 篇文章 0 订阅

方案一 

组件编写

<template>
	<div id="wifi">
		<div
			v-for="(item, index) in list"
			:key="index"
			:class="index !== list.length - 1 ? 'box' : 'box-last'"
		>
			<el-input
				v-model="item.value"
				ref="contentWrap"
				@input="input(item.value, index)"
				maxlength="2"
				@change="change()"
				:disabled="isDisabled"
			/>
			<span class="split" v-show="index !== list.length - 1"> : </span>
		</div>
	</div>
</template>

<script>
export default {
	name: 'wifi',
	components: {},
	props: {
		value: {
			type: String,
			default: '',
		},
		isDisabled: {
			type: Boolean,
			default: false,
		},
	},
	computed: {},
	mounted() {},
	data() {
		return {
			list: [
				{
					value: '',
				},
				{
					value: '',
				},
				{
					value: '',
				},
				{
					value: '',
				},
				{
					value: '',
				},
				{
					value: '',
				},
			],
			isDisabled: false,
		};
	},
	watch: {
		value: {
			handler(newVal) {
				this.setList();
			},
			deep: true,
			immediate: true,
		},
	},
	created() {},
	methods: {
		setList() {
			if (
				this.value === undefined ||
				this.value === null ||
				this.value === ''
			) {
				this.list = [
					{
						value: '',
					},
					{
						value: '',
					},
					{
						value: '',
					},
					{
						value: '',
					},
					{
						value: '',
					},
					{
						value: '',
					},
				];
			} else {
				const array = this.value.split(':');
				if (array.length > 0) {
					this.list = [];
					let obj = [];
					array.forEach(function (element) {
						obj.push({
							value: element.toUpperCase(),
						});
					});
					this.list = obj;
				}
			}
		},
		change() {
			let res = '';
			this.list.forEach(function (element) {
				res += element.value + ':';
			});
			if (res !== '') {
				res = res.substring(0, res.length - 1);
			}
			this.$emit('input', res);
		},
		input(value, index) {
			if (value.length === 2) {
				this.$nextTick(() => {
					index++;
					if (index < this.list.length) {
						this.$refs.contentWrap[index].focus();
					}
				});
			} else {
				this.$nextTick(() => {
					if (this.list[index].value == '') {
						this.$refs.contentWrap[index - 1].focus();
					}
				});
			}
		},
	},
};
</script>

<style lang="scss" scoped>
#wifi {
	display: flex;
	.box {
		width: calc(100% / 6);
		display: flex;
	}
	.box-last {
		width: calc((100% / 6) - 8px);
		display: flex;
	}
	.split {
		margin: auto 2px;
	}
	::v-deep .el-input__inner {
		padding: 0px 5px;
		text-align: center;
	}
}
</style>

页面内使用

<wifi
	v-model="xxx.wifimac"
	:value="xxx.wifimac"
/>

方案二

1.下载插件

npm install vue-masked-input --save

2. main.js中引用

import MaskedInput from 'vue-masked-input';

Vue.component('MaskedInput', MaskedInput);//全局挂载

3. 页面内使用

<MaskedInput
	v-model="form.WiFimac"
	mask="##:##:##:##:##:##"
	@input="WiFiOnInput"
/>

4.需要表单验证的话添加此方法

<el-form-item
	prop="authCode"
	ref="inputWiFiRef"
>
	<MaskedInput
		class="wifi form-item-box"
		v-model="form.authCode"
		mask="##:##:##:##:##:##"
		@input="WiFiOnInput"
	/>
</el-form-item>


// 触发WiFimac输入框校验
methods: {
WiFiOnInput(v) {
	this.$refs.inputWiFiRef.$emit('el.form.blur', v);
}
}

5.样式修改,全局修改样式,在app.vue里添加

.wifi {
	padding: 10px 16px;
	height: 36px;
	font-family: inherit;
	font-size: inherit;
	border-radius: 4px;
	border: 1px solid #dcdfe6;
	outline: none;
	color: #606266;
}

6.组件事件

@input 

input事件,每次输入都会触发

@blur.native.capture

失焦触发事件

表单验证方法:

							<el-form-item
								prop="wifi"
								ref="wifiRef"
							>
								<MaskedInput
									class="wifi form-item-box"
									v-model="form.wifi"
									mask="##:##:##:##:##:##"
									@input="WiFiOnInput"
								/>
							</el-form-item>

rules里面的写法

				authCode: [
					{
						required: true,
						message: '已存在', {
							field: 'WiFi',
						}),
						trigger: 'blur',
					},
					{ validator: validwifi, trigger: 'blur' },
				],

data里进行基础校验并通过后台查询是否已存在:

		const validwifi = async (rule, value, callback) => {
			if (value !== null && value !== undefined && value !== '') {
				const array = value.split(':');
				let flag = false;
				for (let i in array) {
					if (array[i] !== '' && !validNumABC(array[i])) {
						flag = true;
						break;
					}
				}
				if (flag) {
					callback(new Error('请填写完整'));
				} else {
						let param = {
							authCode: this.form.wifi,
							value: this.form.wifi,
						};
						await checkUnique(param).then((response) => {
							if (response.code === 200) {
								if (response.data === 'exist') {
									return callback(
										new Error(
											'该wifi信息已存在'
										)
									);
								} else {
									return;
								}
							}
						});
					}
			}
		};

methods里写方法:

 

		// 触发WiFi输入框校验
		WiFiOnInput(v) {
			this.$refs.wifiref.$emit('el.form.blur', v);
		},

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Vue 2.0 中,可以使用 vue-js-modal 组件来实现 messagebox 中的 input 组件和 el-input-number 组件输入数据,并且进行正则表达式验证。 首先,安装 vue-js-modal: ``` npm install vue-js-modal ``` 然后,在 main.js 中注册 vue-js-modal: ``` import VModal from 'vue-js-modal' Vue.use(VModal) ``` 接下来,在组件中使用 vue-js-modal: ``` <template> <div> <button @click="openModal">Open Modal</button> <modal name="custom-modal" height="auto" :scrollable="true" :adaptive="true" :clickToClose="false" @before-open="beforeOpen" @opened="opened"> <div class="modal-header"> <h3>Title</h3> </div> <div class="modal-body"> <el-input v-model="inputValue" placeholder="请输入内容"></el-input> <el-input-number v-model="inputNumber" :min="1" :max="10"></el-input-number> </div> <div class="modal-footer"> <button @click="closeModal">Cancel</button> <button @click="submit">Submit</button> </div> </modal> </div> </template> <script> export default { data() { return { inputValue: '', inputNumber: 0 } }, methods: { openModal() { this.$modal.show('custom-modal') }, closeModal() { this.$modal.hide('custom-modal') }, beforeOpen() { console.log('modal is about to open') }, opened() { console.log('modal is opened') }, submit() { if (this.inputValue.trim() === '') { return alert('请输入内容') } if (!/^[a-zA-Z0-9]+$/.test(this.inputValue)) { return alert('只能输入数字和字母') } this.closeModal() } } } </script> ``` 以上代码实现了 messagebox 中 ### 回答2: 在Vue 2.0中,可以通过结合使用MessageBox、Input组件和el-Input-Number组件,来实现输入数据及正则表达式验证的完整功能。 首先,在Vue实例中引入MessageBox组件,并在需要使用的方法中使用MessageBox.confirm来显示弹窗。在弹窗中,可以使用Input组件和el-Input-Number组件来接收用户输入的数据。 其次,对于输入框组件,我们可以通过v-model指令来绑定一个变量,这样就可以实时获取输入框中的值。例如,将Input组件绑定到messageText变量,将el-Input-Number组件绑定到messageNumber变量。 然后,我们可以在MessageBox的confirm方法的回调函数中获取到用户输入的数据。 最后,在回调函数中,可以使用正则表达式来对用户输入的数据进行验证。Vue中可以使用computed属性来定义一个计算属性,将正则表达式写在watch属性中,对输入的数据进行实时验证。如果验证失败,可以使用messageBox提示用户重新输入。 综上所述,通过结合使用MessageBox、Input组件和el-Input-Number组件,并结合正则表达式进行实时验证,我们可以在Vue 2.0中实现输入数据及正则表达验证的完整功能。 ### 回答3: 在Vue2.0中,同时实现MessageBox中的Input组件、ElInputNumber组件输入数据及正则表达式验证的完整功能可以通过以下步骤实现: 1. 导入相关组件和库:首先要确保已经在项目中引入了MessageBox、Input和ElInputNumber组件,并且安装了正则表达式验证的相关库,例如使用VeeValidate。 2. 创建数据绑定变量:在Vue组件中,创建一个data对象并声明需要使用的变量,比如inputValue和inputNumberValue,用于存储Input和ElInputNumber组件输入数据。 3. 配置Input组件:在MessageBox中配置Input组件,将Input组件的value属性绑定到data对象中的inputValue变量上,同时设置input事件监听器来更新inputValue的值。可以使用v-model指令来简化双向绑定的过程。 4. 配置ElInputNumber组件:在MessageBox中配置ElInputNumber组件,将ElInputNumber组件的value属性绑定到data对象中的inputNumberValue变量上,同时设置change事件监听器来更新inputNumberValue的值。同样可以使用v-model来简化绑定过程。 5. 配置正则表达式验证:使用VeeValidate或其他类似的库,在Vue组件中引入相关的验证规则和错误消息。可以在data对象中创建一个error变量用于存储验证错误信息。 6. 设置表单提交事件:在MessageBox中通过创建一个方法,当点击确定按钮时触发该方法,该方法可以进行表单的提交操作并进行正则表达式验证。 7. 在表单提交方法中进行验证:在表单提交方法中,使用相关的表达式将inputValue和inputNumberValue与正则表达式进行匹配验证,当验证失败时,将错误信息赋值给error变量,在页面中显示相应的错误提示。 通过以上步骤,就可以在Vue2.0中实现在MessageBox中同时使用Input组件、ElInputNumber组件输入数据以及进行正则表达式验证的完整功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值