个人笔记014--vue实现input和select等的动态布局

vue

今天忙里偷闲整理了一下以前的项目,发现了一个实现动态展示input和select的较好的demo,所以分享一下:

<template>

<div id="index">

<div class="Nuser-content">

<div class="title">用户信息填写</div>

<div class="input">

<div class="info-unit" v-for="(item,index) in userInfo" :key="index">

<div class="grid-content bg-purple">{{item.name}}</div>

<div class="discrible must">

<template v-if="item.select">

<select class="enter-input"

v-model="item.val">

<option

v-for="val in item.selectObj"

:key="val.value"

:label="val.label"

:value="val.value"

></option>

</select>

</template>

<template v-else>

<!-- 如果是密码框则为password,否则为text -->

<input class="enter-input" v-model="item.val" :type=" index == 'password' ? 'password' : 'text' ">

</template>

<span class="units"></span>

</div>

</div>

</div>

</div>

<div class="Nuser-xz-content">

<div class="title">更多信息</div>

<div class="input">

<div v-for="(item,index) in moreInfo" class="info-unit" :key="index">

<div class="grid-content bg-purple">{{item.name}}</div>

<div :class=" item.must ? 'discrible must' : 'discrible'">

<template v-if="item.select">

<select class="enter-input"

v-model="item.val">

<option

v-for="val in item.selectObj"

:key="val.value"

:label="val.label"

:value="val.value"

></option>

</select>

</template>

<template v-else>

<input class="enter-input" v-model="item.val" >

</template>

<span class="units"></span>

</div>

</div>

</div>

</div>

<div class="Nuser-content-btm">

<button @click="addUser">保存</button>

</div>

</div>

</template>

<script>

export default {

data(){

return{

userInfo:{

realname:{name:'客户名称',val:'',select:false}, //客户名称(必填)

mobile:{name:'手机号码',val:'',select:false}, //手机号码(必填)

password:{name:'密码',val:'',select:false},//密码(必填)

rlename:{name:'用户角色',val:'',select:true},//用户角色(下拉框)

},

moreInfo:{

sex:{name:'性别',val:'',must:false,select:true}, //性别(下拉框) //must判断是否为必填选项,select判断是否有下拉框

lictype:{name:'证件类型',val:'',must:false,select:true}, //证件类型(下拉框)

liscnum:{name:'证件号码',val:'',must:false,select:false}, //证件号码

birthday:{name:'生日',val:'',must:false,select:false}, //生日

linkman:{name:'联系人',val:'',must:false,select:false}, //联系人

email:{name:'邮箱',val:'',must:false,select:false}, //邮箱

qq:{name:'QQ',val:'',must:false,select:false}, //QQ

weixin:{name:'微信',val:'',must:false,select:false}, //微信

dttid:{name:'所属地区',val:'',must:true,select:false}, //所属地区(必填)

address:{name:'联系地址',val:'',must:true,select:false}, //联系地址(必填)

remark:{name:'备注',val:'',must:false,select:false}, //备注

},

rlename: [{

value: 'member',

label: '平板机用户'

}, {

value: 'manager',

label: '管理员'

}],

sex: [{

value: 'man',

label: '男'

}, {

value: 'woman',

label: '女'

}],

lictype: [{//身份证1、户口本2、驾驶证3、军人证4、学生证5

value: '1',

label: '身份证'

}, {

value: '2',

label: '户口本'

}, {

value: '3',

label: '驾驶证'

}, {

value: '4',

label: '军人证'

}, {

value: '5',

label: '学生证'

}],

}

},

created(){

this.addSelect(this.userInfo)

this.addSelect(this.moreInfo)

},

methods:{

// 对象添加下拉框属性

addSelect(object){

for (const key in object) {

if (object[key].select) {

object[key].selectObj = this[key]

}

}

},

// 非空判断

checkNulll(){

var str = ''

for (const key in this.userInfo) {

// 如果有空值则返回对应的名字

if(this.userInfo[key].val == '') return str = this.userInfo[key].name;

}

// !str表示第一次遍历没空值

if(!str){

for (const key in this.moreInfo) {

if( this.moreInfo[key].must && this.moreInfo[key].val == '') return str = this.moreInfo[key].name;

}

}

return str

},

// 点击按钮

addUser(){

var str = this.checkNulll()

if(str) return alert(str + '不能为空!')

}

}

}

</script>

<style scoped>

#index{

text-align: left;

margin: 50px;

background: #dcc5c5;

}

.Nuser-content{

padding: 50px;

padding-bottom: 0px;

overflow: hidden;

}

.Nuser-xz-content{

padding: 50px;

padding-bottom: 0px;

padding-top: 0px;

}

.title{

font-size:20px;

font-weight: 600;

}

.input{

line-height: 40px;

padding: 20px 30px;

width: 98%;

overflow: hidden;

}

.info-unit{

float: left;

width: 25%;

margin-bottom: 10px;

}

.grid-content {

display: inline-block;

vertical-align: middle;

width: 100px;

height: 40px;

overflow: hidden;

}

.must {

background: url(./../../static/must.png) no-repeat center left;

background-size: 8px;

}

.enter-input {

width:100%;

font-size: inherit;

vertical-align: middle;

height: 40px;

line-height: 40px;

outline: 0;

border-radius: 4px;

border: 1px solid #dcdfe6;

background-color: rgb(229, 221, 234);

text-indent: 5px;

cursor: pointer;

}

.discrible {

display: inline-block;

width: 55%;

padding-left: 15px;

position: relative;

}

.units {

position: absolute;

font-size: 14px;

color: #999;

right: 10px;

top: 0px;

}

.Nuser-content-btm{

padding:20px 50px 50px;

}

.Nuser-content-btm button{

padding: 8px 12px;

margin-right: 20px;

}

</style>

以上是 个人笔记014--vue实现input和select等的动态布局 的全部内容, 来源链接: utcz.com/z/375820.html

回到顶部