vue uniapp 公司用的 picker 树形递归

<template>
  <view class="">
    <my-tree
      :tree-data="treeData"
      @xuanzhong="xuanzhong"
      @bindPickerChange="bindPickerChange"
    ></my-tree>

    <!-- <button @click="dianji">dianji</button> -->
  </view>
</template>

<script>
import myTree from "./component/myTree.vue";
export default {
  components: {
    myTree,
  },
  data() {
    return {
      treeData: [
        {
          code: "51",
          title: "请选择市州----",
          show: true,
          // arr: [
          //   { name: "成都市", code: "5101" },
          //   { name: "内江市", code: "5110" },
          // ],
          children: [
            {
              code: "5101",
              name: "成都市",
              title: "请选择区县1",
              show: false,

              // arr: [
              //   { name: "武侯区", code: "120011" },
              //   { name: "郫都区", code: "130011" },
              // ],

              children: [
                {
                  show: false,

                  code: "510101",
                  name: "武侯区",
                  title: "请选择街道",
                },
                {
                  show: false,

                  code: "510102",
                  name: "郫都区",
                  title: "请选择街道",
                },
              ],
            },
            {
              code: "5110",
              name: "内江市",
              title: "请选择区县2",
              show: false,
              children: [
                {
                  code: "511001",
                  name: "资中县",
                },
                {
                  code: "511002",
                  name: "隆昌市",
                },
              ],
            },
          ],
        },
      ],
      aaa: "",
    };
  },
  onLoad() {
    const testJson = require("./component/data.json");
    console.log(testJson, 11111);
    this.treeData = testJson;
  },
  methods: {
    dianji() {
      console.log(this.treeData, 11111);
      console.log(JSON.stringify(this.treeData));
    },
    xuanzhong(item, index) {
      // if (item.children) {
      //   console.log("点击的2", item, index);
      // } else {
      //   console.log("点击的", item, index);
      // }
    },
    bindPickerChange(e) {
      this.aaa = e;
      console.log("jieguo", this.aaa);

      // console.log("picker发送选择改变,携带值为", e.detail.value);
      // console.log("!!!!!!!!");
    },
  },
};
</script>

<template>
  <div class="tree-item">
    <div v-for="(item, index) in treeData" :key="item.code">
      <!-- @click="nodeClick(item)" -->
      <div
        class="item-title xyflex"
        v-show="item.show"
        @click="xuanzhong(item, index)"
      >
        <picker
          @change="bindPickerChange($event, item, index)"
          :range="item.arr"
          range-key="name"
        >
          <!--v-if="item.show"  -->
          <span>{{ item.title }}{{ item.choose }}</span>
        </picker>
      </div>
      <div v-if="item.children && item.children.length" class="item-childen">
        <!-- @node-click="$emit('node-click', $event)" -->
        <my-tree
          :treeData="item.children"
          @xuanzhong="
            $emit('xuanzhong', item.children[treeitemindex], treeitemindex)
          "
          @bindPickerChange="$emit('bindPickerChange', $event)"
        ></my-tree>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "myTree",
  props: {
    treeData: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      old: [],

      index: 0,
      title: "picker",
      jieguo: "",

      expandedKeys: [], // 当前展开的节点id组成的数组
      treeitem: "",
      treeitemindex: "",
    };
  },
  methods: {
    del(data) {
      console.log(data, 777777);
      if (data) {
        for (var j = 0; j < data.length; j++) {
          console.log(data[j], 11111);

          data[j].show = false; //添加title属性
          data[j].choose = ""; //添加title属性
          data[j].chooseid = ""; //添加title属性

          if (data[j].children) {
            if (data[j].children.length > 0) {
              this.del(data[j].children);
            }
          }
        }
      }

      return data;
    },
    xuanzhong(item, index) {
      // console.log(666666, 11111);
      var arr = [];
      item.children.forEach((i, index) => {
        var aaa = {
          name: i.name,
          code: i.code,
        };
        arr.push(aaa);
      });
      item.arr = arr;
      this.$forceUpdate();

      this.treeitem = item;
      this.treeitemindex = index;

      console.log("点击的3", item, index, 9999999);
      this.$emit("xuanzhong", item, index);
    },

    bindPickerChange(e, item, index) {
      if (item && item.children && item.children[index].children) {
        this.del(item.children);
      }
      var index = index; //index 选中的这一整个  请选择市州- choose chooseid children code  show
      var arrindex = e.detail.value; //arrindex  选中picker的下标

      item.choose = item.arr[arrindex].name;
      item.chooseid = item.arr[arrindex].code;

      if (item.children) {
        item.children.forEach((element, index2) => {
          if (element.code == item.chooseid) {
            element.show = true;
            // console.log(55555, 11111);
          } else {
            element.show = false;
            element.choose = "";
            element.chooseid = "";
          }
        });
      }
      this.jieguo = {
        code: item.arr[arrindex].code,
        name: item.arr[arrindex].name,
      };

      this.$forceUpdate();
      this.$emit("bindPickerChange", this.jieguo);
      return;
      console.log(item.children, 55555555555555); //天津市河北省山西省
      if (item.children && item.children[index].children) {
        this.del(item.children);
      }
      console.log("bindPickerChange", e.detail.value, item, index);

      item.choose = item.arr[arrindex].name;
      item.chooseid = item.arr[arrindex].code;
      console.log(this.treeitem.chooseid, 11111);

      if (item.children) {
        item.children.forEach((element, index2) => {
          if (element.code == item.chooseid) {
            element.show = true;
            // console.log(55555, 11111);
          } else {
            element.show = false;
            element.choose = "";
            element.chooseid = "";
          }
        });
      }

      this.$forceUpdate();
      this.$emit("bindPickerChange", e);
    },
    nodeClick(item) {
      // return;
      this.$emit("node-click", item);
      if (item.children && item.children.length) {
        let index = this.expandedKeys.indexOf(item.code);
        if (index > -1) {
          // 如果当前节点id存在数组中,则删除
          this.expandedKeys.splice(index, 1);
        } else {
          // 如果当前节点id不存在数组中,则添加
          this.expandedKeys.push(item.code);
        }

        // console.log(this.expandedKeys, "expandedKeys");
      }
    },
  },
};
</script>

<style lang="scss" scoped>
.tree-item {
  cursor: pointer;
  .item-title {
    padding: 4px 8px;
    &:hover {
      background: #eee;
    }
  }
  .item-childen {
    padding-left: 20px;
  }
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值