微信小程序开发踩坑篇

399 阅读3分钟

微信小程序踩坑篇

适合人群:初次开发小程序

观看时间:10min

文章内容:耗时排坑


  1. 数据绑定

问题描述:数据绑定时,需要对数据进行复杂处理或逻辑判断,直接在绑定数据时判断逻辑导致报错

问题原因:小程序数据绑定时不支持复杂的逻辑判断

解决方法:在绑定数据前处理好对应的数据

示例代码:节点是否选中

  /* 错误示例 */
  <view wx:for="list" wx:key="index">
      // 进行了复杂的操作将会导致报错
      {{checkeds.indexOf(item.id) > -1 ? '选中' : '未选中'}}
  </view>
  <script>
    data: {
      list: [
          {
            id: '001'
          }
      ],
      checkeds: ['001']
    }
  </script>
  /* 解决方法 */
  <view wx:for="list" wx:key="index">
      // 将判断逻辑交给数据处理
      {{item.checked ? '选中' : '未选中'}}
  </view>
  <script>
    data: {
      list: [
          {
            id: '001'
          }
      ],
      checkeds: ['001']
    },
    methods: { 
        // 重新处理数据
        reSetList() {
            this.list.map(item => item.checked = this.checkeds.indexOf(item.id) > -1)
        }
    }
  </script>
  1. 页面高度

问题描述:页面高度设置为屏幕高度,底部固定放置一按钮,内容超出页面高度后,出现按钮遮挡内容

问题原因:固定按钮脱离文档流,不在页面高度内

解决方法:将页面设置内边距(按钮的高度),并给页面设置最小高度

示例代码:按钮遮挡页面内容解决方法

  .page {
      min-height: 100vw;
      // 按钮和间距高度和
      padding-bottom: 80px;
      background: #ffffff;
  }
  .buttom {
      width: 80%;
      position: fixed;
      bottom: 20px
      height: 40px;
  }
  <view class="page">
      <button class="button">提交</button>
  </view>
  1. 覆盖第三方组件样式

问题描述:使用小程序扩展组件时样式和产品设计不一致,通过覆盖的方式修改不生效

问题原因:小程序内部控制

解决方法:根据相关组件Api来添加自定义类实现

示例代码:按钮遮挡页面内容解决方法

  .custom-class {
      .weui-cell__hd {
          max-width: 80%;
      }
  }
  // 内部提供的自定义类属性 ext-class
  <mp-cell ext-class="custom-class">
  </mp-cell>
  1. 上拉加载

问题描述:上拉加载通过合并结果的方法得到结果,通过返回此页,条件查询,上拉均会合并查询结果

问题原因:初次体验上拉考虑不足

解决方法:上拉时对比当前结果长度与总长度;查询、返回此页等初始操作,均置空数据,页码归1

示例代码:获取某日志列表

  page({
    data: {
      logList: [],
      page: 1,
      total: 0
    },
    // 重新接入界面
    onShow: {
      this.resetGetLogs()
    },
    methods: {
      // 置空数据,页码归1
      resetGetLogs() {
        this.page = 1
        this.logList = []
        this.getLogList()
      },
      getLogList() {
        getLogListApi({
          page: this.page,
          filter: this.filter
        }).then((res) => {
          // 上拉合并结果
          this.logList = this.logList.concat(res.data)
        })
      },
      // 上拉加载
      onReachBottom() {
        // 比当前结果长度与总长度
        if (this.logList.length < this.total) {
          this.page = this.page + 1
          this.getLogList()
        }
      }
    }
  })
  1. Api - showToast 显示消息提示框

问题1:icon仅支持 success 和 loading

问题2:显示消息提示框后返回上个页面提示立即消失

解决方法:icon支持本地image路径; 先进行路由返回,后显示提示框

  1. 嵌套循环

问题描述:当出现嵌套循环时item/index会产生混淆

问题原因:文档掌握不足

解决方法:自定义item/index别名

示例代码:循环展示某2层菜单

  <view wx:for="{{menuList}}" wx:key="index">
    <text>{{item.title}}</text>
    // 自定义item/index名
    <view wx:for="{{item.children}}" wx:for-item="childItem" wx:for-index="childIndex">
      <text>{{childItem.title}}</text>
    </view>  
  <view>
    data: {
      menuList: [
        title: '一级菜单',
        key: '001',
        children: [
          {
            title: '二级菜单',
            key: '001001'
          }
        ]
      ]
    }

如果文章对你有帮助,点赞支持哦,文章同步公众号~

本文使用 mdnice 排版