共计 3480 个字符,预计需要花费 9 分钟才能阅读完成。
问题形容
在咱们的印象中,v-model 的用法如同就是绑定一个 data 中的数据 (比方输入框)。比方上面的常见用法:
<el-input v-model="input" placeholder="请输出内容"></el-input>
<script>
export default {data() {
return {input: ''}
}
}
</script>
这样就会给咱们造成一个错觉,如同 v -model 就是绑定一个数据字符串。其实 v -model 不仅能够绑定字符串,还能够联合 v -for 绑定数组。如上面的用法:
<template>
<div id="app">
<!-- 这里 v -model 动静绑定 inputArr 下的 value -->
<el-input
v-model="item.value"
placeholder="请输出内容"
v-for="(item,index) in inputArr"
:key="index"
></el-input>
</div>
</template>
<script>
export default {data() {
return {
inputArr:[
{value:"",},
{value:"",},
{value:"",},
]
};
},
};
</script>
联合 vue 的调试工具看一下数据双向绑定的效果图:
需要如下
下图中的这个效果图,就用到了 v -model 绑定数组的用法。
需要剖析
有一个表单,作品项中默认有两个输入框,当点击减少作品按钮时,能够新增输入框。新增输入框的右边有一个能够删除的小图标(也就是从第三个输入框开始),点击删除小图标,就能够把对应的输入框删除掉。当然表单中的输入框都是必填项。没填写就做一个提醒吧。
思路剖析
首先是要放一个 el-form 的构造。上面的作品项 el-form-item 中的 el-input 通过 v -for 循环 bookArr 同时 v -model 绑定数组中的每一项的 value。至于删除小图标,也一并写好,只不过第一个和第二个输入框不显示,也就是 v -show 判断一下,当 index 为 0 或者为 1 的时候暗藏。当点击减少作品时,往 bookArr 中输减少一项,当点击删除小图标时,依据删除的哪一项的索引,通过 splice 办法从第 i 个地位,删除 1 项。当然点击确认的时候要看看输入框内容是否为空,为空就提醒一下,要是输入框全副都填写了,就能够应用输入框的参数作为参数发申请发给后盾了了。
代码步骤
html 局部
<template>
<div id="app">
<div class="content">
<div class="contentHeader">
<span> 新增作家信息 </span>
<i class="el-icon-close"></i>
</div>
<div class="contentBody">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="名字:">
<el-input
v-model.trim="form.name"
placeholder="请输出作家姓名"
></el-input>
</el-form-item>
<el-form-item label="作品:">
<!-- 这个 div 外面的是细节重点 -->
<div class="itemitem" v-for="(item, index) in bookArr" :key="index">
<!-- 删除小图标 -->
<i
v-show="show(index)"
@click="deleteItem(index)"
class="el-icon-remove-outline dingwei"
></i>
<!-- 输入框 v -model 绑定数组 -->
<el-input
v-model.trim="item.value"
placeholder="请输出作家著述"
></el-input>
</div>
<el-button type="text" size="small" @click="addBook"
>+ 减少作品 </el-button
>
</el-form-item>
</el-form>
</div>
<div class="contentFooter">
<el-button size="small"> 勾销 </el-button>
<el-button size="small" type="primary" @click="getFormValue"> 确认 </el-button>
</div>
</div>
</div>
</template>
js 局部
<script>
export default {data() {
return {
form: {name: "",},
bookArr: [
{value: "",},
{value: "",},
],
};
},
methods: {
// 增加一项
addBook() {this.bookArr.push({ value: ""});
},
// 从第三项开始才展现
show(i){if(i==0 | i==1){return false}else{return true}
},
// 依据索引删除对应哪一项
deleteItem(i){this.bookArr.splice(i,1)
},
// 点击确认按钮
getFormValue(){if(this.form.name == ""){this.$message.error('作家名字为必填项');
return
}
// 这里也能够用数组的 every 办法做判断
let num = 0
this.bookArr.forEach((item)=>{if(item.value == ""){num = num + 0}else{num = num + 1}
})
// 当 num 等于 this.bookArr.length 的时候,阐明都填写了
if(num == this.bookArr.length){
this.form.bookArr = this.bookArr
console.log("发申请",this.form);
}else{this.$message.error('作家作品需全副填写');
}
}
},
};
</script>
css 局部
<style lang="less" scoped>
#app {
width: 100%;
height: 100vh;
background-color: rgba(0, 0, 0, 0.3);
display: flex;
justify-content: center;
align-items: center;
.content {
width: 480px;
height: 360px;
background-color: #fff;
border-radius: 5px;
.contentHeader {
width: 100%;
height: 50px;
border-bottom: 1px solid #e9e9e9;
box-sizing: border-box;
padding: 0 25px;
display: flex;
justify-content: space-between;
align-items: center;
span {font-size: 20px;}
i {
font-size: 25px;
cursor: pointer;
}
}
.contentBody {
overflow-y: auto;
width: 100%;
height: calc(100% - 100px);
display: flex;
justify-content: center;
padding-top: 20px;
box-sizing: border-box;
padding-right: 25px;
// align-items: center;
.el-form {
.itemitem {
display: flex;
align-items: center;
position: relative;
.dingwei {
position: absolute;
left: -30px;
top: 12px;
}
i {
font-size: 20px;
margin-right: 6px;
}
.el-input {
margin-bottom: 8px;
width: 206px;
}
}
}
}
.contentFooter {
width: 100%;
height: 50px;
line-height: 50px;
border-top: 1px solid #e9e9e9;
text-align: center;
}
}
}
</style>
总结
好忘性不如烂笔头,记录一下吧。如果本篇文章的思路帮忙到您了,欢送各位看官大佬们赏赐个赞吧。手动比心
正文完
发表至: javascript
2021-03-30