フロントエンド-「WeChatアプレットシティの複数選択グループ化コンポーネントの最適化

 

 

 


 このコンポーネントの元のリンクは次のとおりです:https//blog.csdn.net/NAMECZ/article/details/80254178#comments_12281606

最適化の内容:

1:コンポーネントデータが空白でロードされます

2:組み合わせ件报错:タグ名セレクター、IDセレクター、属性セレクターなど、一部のセレクターはコンポーネントwxssで許可されていません。

3:コンポーネントスタイルの調整

4:this.setData({"component data":[]})を使用して、コンポーネントの呼び出しページでコンポーネントに値を割り当てます。それに応じて、コンポーネントの値を動的に変更することはできません。

5:[戻る]をクリックしてコンポーネントを再度開くと、最後にチェックしたデータをリセットできません

6:[戻る]をクリックした後、コンポーネント関連のオプションボックスのチェックを外します

主な最適化されたコンポーネントコードは次のとおりです

  • js:clear()、loadAgin()メソッドを追加し、back()メソッドを変更します
    Component({
      properties: {
        list: {
          type: Array,
          value: [],
        },
        select:{
          type: Array,
          value: [],
        }
      },
      data: {
        childlist: [], 
        n: 0,
        checked: [],
        allNum: [],
      },
      ready(){
        var that=this;
        var list = that.data.list;//传递过来的数据
        var select = that.data.select;
        var checked = new Array;
        var allNum = []; 
          var aaa = [];
          // 检查默认选中状态
          for (let i = 0; i < list.length; i++) {
            for (let k = 0; k < list[i].childlist.length; k++) {
              for (let j = 0; j < select.length; j++) {
                if (list[i].childlist[k].value == select[j]) {
                  aaa = [];
                  // 若某条二级数组中存在多个选中的项要做判断筛选
                  if (checked[i]) {
                    // check中第i项如果存过值,那么将在此项中继续加入值
                    checked[i].forEach(function (item) {
                      aaa.push(item);
                    })
                    aaa.push(list[i].childlist[k]);
                    checked[i] = aaa;
                  } else {
                    // check中第i项没有存过值,那么将值存入第i项
                    if (list[i].childlist[k].istitle == "全部") {
                      for (let s = 0; s < list[i].childlist.length; s++) {
                        list[i].childlist[s].checked = true
                        allNum[i] = list[i].childlist.length - 1;
                        checked[i] = [list[i]];
                      }
                    } else {
                      checked[i] = [list[i].childlist[k]];
                    }
     
                  }
                  list[i].childlist[k].checked = true;
                }
              }
            }
          }
        that.setData({
          'childlist[0]': list[0].childlist,
          list: list,
          checked: checked,
          allNum: allNum,
        })
      },
      methods: {
        ontap(e) {
          console.log(e)
          var that = this;
          var n = e.currentTarget.dataset.index;
          var childlist = "childlist[" + n + "]";
          that.setData({
            [childlist]: that.data.list[n].childlist,
            n: n
          })
        },
        // 清空已经选择的选项
        clear(){
          var afterClearList = this.data.list;
          for (var i = 0; i < afterClearList.length; i++) {
            var citylist=afterClearList[i].childlist;
            for(var j=0;j<citylist.length;j++){
              delete citylist[j].checked;
            }
          }
          this.setData({
            'childlist[0]':[],
            checked: [],
            allNum: [],
            list:afterClearList,
          })
        },
        // 在被调用的页面的select属性重新赋值后调用这个方法刷新所选项
        loadAgin(){
          var a={currentTarget:{dataset:{index:0}}};
          this.ontap(a);
          var that=this;
          var list = that.data.list;//传递过来的数据
          var select = that.data.select;
          var checked = new Array;
          var allNum = []; 
            var aaa = [];
            // 检查默认选中状态
            for (let i = 0; i < list.length; i++) {
              for (let k = 0; k < list[i].childlist.length; k++) {
                for (let j = 0; j < select.length; j++) {
                  if (list[i].childlist[k].value == select[j]) {
                    aaa = [];
                    // 若某条二级数组中存在多个选中的项要做判断筛选
                    if (checked[i]) {
                      // check中第i项如果存过值,那么将在此项中继续加入值
                      checked[i].forEach(function (item) {
                        aaa.push(item);
                      })
                      aaa.push(list[i].childlist[k]);
                      checked[i] = aaa;
                    } else {
                      // check中第i项没有存过值,那么将值存入第i项
                      if (list[i].childlist[k].istitle == "全部") {
                        for (let s = 0; s < list[i].childlist.length; s++) {
                          list[i].childlist[s].checked = true
                          allNum[i] = list[i].childlist.length - 1;
                          checked[i] = [list[i]];
                        }
                      } else {
                        checked[i] = [list[i].childlist[k]];
                      }
                    }
                    list[i].childlist[k].checked = true;
                  }
                }
              }
            }
          
          that.setData({
            'childlist[0]': list[0].childlist,
            list: list,
            checked: checked,
            allNum: allNum,
          })
        },
        all() {
          var that = this;
          var n = that.data.n;
          var childlist = "childlist[" + n + "]";
          var checked = "checked[" + n + "]";
          var allNum = "allNum[" + n + "]";
          var all = "";
          var checkArr = [];
          var checkboxItems = that.data.childlist[n];
          if (checkboxItems[0].checked) {
            checkboxItems[0].checked = true;
            checkArr = [];
          } else {
            checkboxItems[0].checked = false;
            // checkArr.push(checkboxItems[0])
            checkArr.push(that.data.list[n])
            all = checkboxItems.length - 1;
          }
          checkboxItems[0].checked = !checkboxItems[0].checked
          for (let k = 1; k < checkboxItems.length; k++) {
            checkboxItems[k].checked = checkboxItems[0].checked;
          }
     
          that.setData({
            [childlist]: checkboxItems,
            [checked]: checkArr,
            [allNum]: all ? all : 0,
          }, function () {
            console.log(that.data.checked);
          })
        },
        checkboxChange(e) {
          var that = this;
          var n = that.data.n;
          var checkboxItems = that.data.childlist[n];
          var values = e.detail.value;
          console.log("checkboxChange");
          console.log(values);
          var flag = "";
          var childlist = "childlist[" + n + "]";
          var checked = "checked[" + n + "]";
          var allNum = "allNum[" + n + "]";
          var checkedArr = [];
          var all = "";
     
          for (var i = 0, lenI = checkboxItems.length; i < lenI; ++i) {
            checkboxItems[i].checked = false;
            for (var j = 0, lenJ = values.length; j < lenJ; ++j) {
              if (checkboxItems[i].value == values[j]) {
                checkboxItems[i].checked = true;
                checkedArr.push(checkboxItems[i]);
                break;
              }
            }
          }
          if (values.length == checkboxItems.length - 1) {
            checkboxItems[0].checked = true;
            // checkedArr = [checkboxItems[0]];
            checkedArr = [that.data.list[n]];
            all = checkboxItems.length - 1;
          }
          this.setData({
            [childlist]: checkboxItems,
            [checked]: checkedArr,
            [allNum]: all
          });
        },
        formSubmit: function (e) {
          var that = this;
          var values = that.data.checked;
          var arr = [];
          var arr1 = [];
          for (let i = 0; i < values.length; i++) {
            if (values[i] != undefined) {
              arr.push(values[i]);
            }
          }
     
          for (let i = 0; i < arr.length; i++) {
            for (let j = 0; j < arr[i].length; j++) {
              arr1.push(arr[i][j])
            }
          }
          var detail = arr1;//选中的值
          this.clear();
          this.triggerEvent("formSubmit", {citys:detail});
        },
        back() {
          this.clear();
          this.triggerEvent("back");
        }
      }
    })
  • wxml:

    <cu-custom bgColor="bg-gradual-blue">
    	<view slot="content">订单管理</view>
    </cu-custom>
    
    <form bindsubmit="formSubmit">
      <view class='content'>
      <!-- 一级菜单 -->
        <scroll-view class='scrollLeft' scroll-y>
          <block wx:for="{
         
         {list}}" wx:key="item">
            <view class="leftBox" catchtap='ontap' data-index='{
         
         {index}}' style='{
         
         {n==index?"border-left:8rpx solid #1aad16;color:#1aad16":""}}'>
              {
         
         {item.istitle}}
              <view class='num' hidden="{
         
         {checked[index].length>0?false:true}}">
                <text>{
         
         {allNum[index]?allNum[index]:(checked[index].length>0?checked[index].length:0)}}</text>
              </view>
            </view>
          </block>
        </scroll-view>
        <!-- 二级菜单 -->
        <scroll-view class='scrollRight' scroll-y>
          <view class="weui-cells weui-cells_after-title">
          <!-- 二级菜单中的全部选项 -->
            <label class="weui-cell weui-check__label" catchtap='all'>
              <checkbox class="weui-check" value="{
         
         {childlist[n][0].value}}" checked="{
         
         {childlist[n][0].checked}}" />
              <view class="weui-cell__hd weui-check__hd_in-checkbox">
                <icon class="weui-icon-checkbox_circle" type="circle" size="23" wx:if="{
         
         {!childlist[n][0].checked}}"></icon>
                <icon class="weui-icon-checkbox_success" type="success" size="23" wx:if="{
         
         {childlist[n][0].checked}}"></icon>
              </view>
              <view class="weui-cell__bd">{
         
         {childlist[n][0].istitle}}</view>
            </label>
            <checkbox-group bindchange="checkboxChange">
            <!-- 二级菜单中的剩余选项 -->
              <block wx:for="{
         
         {childlist[n]}}" wx:key="value">
                <label class="weui-cell weui-check__label" wx:if='{
         
         {item.istitle!="全部"}}'>
                  <checkbox class="weui-check" value="{
         
         {item.value}}" checked="{
         
         {item.checked}}" />
     
                  <view class="weui-cell__hd weui-check__hd_in-checkbox">
                    <icon class="weui-icon-checkbox_circle" type="circle" size="23" wx:if="{
         
         {!item.checked}}"></icon>
                    <icon class="weui-icon-checkbox_success" type="success" size="23" wx:if="{
         
         {item.checked}}"></icon>
                  </view>
                  <view class="weui-cell__bd">{
         
         {item.istitle}}</view>
                </label>
              </block>
            </checkbox-group>
          </view>
        </scroll-view>
      </view>
      <view class="btn-area">
        <button catchtap='back' class="back">返回</button>
        <button formType="submit" class="submit">确定</button>
      </view>
    </form>
  •  

    wxss:

    /* page{
      background: #f8f8f8;
    } */
    .content{
      position: absolute;
      top:0;
      bottom:100rpx; 
      width: 100%;
    }
    .scrollLeft{
      box-sizing: border-box;
      float: left;
      width: 25%;
      height: 100%;
      border-right: 1rpx solid #ddd;
      font-size: 35rpx;
    }
    .scrollRight{
      float: left;
      width: 75%;
      height: 100%;
    }
    .leftBox{
      position: relative;
      box-sizing: border-box;
      width: 100%;
      height: 100rpx;
      display: flex;
      justify-content: center;
      align-items:center;
      border-bottom: 1rpx solid #ddd;
    }
    .num{
      position: absolute;
      top:10rpx;
      right: 10rpx;
      width: 30rpx;
      height: 30rpx;
      display: flex;
      justify-content: center;
      align-items: center;
      background-color: #f10215;
      border-radius: 50%;
      color: white;
      font-size: 22rpx;
    }
    .rightBox{
      box-sizing: border-box;
      width: 100%;
    }
    .weui-cells {
      position: relative;
      margin-top: 1.17647059em;
      background-color: #FFFFFF;
      line-height: 1.41176471;
      font-size: 17px;
    }
    .weui-cells_after-title {
      margin-top: 0;
    }
    .weui-cell {
      padding: 10px 15px;
      position: relative;
      display: -webkit-box;
      display: -webkit-flex;
      display: flex;
      -webkit-box-align: center;
      -webkit-align-items: center;
              align-items: center;
    }
    .weui-check__label:active {
      background-color: #ECECEC;
    }
    .weui-check {
      position: absolute;
      left: -9999px;
    }
    .weui-check__hd_in-checkbox {
      padding-right: 0.35em;
    }
    .weui-icon-checkbox_circle,
    .weui-icon-checkbox_success {
      margin-left: 4.6px;
      margin-right: 4.6px;
    }
    .weui-cell__bd {
      -webkit-box-flex: 1;
      -webkit-flex: 1;
              flex: 1;
    }
    .btn-area{
      position: absolute;
      bottom: 0;
      width: 100%;
      height: 100rpx;
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-top: 20rpx;
    }
    .btn-area .back{
      width: 30%;
      height: 80%;
      color: white;
      background-color: orange;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    .btn-area .submit{
      width: 50%;
      height: 80%;
      color: white;
      background-color: #1aad16;
      display: flex;
      justify-content: center;
      align-items: center;
      margin-right: 10%;
    
    }

    上記はコンポーネントの最適化であり、以下は呼び出しのロジックです

  •  

    新しく作成されたcityjson.jsで、全国の都市をトラバースします。このjsは大きすぎるため、テキストに入れるのは不便です。ダウンロードでダウンロードできます。リンクは次のとおりです。

  • https://download.csdn.net/download/nienianzhi1744/12447981

    json呼び出し、最初にページの.jsonファイルのグループ化コンポーネントを呼び出します

    "usingComponents": {
        "check": "../components/checkGrop/checkGrop"
      }
  • js呼び出し、次にページの.jsファイル内の都市データを呼び出し、コンポーネントに適したjsonデータ形式を詳しく説明します

    const cityJson = require('../../assets/json/city.js').cityjson;
    Page({
      data: {
        StatusBar: app.globalData.StatusBar,
        CustomBar: app.globalData.CustomBar,
        gridCol: 3,
        skin: false,
        cityArray: [],
        allCitys: [],
        checkedCityName: [],
        cityListStr: null
      },
    
    // 加载城市数据
      loadCityGroup: function () {
        var provinceList = [];
        var allCityList = [];
        for (var i = 0; i < cityJson.length; i++) {
          var province = cityJson[i];
          var citys = province.city;
          var cityList = [{ istitle: "全部", value: "全部" }];
          for (var j = 0; j < citys.length; j++) {
            var cityMap = {
              istitle: citys[j].city_name,
              value: citys[j].city_name
            }
            allCityList.push(citys[j].city_name);
            cityList.push(cityMap)
          };
          var firstMap = {
            id: i,
            istitle: province.province,
            childlist: cityList
          }
          provinceList.push(firstMap);
        }
        this.setData({
          cityArray: provinceList,
          allCitys: allCityList
        });
      },
    })

     

  • wxml呼び出し:ここで、cityArrayはすべての都市データ、checkedCityNameはロード時にデフォルトで表示される選択された都市、idは必須属性、submitCityConfigModalは送信をクリックしたときのメソッド、hideCityConfigModalは戻るときのメソッドです
    <view class="padding-xl">
    			<check list="{
         
         {cityArray}}" select="{
         
         {checkedCityName}}" id="cityCheck" 
              bind:formSubmit="submmitCityConfigModal" bindback="hideCityConfigModal"></check>
    </view>

     

 上記の呼び出しが完了したら、特定のメソッドを開始します。

  1. コンポーネントを開くとき:デフォルトで値を引き出す必要がある場合は、this.setDataを介してデータ内のcheckedCityName配列に値を割り当てる必要があります。配列の形式は['Beijing'、 'Shijiazhuang']です。
  2. 割り当てが完了したら、this.selectComponent( '#cityCheck')。loadAgin()を記述して、デフォルトのデータをロードする必要があります。cityCheckは、コンポーネントによって定義されたIDです。
  3. 送信すると、e.detail.citysから今回選択された都市を取得できます。
  4. 選択したが保存されていないデータを返すときにクリアしてリセットします。この操作はコンポーネントのclear()メソッドとback()メソッドで完了しているため、手動で呼び出す必要はありません。

以上 

おすすめ

転載: blog.csdn.net/nienianzhi1744/article/details/106290367