资讯详情

微信LV项目(全流程)

打开WX开发人员工具不使用模板

效果展示

一、创建页面

在app.json配置lv-list页面、和lv-like页面,header头部组件、menu喜欢的包装组件

二、在lv-list下创建.js手写文件数据

// CommonJS模块语法 module.exports = [{   id: '001',   img: 'https://secure.louisvuitton.cn/images/is/image/lv/1/PP_VP_AS/路易威登--M20761_PM2_Front view.jpg?wid=555&hei=555',   name: 'RED 挎包',   price: '13566' }, {   id: '002',   img: 'https://secure.louisvuitton.cn/images/is/image/lv/1/PP_VP_AS/路易威登--M20379_PM2_Front view.jpg?wid=555&hei=555',   name: 'BLUE 挎包',   price: '16566' }, {   id: '003',   img: 'https://secure.louisvuitton.cn/images/is/image/lv/1/PP_VP_AS/路易威登--M20379_PM2_Front view.jpg?wid=555&hei=555',   name: 'WHITE 挎包',   price: '24566' }]; 

三、封装头部组件

<!-- header组件wxml页面 --> <view class="header">  <button class="btn nav"></button>  <button class="btn" data-type="like" bindtap="go"></button>  <view class="logo"  data-type="list" bindtap="go"></view>  <button class="btn"></button>  <button class="btn"></button> </view> 

