|
|
- <template>
- <view class="page">
- <uv-drop-down ref="dropDown"
- :sign="sign"
- text-active-color="#3796F8"
- :extra-icon="{name:'arrow-down-fill',color:'#666',size:'26rpx'}"
- :extra-active-icon="{name:'arrow-up-fill',color:'#3796F8',size:'26rpx'}"
- :defaultValue="defaultValue"
- :custom-style="{padding: '0 30rpx'}"
- @click="selectMenu">
-
- <uv-drop-down-item name="areaId" type="2"
- :label="dropItem('areaId').label"
- :value="dropItem('areaId').value">
- </uv-drop-down-item>
-
- <uv-drop-down-item
- name="typeId" type="2"
- :label="dropItem('typeId').label"
- :value="dropItem('typeId').value">
- </uv-drop-down-item>
-
- <uv-drop-down-item
- name="natureId" type="2"
- :label="dropItem('natureId').label"
- :value="dropItem('natureId').value">
- </uv-drop-down-item>
-
- <uv-drop-down-item
- name="vip_type"
- type="1"
- label='智能推荐'
- :value="0">
- </uv-drop-down-item>
- </uv-drop-down>
-
- <uv-drop-down-popup
- :sign="sign"
- :click-overlay-on-close="true"
- :currentDropItem="currentDropItem"
- @clickItem="clickItem"
- @popupChange="change"></uv-drop-down-popup>
-
- <uv-popup ref="popup" :round="30"
- :safeAreaInsetBottom="false">
- <view class="popup">
-
- <view class="list">
- <view class="item"
- v-for="(item, index) in list"
- :key="item.type">
- <view class="title">
- {{ role ? item.bossTitle : item.title }}
- </view>
- <view class="tagList">
- <view
- :class="{act : i == item.index}"
- @click="clickTag(item, i)"
- v-for="(t, i) in item.tag"
- :key="t.label">
- {{ t.label }}
- </view>
- </view>
- </view>
- </view>
-
- <view class="btn" @click="submit">
- <button class="a">提交</button>
- </view>
- </view>
- </uv-popup>
- </view>
- </template>
-
- <script>
- import {
- mapState,
- } from 'vuex'
- export default {
- props : {
- sign : {
- default : 'dropDown_1'
- },
- },
- data() {
- return {
- // 表示value等于这些值,就属于默认值
- defaultValue: [0, 'all', 'all'],
- // 筛选结果
- result: [],
- activeName: 'areaId',
- areaId: {
- label: '全部',
- value: 0,
- activeIndex: 0,
- color: '#333',
- activeColor: '#3796F8',
- child: [
- {
- label: '全部',
- value: 0,
- },
- ]
- },
- typeId: {
- label: '工种',
- value: 'all',
- activeIndex: 0,
- color: '#333',
- activeColor: '#3796F8',
- child: [
- {
- label: '全部',
- value: 'all'
- },
- ]
- },
- natureId: {
- label: '性质',
- value: 'all',
- activeIndex: 0,
- color: '#333',
- activeColor: '#3796F8',
- child: [
- {
- label: '全部',
- value: 'all'
- },
- ]
- },
- list : [
- // {
- // title : '您目前所属的年龄段',
- // tag : ['18岁~35岁', '35岁~45岁', '45岁~50岁', '50岁以上'],
- // index : 0,
- // },
- {
- title : '您希望从事的工种',
- bossTitle : '您希望招工的工种',
- tag : [],
- index : 0,
- type : 'typeId',
- },
- {
- title : '您希望从事的工作性质',
- bossTitle : '您希望招工的工作性质',
- tag : [],
- index : 0,
- type : 'natureId',
- },
- {
- title : '您希望从事的工作地区',
- bossTitle : '您希望招工的工作地区',
- tag : [],
- index : 0,
- type : 'areaId',
- },
- ]
- }
- },
- computed : {
- dropItem(name) {
- return (name) => {
- const result = {};
- const find = this.result.find(item => item.name === name);
- if (find) {
- result.label = find.label;
- result.value = find.value;
- } else {
- result.label = this[name].label;
- result.value = this[name].value;
- }
- return result;
- }
- },
- // 获取当前下拉筛选项
- currentDropItem() {
- return this[this.activeName];
- },
- ...mapState(['jobTypeList', 'natureList', 'addressList']),
- },
- mounted() {
- setTimeout(this.initData, 500)
- },
- methods: {
- initData(){
-
- if(this.addressList.length == 0){
- setTimeout(this.initData, 500)
- }
-
- // 工种
- this.jobTypeList.forEach(n => {
- this.typeId.child.push({
- label: n.name,
- value: n.id,
- })
- })
- this.list[0].tag = this.typeId.child
-
- // 工作性质
- this.natureList.forEach(n => {
- this.natureId.child.push({
- label: n.name,
- value: n.id,
- })
- })
- this.list[1].tag = this.natureId.child
-
- // if(this.addressList[0]){
- // this.areaId.value = this.addressList[0].id
- // this.areaId.label = this.addressList[0].adress
-
- // this.defaultValue.slice(0, 1, this.addressList[0].id)
- // this.$forceUpdate()
- // }
-
- // 地址
- this.addressList.forEach(n => {
- this.areaId.child.push({
- label: n.adress,
- value: n.id,
- })
- })
- this.list[2].tag = this.areaId.child
-
- },
- clickTag(item, i){
- item.index = i
- },
-
- change(e) {},
- /**
- * 点击每个筛选项回调
- * @param {Object} e { name, active, type } = e
- */
- selectMenu(e) {
- const {
- name,
- active,
- type
- } = e;
-
-
- this.activeName = name;
-
- if(type == 1){
- this.$refs.popup.open()
- return
- }
-
- const find = this.result.find(item => item.name == this.activeName);
- if (find) {
- const findIndex = this[this.activeName]
- .child.findIndex(item => item.label == find.label && item
- .value == find.value);
- this[this.activeName].activeIndex = findIndex;
-
- } else {
- this[this.activeName].activeIndex = 0;
- }
- },
- /**
- * 点击菜单回调处理
- * @param {Object} item 选中项 { label,value } = e
- */
- clickItem(e) {
- // 下面有重新赋值,所以用let
- let {
- label,
- value
- } = e;
- const findIndex = this.result.findIndex(item => item.name == this.activeName);
- if (this.defaultValue.indexOf(value) > -1 && this[this.activeName].label) {
- label = this[this.activeName].label;
- }
- // 已经存在筛选项
- if (findIndex > -1) {
- this.$set(this.result, findIndex, {
- name: this.activeName,
- label,
- value
- })
- } else {
- this.result.push({
- name: this.activeName,
- label,
- value
- });
- }
-
- this.result = this.result.filter(item => this.defaultValue.indexOf(item.value) == -1);
-
-
- this.$emit('clickItem', this.result)
- },
- submit(){
-
- this.result = []
-
- this.list.forEach(n => {
- let t = n.tag[n.index]
- this.result.push({
- name: n.type,
- label : t.label,
- value : t.value
- })
- })
-
- this.result = this.result.filter(item => this.defaultValue.indexOf(item.value) == -1);
-
- this.$emit('clickItem', this.result)
-
- this.$refs.popup.close()
- },
- }
- }
- </script>
-
- <style scoped lang="scss">
- .page{
- .popup{
- width: 80vw;
- padding: 40rpx;
- .list{
- .item{
- margin-top: 20rpx;
- .title{
- font-weight: 900;
- font-size: 30rpx;
- }
- .tagList{
- display: flex;
- flex-wrap: wrap;
- padding: 10rpx 0;
- view{
- background: rgba($uni-color, 0.1);
- padding: 10rpx 20rpx;
- margin: 10rpx;
- border-radius: 10rpx;
- font-size: 26rpx;
- }
- .act{
- color: #fff;
- background: $uni-color;
- }
- }
- }
- }
- .btn {
- display: flex;
- justify-content: center;
- width: 100%;
- margin-top: 20rpx;
- .a {
- display: flex;
- justify-content: center;
- align-items: center;
- width: 90%;
- color: #FFF;
- background-color: $uni-color;
- border: 1px solid rgba($uni-color, 0.2);
- border-radius: 100rpx;
- font-size: 30rpx;
- }
- }
- }
- }
- </style>
|