【uni-app】解决scroll-view中内嵌input真机卡顿问题

在开发微信小程序时,scroll-view组件中会嵌套多个input组件,在真机测试上会出现页面卡顿问题,这属于微信小程序底层问题,目前没有很好的解决方案。因此,需要从另一个角度解决问题,例如,在开发购物车时数量使用view或text组件包裹,点击数量时将text组件替换成input组件,当输入完成后,再将input组件替换成text组件,即可解决问题

<template>
  <view class="content">
    <view class="page">
      <scroll-view class="scroll" scroll-x="true">
        <view class="item" v-for="(item, index) in items" :key="index">
          <view class="title">{{ item.title }}</view>
          <view class="amount-wrap">
            <view class="amount-wrap-title">数量:</view>
            <view class="amount-wrap-amount">
              <!-- 如果isInput的值为false,则显示text组件,隐藏input组件 -->
              <text class="amount-wrap-text" v-if="!item.isInput" @click="showInput(index)">
                {{ item.amount }}
              </text>
              <input
                v-else
                v-model="item.amount"
                :focus="true"
                @blur="hideInput(index)"
              />
            </view>
          </view>
        </view>
      </scroll-view>
    </view>
  </view>
</template>

<script>
export default {
  name: "cart",
  data() {
    return {
      items: [
        {
          title: "JavaScript",
          amount: 1,
          isInput: false,
        },
        {
          title: "Vue1",
          amount: 2,
          isInput: false,
        },
        {
          title: "Vue2",
          amount: 3,
          isInput: false,
        },
        {
          title: "Vue3",
          amount: 4,
          isInput: false,
        },
        {
          title: "Vue4",
          amount: 5,
          isInput: false,
        },
        {
          title: "Vue5",
          amount: 6,
          isInput: false,
        },
        {
          title: "Vue6",
          amount: 7,
          isInput: false,
        },
        {
          title: "Vue7",
          amount: 8,
          isInput: false,
        },
        {
          title: "Vue8",
          amount: 9,
          isInput: false,
        },
        {
          title: "Vue9",
          amount: 10,
          isInput: false,
        },
        {
          title: "Vue10",
          amount: 11,
          isInput: false,
        },
      ],
    };
  },
  methods: {
    // 显示input组件
    showInput(index) {
      this.items[index].isInput = true;
      // 使用$set解决改变值视图不渲染的问题
      this.$set(this.items, index, this.items[index]);
    },
    // 隐藏input组件
    hideInput(index) {
      this.items[index].isInput = false;
      // 如果不填内容,则默认为0
      if(!this.items[index].amount){
        this.items[index].amount = 0
      }
      this.$set(this.items, index, this.items[index]);
    },
  },
};
</script>

<style scoped lang="scss">
.page{
  padding: 30rpx;
}
.item{
  margin: 20rpx 0;
}
.amount-wrap{
  display: flex;
  width: 100%;
}
.amount-wrap-title{
  width: auto;
}
.amount-wrap-amount{
  min-width: 70%;
}
.amount-wrap-text{
  padding: 0 30rpx 0 0;
}
</style>


注意,一定要使用v-if,不要用v-show,因为v-if不会将元素渲染到视图中。由于scroll-view组件内部并没有input组件,因此不会卡顿。还要注意的是,这里的input不是HTML的input元素,而是uni-app的input组件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值