Blame view

src/components/vant-number-plate/vnp-input-box.vue 2.18 KB
5e52ed7c   刘淇   个人中心
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  <template>
    <div class="vnp-input-box">
      <ul>
        <li
          v-for="(item, index) in val"
          :key="index"
          :class="{ active: activeIndex === index }"
          @click="handleClickItem(index)"
        >
          <span>{{ item }}</span>
        </li>
      </ul>
    </div>
  </template>
  
  <script>
  export default {
    props: {
      value: {
        type: String,
        default: "",
      },
      editable: {
        type: Boolean,
        default: false,
      },
    },
    data() {
      return {
        val: ["", "", "", "", "", "", "", ""],
        activeIndex: this.editable ? 0 : undefined,
      };
    },
    watch: {
      activeIndex() {
        this.$emit("activeChange", this.activeIndex);
      },
      value: {
        immediate: true,
        handler() {
          if (this.val.join("") === this.value) {
            return;
          }
          const val = this.value.split("");
          if (this.editable) {
            this.activeIndex = val.length;
          }
          while (val.length < 8) {
            val.push("");
          }
          this.val = val;
        },
      },
      val() {
        this.$emit("input", this.val.join(""));
      },
    },
    methods: {
      handleClickItem(index) {
        if (!this.editable) {
          return;
        }
        this.activeIndex = index;
      },
      setValue(val) {
        this.$set(this.val, this.activeIndex, val);
        if (this.activeIndex < 7) {
          this.activeIndex += 1;
        }
      },
      del() {
        this.$set(this.val, this.activeIndex, "");
        if (this.activeIndex > 0) {
          this.activeIndex -= 1;
        }
      },
    },
  }
  </script>
  
  <style lang="less" scoped>
    .vnp-input-box {
      padding: 10px 0;
      border: 1px solid #d8d8d8;
      border-radius: 2px;
      color: #8d8d8d;
      font-size: 15px;
      text-align: center;
  
      ul {
        display: flex;
      }
      li {
        flex: 1;
        border-right: 1px solid #eaeaea;
        height: 28px;
        line-height: 28px;
  
        &:first-child {
          border-color: #a6a6a6;
          flex: 1.3;
        }
        &:last-child {
          border: none;
        }
        &.active {
          color: #1989fa;
  
          > span {
            height: 100%;
            width: 20px;
            display: inline-block;
            border-bottom: 1px solid #1989fa;
          }
        }
      }
    }
  </style>