付延余
2022-12-19 8fc8838a441ae3d3b1616f4fc003b16292978b54
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<template>
    <view class="data-selet" >
        <view class="data-selet-content">
            <view class="uni-select__icon" :class="{'activeIcon':isActive}"><uni-icons type="bottom" size="20" color="#dddddd"></uni-icons></view>
            <view class="content" @tap="clickHandler">
                <input :placeholder="placeholder" :disabled="true" type="text" :value="value" @input="inputChange" style="font-size: 14px;" placeholder-style="color:#cccccc">
            </view>
            <view v-if="keyword && clearabled && value" class="cleanIcon" v-show="true" @tap="clear"><uni-icons type="clear" size="18" color="#dddddd"></uni-icons></view>
        </view>
    </view>
</template>
 
<script>
    export default{
        name:'DataSelectBox',
        data(){
            return {
                keyword: '',
                isActive:false
            }
        },
        props:{
            placeholder:{
                type:String,
                default:''
            },
            // 是否启用清除控件
            clearabled: {
                type: Boolean,
                default: false
            },
            // 输入框的初始化内容
            value: {
                type: String,
                default: ''
            }
        },
        watch: {
            keyword(nVal) {
                // 双向绑定值,让v-model绑定的值双向变化
                this.$emit('input', nVal);
                // 触发change事件,事件效果和v-model双向绑定的效果一样,让用户多一个选择
                this.$emit('change', nVal);
            },
            value: {
                immediate: true,
                handler(nVal) {
                    this.keyword = nVal;
                }
            }
        },
        methods:{
            // 目前HX2.6.9 v-model双向绑定无效,故监听input事件获取输入框内容的变化
            inputChange(e) {
                this.keyword = e.detail.value;
            },
            // 点击搜索框,发出事件
            clickHandler() {
                this.isActive = true;
                this.$emit('click',this.isActive);
            },
            clear(){
                this.keyword = '';
                // 延后发出事件,避免在父组件监听clear事件时,value为更新前的值(不为空)
                this.$nextTick(() => {
                    this.$emit('clean');
                })
            }
        }
    }
</script>
 
<style lang="scss" scoped>
    .data-selet {
        .data-selet-content {
            background-color: #ffffff;
            border: 1px solid #d1d1d1;
            border-radius: 4px;
            height: vww(40);
            display: flex;
            align-items: center;
            font-size: 13px;
            color: #666;
            .uni-select__icon {
                transition: 500ms;
                margin: 0 5px 0 10px;
            }
            .activeIcon{
                transition: 500ms;
                transform:rotate(180deg);
            }
            .content {
                width:63%;
                display: flex;
                align-items: center;
            }
            .cleanIcon{
 
            }
        }
    }
</style>