vue实现底部弹窗多选
本文实例为大家分享了vue实现底部弹窗多选的具体代码,供大家参考,具体内容如下
代码:
<template>
<div class="release-post">
<div class="resume_main">
<div class="resume_content">
<van-form>
<div class="table_list post_welfare">
<p class="name_title">岗位福利<span class="required">*</span></p>
<van-field
class="calendar"
input-align="left"
v-model="benefits"
placeholder="请选择岗位福利"
@focus="onFocus"
:class="{ borderStyle: welfareChange }"
@click.stop="clickWelfare"
:disabled="true"
/>
</div>
</van-form>
<!-- 岗位福利 -->
<van-popup v-model="showWelfare" position="bottom">
<div class="welfare_top">
<p></p>
<p class="welfare_title">福利待遇(可多选)</p>
<p class="welfare_btn" @click.stop="onConfirmSpeed">完成</p>
</div>
<div class="welfare_content">
<div
v-for="(item, index) in welfareList"
:key="index"
:class="{ active: item.active }"
id="welfare_item"
@click.stop="clickWelfareItem(item, index)"
>
<p :class="item.active ? 'welfare_text' : 'not_welfare_text'">
{{ item.text }}
</p>
</div>
</div>
</van-popup>
</div>
</div>
<div>
<div class="mask">
<button
class="btn"
@click="submit"
:class="{ btnBg: colorChange() }"
v-preventReClick="1000"
>
完成
</button>
</div>
</div>
</div>
</template>
<script>
import Vue from 'vue';
import { Circle, DatetimePicker, Form, Field, Toast, Calendar, Picker, Overlay, ActionSheet, Popup } from 'vant';
import 'vant/lib/index.less';
Vue.use(Circle).use(DatetimePicker).use(Form).use(Field).use(Toast).use(Calendar).use(Picker).use(Overlay).use(ActionSheet).use(Popup);
export default {
name: "PerfectPost",
data () {
return {
welfareList: [
{
id: 1,
text: "包吃"
},
{
id: 2,
text: "包住"
},
{
id: 3,
text: "五险一金"
},
{
id: 4,
text: "年底双薪"
},
{
id: 5,
text: "商业险"
},
{
id: 6,
text: "意外险"
},
{
id: 7,
text: "团建"
},
{
id: 8,
text: "周末双休"
},
{
id: 9,
text: "下午茶"
},
{
id: 10,
text: "餐补"
},
{
id: 11,
text: "交通补助"
},
{
id: 12,
text: "班车接送"
},
{
id: 13,
text: "奖金"
},
{
id: 14,
text: "公费培训"
},
{
id: 15,
text: "公费旅游"
},
],
showWelfare: false,//岗位福利
onlineForm: {
benefits: "",//岗位福利
},
checkedList: [],
welfareChange: false,
};
},
methods: {
//弹出岗位福利
clickWelfare () {
this.showRedTips()
this.showWelfare = true
},
//选择福利项
clickWelfareItem (v) {
if (v.active) {
Vue.set(v, 'active', false)
} else if (this.checkedList.length < 5) {
Vue.set(v, 'active', true)
}
this.checkedList = this.welfareList.filter(function (item) {
return item.active
})
if (this.checkedList.length >= 5) {
Toast('最多只能选择5个哦')
}
},
//完成福利选项
onConfirmSpeed () {
this.showWelfare = false
this.welfareChange = false
let itemList = this.checkedList.map((item) => {
return item.text
});
let str = itemList.join('/')
let str1 = itemList.join(';')
this.benefits = str ? str : this.benefits
this.onlineForm.benefits = str1 ? str1 : this.benefits
},
showRedTips () {
this.welfareChange = false
},
onFocus () {
this.showRedTips()
},
//下一步按钮色值
colorChange () {
if (this.onlineForm.benefits) {
return true
}
},
// 验证
validateOnlineForm () {
let valid = true;
if (!this.onlineForm.benefits || !this.onlineForm.benefits.trim()) {
valid = false;
Toast('请选择岗位福利')
this.welfareChange = true
}
return valid;
},
//提交
submit () {
if (this.validateOnlineForm()) {
Toast('提交')
}
},
},
};
</script>
<style scoped lang="less" >
* {
margin: 0;
padding: 0;
}
::v-deep .van-picker__title {
font-size: 17px;
font-family: PingFangSC, PingFangSC-Medium;
font-weight: 500;
text-align: center;
color: #333333;
}
.release-post {
width: 100%;
padding-bottom: 64px;
padding-top: constant(safe-area-inset-top);
padding-top: env(safe-area-inset-top);
}
.post_welfare {
::v-deep .van-field__control:disabled {
font-size: 15px;
font-family: PingFangSC, PingFangSC-Regular;
font-weight: 400;
text-align: left;
color: #333333;
-webkit-text-fill-color: #333333;
}
::v-deep input::-webkit-input-placeholder {
font-size: 15px;
font-family: PingFangSC, PingFangSC-Regular;
font-weight: 400;
text-align: left;
color: #999999;
-webkit-text-fill-color: #999999;
}
}
::v-deep .van-field__control:disabled {
font-size: 15px;
font-family: PingFangSC, PingFangSC-Regular;
font-weight: 400;
text-align: left;
color: #333333;
-webkit-text-fill-color: #333333;
}
.welfare_content {
padding-top: 10px;
padding-bottom: 30px;
display: flex;
justify-content: space-around;
align-items: center;
flex-wrap: wrap;
margin: 0 16px;
}
#welfare_item {
width: 31%;
}
.welfare_top {
display: flex;
justify-content: space-between;
align-items: center;
padding: 13px 0;
border-bottom: solid 0.5px #e5e5e5;
}
.welfare_title {
font-size: 17px;
font-family: PingFangSC, PingFangSC-Medium;
font-weight: 500;
text-align: center;
color: #333333;
margin-right: -16px;
}
.welfare_btn {
font-size: 16px;
font-family: PingFangSC, PingFangSC-Regular;
font-weight: 400;
text-align: right;
color: #333333;
margin-right: 16px;
}
.welfare_text {
height: 36px;
background: #f4f8ff;
border: 1px solid #bbdcff;
border-radius: 4px;
margin-top: 10px;
line-height: 36px;
font-size: 14px;
font-family: PingFangSC, PingFangSC-Medium;
font-weight: 500;
text-align: center;
color: #1283ff;
}
.not_welfare_text {
height: 36px;
background: #ffffff;
border: 1px solid #e5e5e5;
border-radius: 4px;
margin-top: 10px;
line-height: 36px;
font-size: 14px;
font-family: PingFang, PingFang-SC;
font-weight: 500;
text-align: center;
color: #333333;
}
.resume_content {
margin-left: 30px;
margin-right: 30px;
::v-deep {
.van-popup--bottom {
border-top-left-radius: 12px;
border-top-right-radius: 12px;
}
}
}
.mask {
width: 100%;
background: #ffffff;
box-shadow: 0px 0px 8px 0px rgba(204, 204, 204, 0.3);
position: fixed;
bottom: 0;
left: 0;
display: flex;
justify-content: center;
align-items: center;
padding: 10px 0;
padding-bottom: calc(env(safe-area-inset-bottom)+15px);
padding-bottom: calc(env(safe-area-inset-bottom) + 15px);
}
.btn {
font-size: 16px;
font-family: PingFangSC, PingFangSC-Medium;
font-weight: 500;
text-align: left;
color: #ffffff;
margin: 0 auto;
text-align: center;
line-height: 1.6rem;
width: 100%;
margin: 0 16px;
height: 48px;
background: #d8d8d8;
}
.btnBg {
font-size: 16px;
font-family: PingFangSC, PingFangSC-Medium;
font-weight: 500;
text-align: left;
color: #ffffff;
margin: 0 auto;
text-align: center;
line-height: 1.6rem;
width: 100%;
margin: 0 16px;
height: 48px;
background: #d8d8d8;
border: none;
outline: none;
background: linear-gradient(90deg, #50a3ff, #1283ff);
border-radius: 4px;
}
.name_title {
font-size: 16px;
font-family: PingFangSC, PingFangSC-Medium;
font-weight: 500;
color: #333333;
}
.required {
font-size: 13px;
font-family: PingFangSC, PingFangSC-Regular;
font-weight: 400;
color: #ff1d28;
position: absolute;
}
.calendar {
width: 100%;
height: 49px;
background: #ffffff;
border: 1px solid #e5e5e5;
border-radius: 5px;
margin-top: 10px;
padding-left: 20px;
background: url("./images/drop-down.png") no-repeat 96% center;
background-size: 10px 7px;
padding-right: 25px;
::v-deep .van-field__control {
font-size: 15px;
font-family: PingFangSC, PingFangSC-Regular;
font-weight: 400;
text-align: left;
color: #333333;
margin-top: 12px;
}
}
::v-deep input::-webkit-input-placeholder {
font-size: 15px;
font-family: PingFangSC, PingFangSC-Regular;
font-weight: 400;
text-align: left;
color: #afadad;
-webkit-text-fill-color: #afadad;
}
.table_list {
margin-top: 16px;
}
.borderStyle {
border: solid 1px #ff1d28;
border-radius: 3px;
}
input::-webkit-input-placeholder {
font-size: 15px;
font-family: PingFangSC, PingFangSC-Regular;
font-weight: 400;
text-align: left;
color: #999999;
}
.van-field__control {
color: #333333;
}
</style>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
以上是 vue实现底部弹窗多选 的全部内容, 来源链接: utcz.com/p/239655.html