.header {   display: flex;   justify-content: space-between;   height: 100rpx;   padding: 0 27rpx;   border-bottom: 3rpx solid #e3e2dd; } .header .btn {   width: 72rpx;   height: 100%;   padding: 0;   background-repeat: no-repeat;   background-position: center;   background-size: 45.3rpx; } .header .nav {   background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsSAAALEgHS3X78AAAATElEQVRo3u3WIQ6AMBAEwIJF1fX/r8Oh0PQJh2hyl2ZGr9h12xoAQDnHn9Do15dZ8n7esOeZWXAlQwBgJ75WNYYAwE58rWoMAQAgNAE5UwwWx5fWLgAAAABJRU5ErkJggg==); } .header .like {   background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsSAAALEgHS3X78AAAD10lEQVRo3u2YW0wTWRzGP7YmSioYHjbBywOxUtHqQlssVFoaRZGSFblUQZFdRRONoiLRDRKrhA1EiURUDC4EDVEMSlayZDEYr1EjCF4KUkAttAUk kQg sI2HB/IHN1V6Ex3BomZX9KHtud/vu87/zlz2gFERERERERERESEwsvTwms1V4i1vQ3W9nZY219AIpFApQ7FgkA5YoxGqJaFf3Vuy7MW8ufVq jq7EBnhxX/uFwICAiANkKHdQmJUKo1HnvizIH9e4i/n3TCV1qKify3Lu9IDpk/98cJ63J yyI9tpeEqydO6Z2O7tHsA1led2/fAgDIZIFYGhyMMO1ySCQSPG58hMdNjejv6wUA PjOwmvngBcApKdtJNf/rgMA M eA5U6FBH6SMyYMR1PWlrwpKUZr192AQAC5UEo aMMwSFq/rszPDQojdJr6cqdPlk47qplZuyk4 Jjo0l62kb6vqKsdNy6kyeO0XFRei0ZHhqU8h6kpLiIily eMFt62821H9x2bDRuVRZQceXFBdxvsQmZKC/164JURB/PynJzNjJevITx/OpKXP2QdZ1TEc1IQoy0N9r5y1IQd5Raqi58SGnVdKHqckKXRinmubGh1Sv4PdcVrU/sBn0pr8PABAdEwuNVsdpAyaYTEgybeC0cBqtzisqeg0AwGnvYVXDKojDMdbdoEWLORkCgE2paffXJ6fUcq2TyRb8S9sd09gM6rF1AwDkCxdyDuI/Z56BcxGAxYolY0Hs7IKw6oiPrw8AwOVyeeLJI0ZGRgAA3t7e/AXRRY4talurZdKCWJ4/AwCo1KH8BQkOUQIAmpuaJi1Im8UCAFCq1PxN6rDbRn8Kkrk9mfmioqzU49u9W5izRB uJl0dVsHCOOy2UcPyZZwPX04CTFfiY6MFC7Lt11ThusFQfu4sFdmSmsy7yOe/INie6B6TtXcXFcs9nM2bWOX58k8h8o4Kvg8BABsS1lLRhvq//rforRvXBe30hGxOSaLi1VWVHosXFRbQeVYbIiY3BMO 3TuoiaLCAs4mtm/5tLGT1hq/TQiG9F82UTMZO7aRd28HzrmrcTq6R01xsbRu6 aUbxuCIT/XTE3FREWS2zcbxjX24N4dslIXTsfn55qnRgiGmuoqolTIqcG8IzlfGCw9U0y/VyrkpKa6amqFYGi1PCXJiXHU7JoVOmJ71Un6nPb36 N/pp8nJ8aRVsvTqRnic8yHDo773Mp8iP1/9ylBfV0tMa4y0ADGVQZSX1crWAhBH08ODw1KS04VvweAjH2ZM31n X0QUk9ERERERETke Ej0OrjZL5v2F8AAAAASUVORK5CYII=); } .header .user {   background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsSAAALEgHS3X78AAADd0lEQVRo3u2XXUhTYRjH/0ZZ27oRp4hu2VbpyjGTpaAUKoofCZF5UYiBgWEomhb5AQNBMAwpsfRCuugiEUT8QPyOIVLOUaBOLXNZdDbvOsMEO1I3bzftlbV0S8/ZdnF sIvxPh/v//14nvcAIiIiIiIi ydIiKAOlt161vZEtvJ GR WlwEA57RanI3TouLuvR hcvlxfwv3iNk0QzRqJYkIkf3zp1Eridk0Q/jOy uO9HR3kbvlpfS/UhmN5IuXAACzb17DbmfoWFtHJ64XFglyIg6EjWGIOiqcrnzt/Sq3Va 9X0XH1VHhxMYwvO/MgWlsMNBJTk8Zd53g9JSR2jU2GHgTcoivQJ9WVwEAGVk5SE3P2PXIpKZnBGVk5bj4BJSQRcs8AECpPOHR1mnj9AkoIf6GNyG6 AQAgN1u82jrtHH6BJSQM7GxAADj5Dgs83O7XmLL/BwxTo67 AQUf5ffocF NzFDg/2ClV9BG2J2bh6U0ScBAHbmKybGRuhYwDZEJ/56ogiCg2W3DHUPSFpKEhWQlpJEDHUPiINlt/w9v31hYxifPEV4P6Mcx VPjI30L1oW4GBZONhvAIBQeRhC5XLo4s8jOzfvmlQqHQhIIdNTRtLd9RKTYyPY3ub2tJVIpMjKzUNh0c09nzM FbK bicdT1vx4nmn21hw8FGoT50GAHz5vIZfv3662dy6XYryymooFEr/VTDjqwmSrNfRC63Xakh7WysZHx0ma1ar271Ys1rJ OgwaW9rJXqthvol3XE+GrCP5XMUF/jUlbvlBT/V0VysOzWnZJilxiG+hrfiqmuKNvpCyrFgfqC2TRDNCoFjVddUeYbMQN9vTRpQlwMb0kT4mJo3IG+XmHFcByXn5maQhPy2R9sDEPjZqamEI7j8gUT0tLcRJP1dHfxvmo93V00fktzkzC7smRZIKrIMBIRIiOVZaWCbX1lWSmJCJERVWQYWbIseJ3H6+8R86yJNrrMrGyhdCA79zIAYHubg3nW5LWf10LevTUDAI5JJNAnJgkmRH8hCRKJ1CUnr8T+KZEFV/IEL483Cq6SiBAZiVUp+D1aNoYhm983AAAXBNwNJ/rERADA5vcNeFsZD3tjZP24suNw5DAEqygech9YyOrqTrDHjx76SoNb7r3w6mhxHOeNmSD4M7eIiIiIiIiIv/gN2k+6D8b3VfgAAAAASUVORK5CYII=);
}
.header .cart {
  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsSAAALEgHS3X78AAAD+klEQVRo3u1YXWhTZxh+upykrLFq+qMRu+Y0J7ZJ2to2pXVWmIo/lGJ1FGRlUArbRd2kXZ2KoyL1X+aso3ijKMKuRCh1bqyWeGGhFWHixI21yck5SdPdCOsPNC30pBfHi5DTw+rM9zU5qRfngQPfyXnf73uf9+d7XwLo0KFDhw4dK0eGFptOhMPys6fDeDoyjGcjw2CMDHbv3Y+Pt9ehuqYWmzcXaHJuSvHT3Tuy1WJ+53P39i051eem1DNXLp6Te3uuAgAsOblwbClGidMFhmHg942B9/swNfkvAOCr9k50n7/0/kWm7ctWxePfdhz9X49/c/SIItf2RWvKI5MU+u7fU4y70H0moXFnz3Qp8n33770fZKSFhfJ9O3fIVotZbmk+TGxUS/Nh2Woxy/t27pClhYXy1eaB3uvXFO96BweIiXgHBxS93uvXVj8qez6po45GHOqoJGvHB8koR2Znb4aCAgCg4UAjtf7uPXsBAEFRQCQSuZksmRXjxfPflfQIBUVqr6r1X738I6moJBWRoCgo6yI7lwEAJzrbEzbErlMnZACorqlV+oio2msloG5Iv/zcL/t9Y8p7z/eXUV5Rif31DeB9Pvz6sJ9on8ZDTSh2OvGwvw9CgMfxU13KtxKnCwc/baKyjUp4enoq5OYK2aRcR4hRYWIyJzc3n1SeKrWCopgWEgAgCoE8GnkqIiFVHg88HsLrmfkM9aNOj0Q43X1+mf5v3icqp9HVDBWReEGuXbceds7x53+/n/zuNFGqbq2oQnvn8WWyhSy7mGVeAwAQhIB2RIKiCAAoLnFivcVS8TaZ1zPzGZev9qC0bCuMRqPyu3lNNmq2bccPP96Ad2jkrYTz8zeYbDY2dpaQ3C32TsS7eMfXbUR3/mI0mjc2+rcs8Dxxj2j9/DPZajHLu+pqqfoKQyooSZJtS+EmAICdcxDpGE2mSVDejIUsCyBWI5Ik2TIzM8MkesSpFRKF8WhUAgBwHEdjGxXiqRWNShB4/zipHjGReH0A5BFZCUqcLmUd4HliPXIiwaXis3OOJq2IVHo8txQiAX/qicS9Y2OL8GFW1gOtiGRnrz2yYaMVACBS3FzkRPw+AIDLXaYVBwU2tggAEKToJcREeD4WZldpaRqIsADoJmIiIv9MhOW5yCwAwJ2GiFRWVQMA5uciCI+HiPoJERH13ON0uzUnUuWpVtYBnqzgiYjw/qXN7JzDpDWRSo9n3RIRsiuYkEis0E2mTBgMhkWtiRgMzCzDxOY0IUBGhGhECagKvf1YfVr+uvEOPsJfr14SpxbRHOR22OTpqcl02L8MObl5GBXCCe0kSq0iu3azVSIUFHy0amfr0KFDhw4dOlYLbwCWLY6ILH/ypgAAAABJRU5ErkJggg==);
}
.header .logo {
  flex: auto;
  background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUxIiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMTUxIDE2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik02Ny42MzcuMjkzbDMuODE2IDkuMjA1TDc1LjI2OS4yOTNoMi43MjVMNzEuNzQ2IDE1LjM5bC0uMjkzLjI5NC0uMjk0LS4yOTRMNjQuOTExLjI5M2gyLjcyNnptLTEzLjcxMiAwYzEuNDY4IDAgMi44Ni43NjcgMy42MjcgMS44ODdsLTEuNDY3IDEuNDY4aC0uNDYyYy0uMzA0LS42NS0uOTczLTEuMDQ4LTEuNjk4LTEuMDQ4LS44NjMgMC0xLjY3Mi43MS0xLjcyIDEuNjE0LS4wMzUuNjguMjc3IDEuMTA1Ljg0IDEuNDY4LjYwNi4zOTEuODU0LjU1NCAxLjY3NyAxLjAwNi44OTcuNDkzIDMuMTY2IDEuNDYgMy4xNjYgNC4wMDUgMCAyLjUwOS0yLjA5NyA0Ljg0My00LjgwMiA0Ljg0My0uMzQ3IDAtLjk3Ni0uMDM5LTEuNDQ2LS4xNDctMS4zMjUtLjMyMS0yLjEyOS0uODIyLTIuOTk4LTEuODQ1bDEuODg3LTEuOTI5LjY1LjU0NWMuMjkzLjIzLjkzNy42OTMgMS41NS43NzYgMS4yNDYuMTY5IDIuMDgyLS42NTUgMi4yNDQtMS40NjguMTI5LS42NDItLjAzNC0xLjYtMS4wNjktMi4wOTYgMCAwLTEuODY2LTEuMDM3LTIuNjg0LTEuNTEtLjgzMy0uNDgyLTEuNzE5LTEuNzk4LTEuNzE5LTMuMzc1IDAtMS4xNzQuNTM4LTIuMzExIDEuNDA1LTMuMTAzLjY3LS42MTQgMS41ODktMS4wOSAzLjAxOS0xLjA5ek0xMzguNjcgMGw5Ljc3IDkuNzdWLjU4N2wuMjk0LS4yOTRoMS45MjlsLjI5NC4yOTR2MTQuODAyaC0uNDYybC05LjYwMi05LjYwMnY5LjMwOWwtLjI5NC4yOTNoLTEuOTI5bC0uMjkzLS4yOTNWLjI5M0wxMzguNjcgMHptLTI4LjgwNy4yOTN2Mi4yMjNsLS4yOTQuMjkzaC0yLjIyMnYxMi41OGgtMi41MTZWMi44MDloLTIuNTE2Vi41ODdsLjI5NC0uMjk0aDcuMjU0em05LjIyNSAwdjIuMjIzbC0uMjk0LjI5M2gtMi4yMjJ2MTIuNThoLTIuNTE2VjIuODA5aC0yLjUxNlYuNTg3bC4yOTQtLjI5NGg3LjI1NHpNMi41MTYuMjkzdjEyLjU4aDUuMDMydjIuNTE2SDBWLjU4N0wuMjkzLjI5M2gyLjIyM3ptMTQuMjU3IDBhNy41NDggNy41NDggMCAxMTAgMTUuMDk2IDcuNTQ4IDcuNTQ4IDAgMDEwLTE1LjA5NnptMTExLjU0IDBhNy41NDggNy41NDggMCAxMTAgMTUuMDk2IDcuNTQ4IDcuNTQ4IDAgMDEwLTE1LjA5NnptLTk4LjQxNSAwbC4yOTMuMjk0djkuNzdhMi41MTYgMi41MTYgMCAwMDUuMDMyIDBWLjU4N2wuMjk0LS4yOTRoMS45MjlsLjI5My4yOTR2OS43N2E1LjAzMiA1LjAzMiAwIDAxLTEwLjA2NCAwVi41ODdsLjI5NC0uMjk0aDEuOTI5em0xNS4zODkgMHYxNC44MDNsLS4yOTQuMjkzaC0yLjIyMlYuNTg3bC4yOTMtLjI5NGgyLjIyM3ptMzcuNDQ2IDBsLjI5My4yOTR2OS43N2EyLjUxNiAyLjUxNiAwIDAwNS4wMzIgMFYuNTg3bC4yOTQtLjI5NGgxLjkyOGwuMjk0LjI5NHY5Ljc3YTUuMDMyIDUuMDMyIDAgMDEtMTAuMDY0IDBWLjU4N2wuMjk0LS4yOTRoMS45Mjl6bTE1LjM4OSAwdjE0LjgwM2wtLjI5NC4yOTNoLTIuMjIyVi41ODdsLjI5My0uMjk0aDIuMjIzek0xNi43NzIgMi44MWE1LjAzMiA1LjAzMiAwIDEwLjAwMSAxMC4wNjUgNS4wMzIgNS4wMzIgMCAwMDAtMTAuMDY1em0xMTEuNTQxIDBhNS4wMzIgNS4wMzIgMCAxMDAgMTAuMDY1IDUuMDMyIDUuMDMyIDAgMDAwLTEwLjA2NXoiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPjwvc3ZnPg==) no-repeat center center / 210rpx;
}

