Element-ui之radio封装

对el-radio和el-radio-group进行二次封装,以便使用。

分两步:创建、引用。

说明 :
1. 可选项一般是请求数据字典的值以供勾选,假设数据字典的接口为’/getDictionary’,请求参数为code,数据字典中的展示值字段为’label’,选中所传值字段为’value’。
2. 也有特定接口请求可选项的,需要指定特定的请求接口url、参数和展示的value和label值。
3. 各个属性灵活运用,也可自己添加、更改相关属性配置。
4. 这里设置从父组件中传输过来的对象和数组都用JSON串接收,目的是为了方便监听数值变化。
5. 代码为手写,已检查,但不保证没有单词写错,如报错,请检查一下单词的拼写。

一、创建公共组件vue文件 — comRadio.vue:
<template>
	<el-radio-group 
		v-model="radioValue" 
		:disabled="disabled" 
		@change="change">
		<el-radio
			v-for="item in optionLists"
			:key="optionKey ? item[optionKey.value] : item.value"
			:label="optionKey ? item[optionKey.value] : item.value"
			:disabled="item.disabled ? item.disabled : false">
			<span v-if="showLabel.length > 0" class="labelAll">
				<span v-for="itemIndex in showLabel" :key="itemIndex+''">{{ item[itemIndex] }}</span>
			</span>
			<span v-else>{{ optionKey ? item[optionKey.label] : item.label }}</span>
		</el-radio>
	</el-radio-group>
</template>
<script>
	export default {
		name: 'ComRadio',
		props: {
			value: String,
			options: String, // radio选项列表JSON串,如此项有值,则直接用此选项中的数据,不会进行数据请求去获取数据。即优先级options>url。默认为空,非必传。
			url: { // 请求选择项URL地址,默认数据字典请求接口地址,非必传。
				type: String,
				default: '/getDictionary',
			},
			urlCode: String, // 请求数据字典时的参数值,若url为数据字典请求地址,则必传,其余情况非必传。
			urlParams: String, // 接口其余请求参数的JSON串,非必传。
			disabled: { // 是否禁用,默认false,非必传。
				type: Boolean,
				default: false,
			},
			optionKeys: String, // 指定显示的vaule和label的key值JSON串,若此项有值,则不再用'value'和'label'作为属性名,以此项设置为准,默认空,非必传。
			showLabels: String, // 可选项展示值字符串,逗号隔开,若此项有值,则可选项所展示文字不再用'label'的值,以此项设置为准,展示时按照顺序展示出来。默认空,非必传。
		},
		data() {
			return {
				optionLists: [],
				optionKey: null,
				requestParams: null,
				showLabel: [],
				radioValue: this.value,
			};
		},
		watch: {
			options() {
				if(this.options)
					this.optionLists = JSON.parse(this.options)
			},
			urlCode() {
				this.getOptions();
			},
			urlParams() {
				this.requestParams = this.urlParams ? JSON.parse(this.urlParams) : null;
				this.getOptions();
			},
			url() {
				this.getOptions();
			},
			value() {
				this.selectValue = this.value
			},
			optionKeys() {
				this.optionKey = this.optionKeys ? JSON.parse(this.optionKeys) : null;
			},
			showLabels() {
				this.showLabel = this.showLabels ? this.showLabels.split(',') : [];
			},	
		},
		created() {
			this.optionKey = this.optionKeys ? JSON.parse(this.optionKeys) : null;
			this.showLabel = this.showLabels ? this.showLabels.split(',') : [];
			this.requestParams = this.urlParams ? JSON.parse(this.urlParams) : null;
			if (this.options) { // 如果父组件有可选项数据,则不进行数据请求
				this.optionLists = JSON.parse(this.options)
			} else {
				this.getOptions()
			}
		},
		methods: {
			/**
			* 获取选择项数据
			**/
			getOptions() {
				let params = {}
				if (this.urlCode)
					params.code = this.urlCode
				if(this.requestParams) {
					params = Object.assign(params, this.requestParams)
				}
				this.axios.get(this.url, {params})
				.then(res => {
					this.optionLists = res.list // 假设返回的数据封装在list中
				}).catch(() => {})
			},
			/**
			* 选择框选中时触发
			* @val {String} 当前选中值
			**/
			change(val) {
				let valueKey = 'value'
				if (this.optionKey) 
					valueKey = this.optionKey.value
				
				const valOption = this.optionLists.filter(itemO => itemO[valueKey] === val);
				const [valObj] = valOption;
				this.$emit('change', val, valObj);
			},
		},
	}
</script>
<style lang="less" scoped>
	.labelAll {
        span {
            margin-right: 10px;
            &:last-child {
                font-size: 13px;
                color: #8492a6;
            }
        }
		
	}
</style>
二、引用:
<template>
	<com-radio
		v-model="model"
		:options="options"
		:urlParams="urlParams"
		:optionKeys="optionKeys"
		:showLabels="showLabels"
		@change="radioChange"
	></com-radio>
</template>
<script>
	import comRadio from './comRadio.vue'
	export default {
		components: { comRadio },
		data() {
			return {
				model: '',
				options: JSON.stringify([
					{
						valueKey: '01',
						labelKey: '选项1',
						dis: '说明1',
						disA: '说明2',
					},
					{
						valueKey: '02',
						labelKey: '选项2',
						dis: '说明3',
						disA: '说明4',
					}
				]),
				urlParams: JSON.stringify({
					key1: '01',
					key2: 'Y',
				}),
				optionKeys: JSON.stringify({
					value: 'valueKey',
					label: 'labelKey'
				}),
				showLabels: 'labelKey,dis,disA',	
			};
		},
		methods: {
			/**
			* 选择框选择值更改触发
			* @val {String} 当前选中值
			* @valObj {Object} 当前选中值所在的对象
			**/
			radioChange(val, valObj) {
				this.model = val
				console.log("valObj=>", valObj)
				console.log("val=>", val)
			}
		},
	}
</script>

效果图:
在这里插入图片描述
在这里插入图片描述
完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值