详解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路由传参页面刷新后参数丢失的原因和解决办法,我来给你详细阐述一下: 1. 原因 当我们在Vue的单页面应用中进行路由跳转时,可能会需要传递一些参数到目标组件中,而Vue提供了通过路由传参的方式来实现这一功能。但是,当我们刷新目标组件页面时,之前传递的参数会丢失,这是因为路由传参参数默认只存在于内存中,而不会被保存在浏览器的历史记录中。因此,当页面刷…

    Vue 2023年5月27日
    00
  • vue中动态组件使用及传值方式

    接下来我会详细讲解“Vue中动态组件使用及传值方式”的完整攻略,包含以下内容: 动态组件的基本使用方法 在父组件中使用动态组件 在子组件中使用 props 传递数据 示例代码说明 1. 动态组件的基本使用方法 Vue中的动态组件可以让我们根据不同的情况加载不同的组件。在 Vue 中使用动态组件非常简单,只需要使用 component 标签,并将 is 属性指…

    Vue 2023年5月27日
    00
  • 如何利用vue展示.docx文件、excel文件和csv文件内容

    展示Word文档的步骤 在Vue项目中,我们可以使用js的库jszip和docxtemplater来解析Word文档中的数据。 安装依赖库 在终端输入以下命令安装依赖库: npm install jszip docxtemplater –save 解析Word文档 将Word文档解析成json格式的数据: import JSZip from ‘jszip’…

    Vue 2023年5月28日
    00
  • VUE v-bind 数据绑定的示例详解

    以下是“VUE v-bind 数据绑定的示例详解”的完整攻略: 标题 VUE v-bind 数据绑定的示例详解 简介 v-bind是VUE.js中用于属性绑定的指令,它可以用来动态地绑定一个或多个属性到一个表达式。在本文中,我们将详细演示v-bind的使用方法,并提供两个实例来说明它的用法。 正文 基本用法 首先,我们来介绍v-bind的基本用法。例如,我们…

    Vue 2023年5月28日
    00
  • Vue.js项目模板搭建图文教程

    下面是Vue.js项目模板搭建的完整攻略: Vue.js项目模板搭建图文教程 1. 确保Node.js和npm已经安装 在开始之前,请确保已经在本地安装好Node.js和npm。如果你还没安装,可以在Node.js官网下载安装:https://nodejs.org/en/ 2. 安装Vue CLI 在命令行中输入以下命令,使用npm全局安装Vue CLI: …

    Vue 2023年5月27日
    00
  • webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)

    下面是详细讲解“webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)”的完整攻略。 问题背景 当我们使用webpack打包vue项目时,生成的js、css、图片等静态资源文件可能会存在404的问题,这是由于打包后资源文件的路径问题所导致的。 具体解决步骤 接下来,介绍具体的解决步骤,包括以下几个方面: 步骤1:检查public…

    Vue 2023年5月28日
    00
  • 简单聊聊vue3.0 sfc中setup的变化

    下面我就为大家详细讲解一下“简单聊聊vue3.0 sfc中setup的变化”。 一、什么是.vue文件 在介绍.vue文件的地方,就不得不介绍一下 Vue.js 了。Vue.js 是一款非常流行的前端框架,主要用于构建用户界面以及单页应用程序(SPA)。而.vue文件则是 Vue.js 在开发中所使用的组件文件格式,它可以包括 HTML、CSS 和 Java…

    Vue 2023年5月28日
    00
  • vue-router钩子函数实现路由守卫

    下面为你详细讲解Vue Router钩子函数实现路由守卫的完整攻略。 钩子函数介绍 Vue Router提供了多个钩子函数,可以在路由发生变化时执行一些操作。以下是常用的钩子函数: beforeEach(to, from, next) :进入路由之前触发,next必须调用,才能进入下一个钩子。其中参数to和from分别表示即将进入的路由和即将离开的路由。 a…

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