.header .tag {
  width: 23rpx;
  line-height: 23rpx;
  margin: 25rpx 0 0 50rpx;
  border-radius: 50%;
  background: #372d24;
  color: #fff;
  text-align: center;
  font-size: 14rpx;
  overflow: hidden;
}

// 页面用Page方法定义,组件用Component定义
// 组件需要在json文件中设置"component": true
Component({
  // 组件的自定义属性,外部传入的
  properties: {
    count: {
      type: Number, // 数据类型 String、Boolean、Object、Array
      value: 0 // 默认值
    }
  },

  // 组件的内部数据,内部自己使用
  data: {

  },

  // 组件的方法列表
  methods: {
    go(event) {
      // getCurrentPages方法获取所有页面栈,相当于历史记录
      const pages = getCurrentPages();
      // 页面栈中最后的元素是最新的/当前的页面,navigateTo访问新页面会入栈相当于push,返回旧页面会出栈相当于pop
      const currentPage = pages[pages.length - 1];
      // 获取当前页面的路径
      const { route } = currentPage;
      // 收藏按钮有子元素,target可能是子元素
      const { type } = event.currentTarget.dataset;
      // 判断要跳转的路径是当前页面,就不跳了
      if (route.includes(type)) return;
      wx.navigateTo({
        url: `/pages/lv-${type}/lv-${type}`
      });
    }
  }
})

  "usingComponents": {
    "header":"/components/header/header",
    "menu":"/components/menu/menu"
  }

