详解mpvue中使用vant时需要注意的onChange事件的坑

如何在mpvue中使用vant组件并正确处理onChange事件,是一个容易被忽略但又十分重要的问题。以下是需要注意的要点:

问题背景

在mpvue中使用vant组件时,如v-radio-group,我们可以通过onChange事件知道用户选中了哪一个选项,组件会返回选项对应的value值。但是,在某些场景下我们需要手动清空这些选项,比如用户点击某个按钮时,我们需要将这个选项组件清空并重新渲染下一页。但是,这时候你会发现清空选项后,再次点击选项时,并没有触发onChange事件,这是什么原因呢?本文就带你解决这个问题。

解决方案

为了解决这个问题,我们需要用到一些技巧,如: 绑定触发onChange事件的input元素是否“选中”

绑定不同的v-model变量(或者通过@input事件)

绑定触发onChange事件的input元素是否“选中”

在mpvue中,触发onChange事件的组件始终是原生的input元素。我们可以使用原生checkbox或radio按钮代替vant对应的组件,当选中/取消选中这些原生按钮时,连带的input元素状态也会随之变化,从而触发onChange事件。

如果我们仍然希望使用vant组件,那么我们可以手动绑定vant组件内部的input元素来更新onChange事件。这样,在我们需要手动清空选项时,也可以手动操作input元素,从而触发onChange事件。

具体做法是:监听vant组件的change事件,在事件响应函数中手动修改组件绑定的变量值,通过v-if/v-show切换vant组件和对应的原生input元素,从而达到手动修改input元素的目的,最终触发onChange事件。

举个例子:

<template>
  <van-radio-group v-model="radioGroupSelected" :value="radioGroupSelected" @change="handleChange">
    <van-radio :name="item.value" :label="item.label" v-for="(item, index) in radioGroupItems" :key="index" />
  </van-radio-group>
</template>

<script>
export default {
  data() {
    return {
      radioGroupItems: [
        {
          label: '',
          value: ''
        }
      ],
      radioGroupSelected: ''
    }
  },
  methods: {
    handleChange() {
      // do something
    },
    clearRadioGroup() {
      // 清空选项
      this.radioGroupItems = [
        {
          label: '',
          value: ''
        }
      ];
      this.radioGroupSelected = ''; // 这里清空绑定变量的值
      this.$nextTick(() => {
        // 切换vant组件和对应的原生input元素来触发onChange事件
        // 由于小程序渲染机制的问题,更新组件状态需要$user,因此需要加一个nextTick
        this.showRadio = false;
        this.$nextTick(() => {
          this.showRadio = true;
        });
      });
    }
  }
}
</script>

绑定不同的v-model变量

还可以通过绑定不同的v-model变量,来避免onChange事件失效的问题。做法是:通过@click事件进行数据更新,从而更新组件状态,与此同时,通过计算属性计算出组件的选中状态,而不是直接暴力修改组件状态。

举个例子:

<template>
  <van-radio-group :value="radioGroupSelected">
    <van-radio v-model="radio" :name="item.value" :label="item.label" @click="radioClicked(index)" v-for="(item, index) in radioGroupItems" :key="index" />
  </van-radio-group>
</template>

<script>
export default {
  data() {
    return {
      radioGroupItems: [
        {
          label: '',
          value: ''
        }
      ],
      radioGroupSelected: '', // 绑定vant组件的选中值
      radio: '', // 单独绑定radio状态
    }
  },
  computed: {
    radioSelected: {
      get() {
        // 计算属性计算radio的选中状态
        return this.radio;
      },
      set(value) {
        // 通过点击Van-Radio修改数据并更新状态
        this.radio = value;
        this.radioGroupSelected = value;
        // do something
      }
    }
  },
  methods: {
    radioClicked(index) {
      this.radioSelected = this.radioGroupItems[index].value;
    },
    clearRadioGroup() {
      // 清空状态
      this.radioGroupItems = [
        {
          label: '',
          value: ''
        }
      ];
      this.radioGroupSelected = '';
      this.radio = '';
    }
  }
}
</script>

