vue组件递归

6 篇文章 0 订阅
4 篇文章 0 订阅

vue中,组件可以通过name选项实现在自身模板中调用自身

何时用到递归组件:当后台返回数据结构呈现树状结构,且页面渲染内容相同

   // 递归组件必须具备一个结束或渲染的条件,不然就会造成组件一直循环引用,最终出现“max stack size exceeded”的错误,也就是栈溢出。所以,我们得使用v-if,给出一个条件作为递归组件渲染的条件。当不满足v-if条件时,组件将不会再进行渲染。

<template>
	<div>
		<Row :key="key" >
			<Col v-for="(item,index) in attributeData" :key="index" style="margin-bottom: 10px;">
				<!-- 输入框 -->
				<div v-if="item.type === 'input'">
					{{item.attrName}}
					<Input type="text"  v-model="form[item.attribute]" :placeholder="'请输入'+item.attrName" @on-change="changeEvent(item, form[item.attribute])" style="width: auto"></Input>
				</div>
				<!-- 下拉框 -->
				<div v-if="item.type === 'select'">
					{{item.attrName}}
					<SelectDeal :attribute="form[item.attribute]" :item="item" @on-change="changeEvent(item, form[item.attribute])"></SelectDeal>
				</div>
				<!-- 颜色码 -->
				<div v-if="item.type === 'takeColor' && form[item.attribute] !== undefined">
					{{item.attrName}}
					<colorPicker v-model="form[item.attribute]" v-on:change="changeEvent(item, form[item.attribute])" :key="colorKey"/>
				</div>
				<!-- 数字输入框 -->
				<div v-if="item.type === 'numbeInput'">
					{{item.attrName}}
					<NumberInput :attribute="form[item.attribute]" :item="item"></NumberInput >
				</div>
				<!-- 单选框 -->
				<div v-if="item.type === 'radio'">
					{{item.attrName}}
					<RadioDeal :attribute="form[item.attribute]" :item="item"></RadioDeal>
				</div>
				<!-- 数组输入框 -->
				<div v-if="item.type === 'array'">
					{{item.attrName}}
					<ArrayDeal :attribute="form[item.attribute]" :item="item"></ArrayDeal>
				</div>
				<!-- 递归组件 -->
				<div v-if="item.chartConfigDtoList.length>0">
					{{item.attrName}}
					<input-mode v-if="item.chartConfigDtoList.length>0" :attributeData="item.chartConfigDtoList"  style="margin-left: 20px;margin-top:10px;"></input-mode>
				</div>
			</Col>
		</Row>
	</div>
</template>

<script>
import NumberInput from '@/components/public/NumberInput'
import SelectDeal from '@/components/public/selectDeal'
import RadioDeal from '@/components/public/radioDeal'
import ArrayDeal from '@/components/public/ArrayDeal'
import bus from '@/components/public/bus'
export default {
	name: 'inputMode',
	props: {
		module: String,
		attributeData: Array
	}
	}

这里,根据后台返回数据,判断每条数据以何种方式展示,并且每条数据中都具有chartConfigDtoList属性,所以可以根据chartConfigDtoList数组不为空作为渲染条件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值