四、lv-list 页面

lv-list wxml页面
<!-- 所有包标题 -->
<view class="title">
  <view class="name">所有包款</view>
  <view class="filter" bindtap="showMenu">显示筛选器</view>
</view>

.js结构
showMenu(){
  console.log('showMenu');
  this.setData({
    show: true
  })
},

wxml页面
<wxs module="wxs">
function some(arr,id){
	return arr.some(function(i){
		return i.id === id
	})
}
module.exports={
	some:some
}
</wxs>
<!-- 包包列表 -->
<view class="list">
	<view class="item" wx:for="{
    
      {list}}" wx:key="id">
		<image src="{
    
      {item.img}}" mode="aspectFit"></image>
		<view class="name">{
    
      {item.name}}</view>
		<view class="price">{
    
      {item.price}}</view>
		<button
			class="{
    
      {wxs.some(likeList,item.id ) ? 'checked':''}}"
			data-id="{
    
      {item.id}}"
			bindtap="toggle"
		></button>
	</view>
</view>
.js结构

const list = require('./list.js')//导入数据

data:{
    list,//挂载到页面上
    likeList:[], //存放当前下标
},
// onLoad在navigateBack回来时不会执行,返回来时只执行onShow
// 本页面通过navigateTo跳转到别的页面时,本页面不会销毁/不执行onUnload,只执行onHide
onShow(){
  wx.getStorage({ //从本地缓存中异步获取指定 key 的内容
    key:'like-list',
    success:({data}) =>{
      this.setData({
        likeList:data 
      })
      console.log(data);
    }
  })
},
toggle({target}){
  const  {id}  = target.dataset //获取当前事件的id
  const index = this.data.likeList.findIndex(i => i.id === id)
  //判断likeList中有没有,有就删,没有就把list的下标添加到likeList
  if(index === -1){
    this.data.likeList.push(this.data.list.find(i => i.id === id))
  }else{
    this.data.likeList.splice(index,1)
  }
  this.setData({
    likeList:this.data.likeList //把新的下标赋值到定义的字段中
  })
  wx.setStorageSync('like-list',this.data.likeList) //将数据存储在本地缓存中指定的 key 中
},

