vant icon indicating copy to clipboard operation
vant copied to clipboard

[Bug Report] RadioGroup 的change事件,不希望在用户未操作的情况下,当绑定值发生变化时,执行处理函数

Open huanganfree opened this issue 1 year ago • 2 comments

重现链接

https://codesandbox.io/s/vant-4-issue-template-forked-gmk8v8

Vant 版本

4.6.8

描述一下你遇到的问题。

RadioGroup的change事件在用户没有点击单选框的情况下,当绑定值前后发生变化时,执行了处理函数。在处理页面请求后台数据回显时,如果某个表单项的值跟单选框某个值相关联,用户未操作的情况下,值变化可能就比较疑惑。

重现步骤

比如:模仿请求后台数据 1.初始值为undefined 2.定时器2s后,更改值, 3.change处理函数执行

设备/浏览器

No response

huanganfree avatar Nov 02 '23 03:11 huanganfree

<template>
  <div id="app">
    <van-radio-group v-model="checked" @input="handleInput">
      <van-radio name="1">单选框 111</van-radio>
      <van-radio name="2">单选框 2</van-radio>
    </van-radio-group>
  </div>
</template>

<script setup>
import { ref } from "vue";
const checked = ref(undefined);
setTimeout(() => {
  checked.value = "2";
}, 100);
const handleInput = (val) => {
  console.log(val);
};
</script>

ljluestc avatar Dec 26 '23 07:12 ljluestc

@huanganfree

RadioGroupchange 事件说明是: 当绑定值变化时触发的事件 组件库本身只考虑这个值有没有发生变化,而不是用户有没有点击

至于何时进行了赋值,是否是用户操作进行的赋值,这个判断在业务本身很容易判断


如果你就是只想知道用户点击时候的事件,而不是数据发生变化时的事件,那你应该用的是 Radioclick 事件 以下是示例代码:

示例代码中,默认初始状态,radio 2 还是会被选中,当用户点击是触发 onClickRadio 你的逻辑可以写在这里

<script setup>
import { ref } from "vue";
const checked = ref(undefined);
setTimeout(() => {
  checked.value = "2";
}, 100);
const onClickRadio = (value) => {
  console.log("用户点击了单选框", value);
};
</script>
<template>
  <div id="app">
    <van-radio-group v-model="checked">
      <van-radio name="1" @click="onClickRadio('1')">单选框 1</van-radio>
      <van-radio name="2" @click="onClickRadio('2')">单选框 2</van-radio>
    </van-radio-group>
  </div>
</template>

nemo-shen avatar Jan 30 '24 11:01 nemo-shen