组件优化的两三事(二):input块组件优化

组件优化的两三事(二):input块组件优化

最近在写一个动态表单的组件,可见文章 vue: 动态表单实现(单问题线)
在写该组件时,我在开始所想实现的的是每个组件达到最小块,再将块组合到表单中。但在实现时,若我把input封装成一个组件,页面实现是没有问题的,但在该组件的答案获取确实一个极大的问题。

关于子组件向父组件传值,我们最通常用的也是最先想到的就是使用$emit,但这首先有个前提是子组件有个交互事件来触发,后父组件有个地方可以存值。

我最初想到的的方法:
首先我们说的input组件是有一个至多个input组成。
我们将组件中的每个input加上change或blur事件,当出发事件时,要获取整个组件的所有input值,传递给父组件,父组件拿什么变量来存呢?就是要父组件通过prop提前告诉子组件该变量名,子组件在告诉父组件时,就需要把变量名在告诉会回给父组件

这是一个比较麻烦的流程,vue有一个方法可以稍微简化一点,就是使用v-model:
关于该方法,其实在vue教程文档中已明细讲述:自定义组件的-v-model

下面是我的个人理解与使用:
父组件:

<!-- 自定义Item -->
<component v-else :is="item.type" :key="item.label" v-model="item.ans" :rule="item"></component>

说明:父组件在使用子组件时,使用v-model绑定一个存在父组件item.ans上子组件的value,和一个input事件,这个input事件可以是change,是属于父组件的事件,子组件通过$emit调用该事件,父组件的change事件,会自动把value的值赋上去。

子组件:

<template>
	<el-form-item :label="rule.label ? rule.label: ''"">
		// 给input加上事件
		<el-select v-model="value" placeholder="请选择" @change="submitAns">
			<el-option v-for="(option, option_index) in rule.content" :key="option.label" :label="option.label" :value="option_index"></el-option>
		</el-select>
	</el-form-item>
</template>

<script>
	export default {
		// 声明model绑定的变量及方法
		model: {
			prop: 'ans',
			event: 'change'
		},
		props: {
			rule: {
				type: Object,
				required: true,
				default: null
			},
		},
		data() {
			return {
				value: null
			}
		},
		methods: {
			submitAns() {
				let index = this.value;
				let option = this.rule.content[index];
				// 调用声明好的父级change事件,带value参数
				this.$emit('change', {
					'value': option.value,
					'label': option.label,
					'finish': true,    // 用来标记该input是否每个input都有值
				});
			},
		}
	}
</script>

大概就是上述这样了,若上述理解或代码有问题,也请多多指教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章