五、lv-like 页面

wxml页面 可以直接把list页面的包包结构拿过来使用 更新data数据中定义的字段即可likeList
注意添加新的删除事件
<header count="{
    
      {likeList.length}}"/>

<view class="list">
	<view class="item" wx:for="{
    
      {likeList}}" wx:key="id">
		<image src="{
    
      {item.img}}"></image>
		<view class="name">{
    
      {item.name}}</view>
		<view class="price">{
    
      {item.price}}</view>
		<!-- data-index="{
    
      {index}}"绑定当前 -->
		<button
			data-index="{
    
      {index}}"
			bindtap="del"
		>×</button>
	</view>
</view>
.js结构 
Page({
  data:{ 
    likeList:[]
  },
  onShow(){//监听页面显示
    //this指向问题,1.把外面的this定义成变量使用
    const self = this;
    wx.getStorage({
      key:'like-list',
      success({data}){
        self.setData({
          likeList:data
        })
      }
    });
    
  },
  //弹框是否删除
  del({target:{dataset:{index}}}){
    wx.showModal({
      title: '将此内容从您的愿望录中移除',
      content:'请确认是否将此内容从您的愿望录中移除取',
      confirmText:'删除',
      success:({confirm})=>{ //confirm 为 true 时,表示用户点击了确定按钮
        if(!confirm) return // 点击取消false就return
        this.data.likeList.splice(index,1) //否则就删除当前下标的数据
        this.setData({
          likeList:this.data.likeList // 更新当前数据状态
        });
        wx.setStorageSync('like-list', this.data.likeList)
        // wx.setStorageSync将数据存储在本地缓存中指定的 key 中。
        //会覆盖掉原来该 key 对应的内容。
        //除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。
      },
    })
  }
})

 六、右侧筛选器

