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

yizhihongxing

如何在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中使用回调函数,this调用无效的解决

    在Vue中,我们经常需要使用回调函数来实现一些异步操作或事件处理。然而,在使用回调函数的过程中,我们可能会遇到this调用无效的问题,这是因为回调函数中的this指向了函数本身,而不是Vue实例。针对这个问题,我们有以下解决方案。 方案一:使用箭头函数 使用箭头函数可以解决this调用无效的问题,因为箭头函数的this指向的是定义时所在的作用域,而不是运行时…

    Vue 2023年5月28日
    00
  • vue watch监控对象的简单方法示例

    下面是详细讲解 “Vue watch 监控对象的简单方法示例” 的完整攻略。 什么是 Vue Watch? Vue 是一个响应式框架,数据的变化能够自动触发视图的更新。Vue Watch 提供了一种方式来监听 Vue 实例中某个数据的变化,当它的值发生变化时,可以触发特定的操作。 如何在 Vue 中使用 Watch 在 Vue 实例中,可以使用 watch …

    Vue 2023年5月28日
    00
  • vue项目在打包时,如何去掉所有的console.log输出

    在 Vue 项目中,我们通常使用 webpack 进行打包,可以通过插件和配置的方式来去除 console.log 输出。 下面提供两种常见的方法: 方法一:使用插件 webpack 插件 babel-plugin-transform-remove-console 可以在打包时移除所有 console.log 输出。 安装 babel-plugin-tran…

    Vue 2023年5月28日
    00
  • 如何在Vue3中实现自定义指令(超详细!)

    下面是关于如何在Vue3中实现自定义指令的完整攻略。 什么是自定义指令 在Vue中,指令是一种带有v-前缀的特殊属性。指令具有独特的行为和功能,例如v-bind可以将元素的属性与Vue实例中的数据绑定,v-on可以监听事件等。Vue允许我们注册自己的自定义指令。 在Vue3中注册自定义指令 在Vue3中,我们可以使用DirectiveAPI来注册自定义指令。…

    Vue 2023年5月28日
    00
  • vue关于重置表单数据出现undefined的解决

    关于重置表单数据出现undefined的问题,我们可以进行如下的解决方式: 问题原因 首先,我们需要明确这个问题的原因。在 Vue 中,我们重置表单数据通常使用 Object.assign 或者展开操作符 … 来将一个空对象里的数据覆盖当前表单组件里的数据。常见代码如下: // resetFormData 方法里重置formData数据 resetFor…

    Vue 2023年5月27日
    00
  • Vue检测屏幕变化来改变不同的charts样式实例

    下面是Vue检测屏幕变化来改变不同的charts样式的完整攻略: 1. 为什么需要检测屏幕变化 在现代的多种设备上,不同的屏幕尺寸和分辨率会影响到页面的显示和交互,特别是在数据可视化的场景中,如何适应不同屏幕呈现不同的样式和呈现方式是一个关键的问题。而Vue作为流行的MVVM框架,提供了一种简单但强大的方式来监测屏幕变化并对相应的变化进行处理。 2. 使用V…

    Vue 2023年5月28日
    00
  • VUE项目初建和常见问题总结

    VUE项目初建和常见问题总结 项目初建 1. 安装Vue脚手架 前置条件:需要已安装Node.js和npm npm是Node.js的包管理器,可以使用以下命令检查Node.js和npm是否已安装: node -v # 查看Node.js版本 npm -v # 查看npm版本 安装Vue脚手架的命令为: npm install -g @vue/cli 2. 创…

    Vue 2023年5月28日
    00
  • Vue实现active点击切换方法

    Vue实现active点击切换的方法有很多种,这里介绍其中的两种: 方法一:使用v-bind:class 在data中定义一个变量isActive,并设置初始值为false <script> export default { data() { return { isActive: false } } } </script> 2.通过v…

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