|
@@ -0,0 +1,233 @@
|
|
|
+<!-- @format -->
|
|
|
+
|
|
|
+<template>
|
|
|
+ <!-- v-model -->
|
|
|
+
|
|
|
+ <!-- 使用组件 -->
|
|
|
+ <!-- <vvSelect placeholder="请选择所属类别" :list="categorys" label="name" valueKey="id" @change="pickerChange"></vvSelect> -->
|
|
|
+ <picker
|
|
|
+ mode="multiSelector"
|
|
|
+ @change="bindMultiPickerChange"
|
|
|
+ @columnchange="bindMultiPickerColumnChange"
|
|
|
+ range-key="name"
|
|
|
+ :value="multiIndex"
|
|
|
+ :disabled="disabled"
|
|
|
+ :range="multiArray"
|
|
|
+ >
|
|
|
+ <view class="vv-input__body text-right">
|
|
|
+ <view class="vv-input__control">
|
|
|
+ <text v-if="checkLabels" :class="{ disabled: disabled }">{{
|
|
|
+ checkLabels
|
|
|
+ }}</text>
|
|
|
+ <text class="vv-input__placeholder" v-else>{{ placeholder }}</text>
|
|
|
+ </view>
|
|
|
+
|
|
|
+ <!-- <uni-icons type="arrowright" size="14" color="#808080"></uni-icons> -->
|
|
|
+ </view>
|
|
|
+ </picker>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+/**
|
|
|
+ * vv-select 选择
|
|
|
+ * @description picker再封装
|
|
|
+ * @property {String} valueKey 绑定的key
|
|
|
+ * @property {String} label 绑定的label
|
|
|
+ * @property {Array} list 数据
|
|
|
+ * @property {Array} level 层级 默认3级 即:省-市-区
|
|
|
+ * @property {Boolean} disabled 是否禁用
|
|
|
+ * @event {Function} change
|
|
|
+ */
|
|
|
+
|
|
|
+export default {
|
|
|
+ name: "vv-select-area",
|
|
|
+ props: {
|
|
|
+ value: {
|
|
|
+ type: [Array],
|
|
|
+ },
|
|
|
+ placeholder: {
|
|
|
+ type: String,
|
|
|
+ default: "请选择",
|
|
|
+ },
|
|
|
+ list: {
|
|
|
+ type: [Array],
|
|
|
+ },
|
|
|
+ level: {
|
|
|
+ type: Number,
|
|
|
+ default: 3,
|
|
|
+ },
|
|
|
+ disabled: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ city: [],
|
|
|
+ multiArray: [],
|
|
|
+ multiIndex: [],
|
|
|
+ checkLabels: "",
|
|
|
+ checkValues: [],
|
|
|
+ };
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ value: {
|
|
|
+ handler: function (newVal) {
|
|
|
+ if (this.list.length > 0 && this.value.length > 0) {
|
|
|
+ this.init();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ immediate: true,
|
|
|
+ },
|
|
|
+ list: {
|
|
|
+ handler: function (newVal) {
|
|
|
+ if (this.list.length > 0) {
|
|
|
+ this.init();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ immediate: true,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ created() {},
|
|
|
+ methods: {
|
|
|
+ init: function () {
|
|
|
+ this.city = [...this.list];
|
|
|
+ this.multiArray[0] = this.city;
|
|
|
+ this.setMultiData(0, 0); // 默认值
|
|
|
+ if (this.value && this.value.length > 0) {
|
|
|
+ // 有初始值
|
|
|
+ this.setCheck(this.value);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ setCheck: function (codes) {
|
|
|
+ if (codes.length == 0) return false;
|
|
|
+ let indexs = [];
|
|
|
+ let _labes = [];
|
|
|
+ for (let i = 0, l = codes.length; i < l; i++) {
|
|
|
+ let index = this.multiArray[i].findIndex((item) => {
|
|
|
+ return item.id == codes[i];
|
|
|
+ });
|
|
|
+ indexs.push(index);
|
|
|
+ let item = this.multiArray[i].find((item) => {
|
|
|
+ return item.id == codes[i];
|
|
|
+ });
|
|
|
+ _labes.push(item.name);
|
|
|
+ this.setMultiData(i, index);
|
|
|
+ }
|
|
|
+ this.multiIndex = indexs;
|
|
|
+ this.checkValues = codes;
|
|
|
+ this.checkLabels = _labes.join("-");
|
|
|
+ },
|
|
|
+ setMultiData: function (column, index) {
|
|
|
+ var data = {
|
|
|
+ multiArray: this.multiArray,
|
|
|
+ multiIndex: this.multiIndex,
|
|
|
+ };
|
|
|
+ data.multiIndex[column] = index; //
|
|
|
+
|
|
|
+ switch (column) {
|
|
|
+ case 0: //拖动第1列
|
|
|
+ if (this.city[index].children) {
|
|
|
+ data.multiArray[1] = this.city[index].children;
|
|
|
+ if (data.multiArray[1][0] && data.multiArray[1][0].children) {
|
|
|
+ data.multiArray[2] = data.multiArray[1][0].children;
|
|
|
+
|
|
|
+ if (this.level > 3) {
|
|
|
+ if (data.multiArray[2][0] && data.multiArray[2][0].children) {
|
|
|
+ data.multiArray[3] = data.multiArray[2][0].children;
|
|
|
+ } else {
|
|
|
+ data.multiArray[3] = [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ data.multiArray[2] = [];
|
|
|
+ if (this.level > 3) {
|
|
|
+ data.multiArray[3] = [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ data.multiArray[1] = [];
|
|
|
+ data.multiArray[2] = [];
|
|
|
+ if (this.level > 3) {
|
|
|
+ data.multiArray[3] = [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.multiIndex.splice(1, 1, 0);
|
|
|
+ this.multiIndex.splice(2, 1, 0);
|
|
|
+ if (this.level > 3) {
|
|
|
+ this.multiIndex.splice(3, 1, 0);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 1: //拖动第2列
|
|
|
+ if (data.multiArray[1][index] && data.multiArray[1][index].children) {
|
|
|
+ data.multiArray[2] = data.multiArray[1][index].children;
|
|
|
+ if (this.level > 3) {
|
|
|
+ if (data.multiArray[2][0] && data.multiArray[2][0].children) {
|
|
|
+ data.multiArray[3] = data.multiArray[2][0].children;
|
|
|
+ } else {
|
|
|
+ data.multiArray[3] = [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ data.multiArray[2] = [];
|
|
|
+ if (this.level > 3) {
|
|
|
+ data.multiArray[3] = [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.multiIndex.splice(2, 1, 0);
|
|
|
+ if (this.level > 3) {
|
|
|
+ this.multiIndex.splice(3, 1, 0);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 2: //拖动第3列
|
|
|
+ if (this.level < 4) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (data.multiArray[2][index] && data.multiArray[2][index].children) {
|
|
|
+ data.multiArray[3] = data.multiArray[2][index].children;
|
|
|
+ } else {
|
|
|
+ data.multiArray[3] = [];
|
|
|
+ }
|
|
|
+ this.multiIndex.splice(3, 1, 0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.multiArray = data.multiArray;
|
|
|
+ this.multiIndex = data.multiIndex;
|
|
|
+ this.$forceUpdate();
|
|
|
+ },
|
|
|
+
|
|
|
+ bindMultiPickerColumnChange: function (e) {
|
|
|
+ this.setMultiData(e.detail.column, e.detail.value);
|
|
|
+ },
|
|
|
+ bindMultiPickerChange: function (e) {
|
|
|
+ let _labes = [];
|
|
|
+ let _values = [];
|
|
|
+ for (let i = 0, l = this.multiArray.length; i < l; i++) {
|
|
|
+ let item = this.multiArray[i];
|
|
|
+ let index = this.multiIndex[i];
|
|
|
+ if (item.length === 0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ _labes.push(item[index].name);
|
|
|
+ _values.push(item[index].id);
|
|
|
+ }
|
|
|
+ console.log(_labes, _values);
|
|
|
+ // console.log(
|
|
|
+ // this.multiArray[0][e.detail.value[0]],
|
|
|
+ // this.multiArray[1][e.detail.value[1]]
|
|
|
+ // ); // {value: "431000", label: "郴州市", level: 2}
|
|
|
+ // this.multiIndex = e.detail.value;
|
|
|
+ // this.$apply();
|
|
|
+ this.checkLabels = _labes.join("-");
|
|
|
+ this.checkValues = _values;
|
|
|
+ // 返回这个值到父级
|
|
|
+ this.$emit("change", _values);
|
|
|
+ this.$emit("input", _values);
|
|
|
+ this.$emit("on-change", _values);
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+<style lang="scss" scoped></style>
|