<!-- 右侧筛选器 -->
wxml 页面
<menu 
	show="{
    
      {show}}"
	bind:close = "closeMenu"
	bind:filter = "filter"
/>
.js 结构
// 右侧筛选器
closeMenu(){ //初始为false
  console.log('closeMenu');
  this.setData({
    show:false
  })
},
filter({detail}){
  console.log(Object.values(detail).flat().filter(i => i.checked).map(i => i.label));
}

wxml页面
<wxs module="seec">
function checkedLength(arr) {
  return arr.filter(function(i) {
    return i.checked;
  }).length;
}
module.exports = {
  checkedLength: checkedLength
};
</wxs>

<page-container
  show="{
    
      {show}}"
  position="right"
  bind:afterleave="close"
>
  <view class="top">
    <view class="title">
      显示筛选器
      <block wx:if="{
    
      {seec.checkedLength(formData.category) + seec.checkedLength(formData.color) > 0}}">
        ({
    
      {seec.checkedLength(formData.category) + seec.checkedLength(formData.color)}})
      </block>
    </view>
    <view class="reset">重置所有筛选</view>
    <button bindtap="close">X</button>
  </view>

  <view class="category-list">
    <view class="title">
      目录
      <block wx:if="{
    
      {seec.checkedLength(formData.category) > 0}}">
        ({
    
      {seec.checkedLength(formData.category)}})
      </block>
    </view>
    <view
      class="category-item"
      wx:for="{
    
      {formData.category}}"
      wx:key="label"
      data-index="{
    
      {index}}"
      data-type="category"
      bindtap="toggle"
    >
      <view class="checkbox{
    
      {item.checked ? ' checked' : ''}}"></view>
      <text>{
    
      {item.label}}</text>
    </view>
  </view>

  <view class="color-list">
    <view class="title">
      颜色
      <block wx:if="{
    
      {seec.checkedLength(formData.color) > 0}}">
        ({
    
      {seec.checkedLength(formData.color)}})
      </block>
    </view>
    <view
      class="color-item"
      wx:for="{
    
      {formData.color}}"
      wx:key="label"
      style="border: 1px solid {
    
      {item.checked ? '#000' : '#ccc'}}"
      data-index="{
    
      {index}}"
      data-type="color"
      bindtap="toggle"
    >
      <image class="img" src="{
    
      {item.img}}" mode="aspectFill" />
      <text>{
    
      {item.label}}</text>
    </view>
  </view>

  菜单内容
