| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | <template>  <van-popup class="search-data-popup" round lazy-render v-model="show" position="bottom" >    <div class="header-line">      <div class="cancel" @click="onSearchCancel">取消</div>      <div class="title">{{ title }}</div>      <div class="sure" @click="onSearchConfirm">确定</div>    </div>    <van-search v-if="showSearch" placeholder="输入您想搜索的内容" v-model="searchValue" @input="inputSearchValue" /><!--    <div class="tip">已选{{temp_datas.length}}条</div>-->    <div v-if="itemList?.length >0"  class="lists">      <div  class="line" v-for="(item, index) in itemList" :key="item[valueKey]">        <van-cell          clickable          :key="item[valueKey]"          :title="item[valueKey]"          @click="click(item,index)">          <template #right-icon>            <van-checkbox v-model="item.checked"/>          </template>        </van-cell>      </div>    </div>    <div v-else class="lists">      <van-empty description="暂无数据" />    </div>  </van-popup></template><script>export default {  props: {    showPicker: {      types:Boolean,      default:false    }, //是否显示    options: {      type:Array,      default: ()=>[],    }, //未根据搜索内容筛选的所有列表数据    value: {      type:Array,      default: ()=>[],    },//默认选中数据    //自定义字段    valueKey:{      type: String,      default:'label'    },    showSearch:{      type:Boolean,      default:true    },    title: String //标题  },  data(){    return {      searchValue: "", //搜索框内容      itemList:[],    }  },  watch:{    temp_datas:{      handler(val){        this.itemList = val;      },      deep:true    },  },  computed: {    columns(){      return this.options    },    temp_datas(){      this.columns.forEach(v=>{        this.value.forEach((item)=>{          if(v[this.valueKey] === item[this.valueKey]){            v.checked = true;          }else {            v.checked = false;          }        })      })      return this.columns    },    show:{      get(){        return this.showPicker;      },      set(){        this.$emit("cancel");      },    },  },  methods: {    click(v,i){      this.$set(this.columns[i],'checked',!this.columns[i].checked);    },    inputSearchValue(query) {      if(query == ''){return this.itemList = this.options }      //搜索框值发生改变      setTimeout(() => {        this.itemList= this.temp_datas.filter(item => {          return item[this.valueKey].indexOf(query.toLowerCase()) > -1;        });      }, 200);    },    onSearchCancel() {      //取消      this.$emit("cancel");    },    onSearchConfirm() {      let arr = this.columns.filter(v=>v.checked === true)      //确认      this.$emit("confirm", arr);      this.show = false;    },  },}</script><style scoped>.search-data-popup .tip {  color: #666;  padding-bottom: 5px;}.search-data-popup .header-line {  display: flex;  justify-content: space-between;  align-items: center;  height: 90px;}.search-data-popup .header-line .cancel {  padding: 0 30px;  font-size: 28px;  color: #969799;}.search-data-popup .header-line .title {  font-weight: 500;  font-size: 30px;  color: #343434;}.search-data-popup .header-line .sure {  padding: 0 30px;  font-size: 28px;  color: #1989fa;}.search-data-popup .lists {  display: flex;  flex-direction: column;  padding: 10px 12px 20px 12px;  min-height: 300px;  max-height: 700px;  overflow: auto;}.search-data-popup .lists .line {  line-height: 40px;  font-size: 16px;  color: #000;  display: flex;  justify-content: space-between;  align-items: center;}.search-data-popup .lists .line img {  width: 20px;  height: 20px;}</style>
 |