总结

本文提供了两种解决onChange事件失效问题的方法,并提供了两个示例供参考。当在mpvue中遇到使用vant组件时,触发onChange事件又需要做相关操作时,可以尝试以上方法,来解决问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解mpvue中使用vant时需要注意的onChange事件的坑 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue中实现监听数组内部元素

    要实现监听Vue数组内部元素的变化,可以使用Vue提供的watch方法和变异方法。下面是完整的攻略: 1. 使用Vue提供的watch方法 在Vue中,可以使用watch方法来监视数组内部元素的变化。 下面是一个示例代码: <template> <div> <ul> <li v-for="(item, in…

    Vue 2023年5月29日
    00
  • vue.js入门教程之计算属性

    下面是关于“vue.js入门教程之计算属性”的完整攻略: 什么是计算属性 计算属性是Vue.js的一个重要特性,它能够对绑定的数据进行计算,然后返回一个新的值。 Vue.js官网对计算属性的介绍: 计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要message没有发生改变,多次访问计算属性vm.rever…

    Vue 2023年5月27日
    00
  • vue-element-admin下载到登录的一些坑

    要讲解“vue-element-admin下载到登录的一些坑”的完整攻略,需要详细说明以下几个步骤: 下载 vue-element-admin Vue-element-admin 是一个基于 Vue.js 和 Element UI 的管理系统,提供了丰富的组件和功能,非常适合开发复杂的 Web 应用。可以通过 Git 下载,也可以直接下载 zip 文件。 安…

    Vue 2023年5月28日
    00
  • 使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能

    使用Bootstrap + Vue.js来实现动态表格展示、新增和删除功能需要进行以下步骤: 步骤一:引入所需库 在项目中引入Bootstrap和Vue.js两个库,可以使用CDN或在本地引入。 <!– 引入Bootstrap CSS文件 –> <link rel="stylesheet" href="ht…

    Vue 2023年5月27日
    00
  • vue2.0 自定义日期时间过滤器

    下面是“vue2.0自定义日期时间过滤器”的完整攻略: 1. 什么是过滤器? 过滤器是Vue.js中一种很常见的处理数据的方式,本质上它就是一种特殊的函数,可以用在一些绑定表达式中(从模型到视图和从视图到模型)。 2. 自定义日期时间过滤器的步骤 下面通过一步一步的操作来完成自定义日期时间过滤器的任务: 2.1 安装moment.js moment.js是一…

    Vue 2023年5月28日
    00
  • 详解Vue组件实现tips的总结

    我来为您详细讲解“详解Vue组件实现tips的总结”的完整攻略。 一、什么是tips tips是一种浮动提示框,通常用于提示用户需要注意的内容。在Vue组件中实现tips功能,可以提升用户体验,让用户更加方便地获取信息。 二、实现方式 Vue组件实现tips的方式主要有以下几种: 1. 使用原生JS实现 使用原生JS编写tips功能的代码量较大,而且需要考虑…

    Vue 2023年5月27日
    00
  • JS动态增删表格行的方法

    下面是详细讲解“JS动态增删表格行的方法”的完整攻略。 动态增加表格行 步骤一:创建表格 我们首先需要在页面上创建一个表格,可以采用以下标准的HTML代码来创建一个包含表格头部的表格: <table> <thead> <tr> <th>姓名</th> <th>年龄</th> …

    Vue 2023年5月28日
    00
  • vue.js数据绑定的方法(单向、双向和一次性绑定)

    Vue.js是一款流行的JavaScript框架,提供多种数据绑定方法,包括单向绑定、双向绑定和一次性绑定。本文将详细介绍这些方法的原理和使用方法,以及提供两个示例进行说明。 单向绑定 单向绑定是指数据只能从数据模型流向视图,不能反过来。Vue.js通过一个指令v-bind实现单向绑定。该指令的基本语法为:v-bind:属性名=”data” 下面是一个简单的…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部