</page-container>
// components/menu/menu.js
Component({
  properties:{
    show:{
      type:Boolean,
      value:false
    }
  },
  data:{
    formData:{
      category: [{
        label: '斜跨包',
        checked: false
      }, {
        label: '手提包',
        checked: false
      }],
      color: [{
        label: '橙色',
        img: 'https://www.louisvuitton.cn/images/is/image/MAC-Z10_orange?wid=216&hei=216',
        checked: false
      },{
        label: '蓝色',
        img: 'https://www.louisvuitton.cn/images/is/image/MAC-Z04_bleu?wid=216&hei=216',
        checked: false
      }]
    }
  },
  methods:{
    close(){
      // 组件内部不允许修改properties
      // 子组件给父组件传值
      // triggerEvent派发/触发/发送/给/送出去 一个自定义事件
      this.triggerEvent('close');
    },
    toggle({ currentTarget }){
      const { index, type }= currentTarget.dataset;
      this.data.formData[type][index].checked = !this.data.formData[type][index].checked;
      this.setData({
        formData: this.data.formData
      });
      this.triggerEvent('filter', this.data.formData);
      //setData应只传发生变化的数据,减少数据通信量,小程序逻辑层和视图层分开
      //https://developers.weixin.qq.com/miniprogram/dev/framework/performance/tips/runtime_setData.html
       // this.setData({
      //   [`formData.${type}[${index}].checked`]: this.data.formData[type][index].checked
      // });
    }
  }
})
.top {
  display: flex;
}

.category-list, .color-list {
  margin: 50rpx 30rpx;
  border-top: 1px solid #333;
}
.color-list {
  display: flex;
  flex-wrap: wrap;
}
.color-item {
  width: 150rpx;
  height: 250rpx;
  margin: 10rpx;
  padding: 10rpx;
}
.color-item .img {
  width: 130rpx;
  height: 130rpx;
}

.category-list .checkbox {
  position: relative;
  width: 50rpx;
  height: 50rpx;
  margin-right: 10rpx;
  border: 5rpx solid #333;
}
.category-list .checkbox.checked:after {
  content: "";
  position: absolute;
  width: 30rpx;
  height: 20rpx;
  border-left: 5rpx solid #333;
  border-bottom: 5rpx solid #333;
  transform: rotate(-40deg) translate(5rpx, 5rpx);
}
.category-item {
  display: flex;
  padding: 5rpx 0;
}

标签: ikw40n120h3晶体管接近传感器lja12m接近传感器lja71m

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台