Vuetify中v-checkbox仅响应用户手动点击触发函数的实现问题
Vuetify v-checkbox 仅响应手动修改触发函数
我在Vuetify应用里使用v-checkbox组件,页面加载时会从数据库预填充v-model绑定的值。需求是仅在用户手动点击修改复选框时触发指定函数,初始加载填充数据的阶段不能触发函数。
尝试过以下方法均不符合需求:
- 使用
watch监听v-model:页面加载阶段就会触发函数 - 绑定
change事件:同样会在数据初始化填充时触发 - 绑定
blur事件:需要点击页面其他区域才触发,存在延迟,无法实现点击即触发效果
当前代码如下:
<v-checkbox v-model="approvalLanguageModel" hide-details color="primary" label="Check this if the email will include the approval letter (WARNING: Changing this option will overwrite any current edits to the draft email below with the updated email template!)." @blur="createDraftEmailTemplate()" />
疑问:是否可以直接使用click事件调用方法?click事件是否会确保model更新与组件状态变更后再执行?
解决方案
直接使用click事件是可行的,且能满足你的需求,不过需要注意model更新的时机问题,以下是两种可靠的实现方式:
方式1:click配合nextTick确保model更新
由于click触发时,Vue可能还没完成v-model的更新,所以可以通过$nextTick等待DOM和model同步后再执行函数:
<v-checkbox v-model="approvalLanguageModel" hide-details color="primary" label="Check this if the email will include the approval letter (WARNING: Changing this option will overwrite any current edits to the draft email below with the updated email template!)." @click="handleCheckboxClick" />
methods: { async handleCheckboxClick() { await this.$nextTick() // 等待Vue完成model和DOM的更新 this.createDraftEmailTemplate() } }
方式2:标记初始化状态过滤触发
在数据加载完成后标记初始化完成状态,仅当状态为已初始化时,才在click事件中执行函数:
<v-checkbox v-model="approvalLanguageModel" hide-details color="primary" label="Check this if the email will include the approval letter (WARNING: Changing this option will overwrite any current edits to the draft email below with the updated email template!)." @click="handleCheckboxClick" />
data() { return { approvalLanguageModel: null, isInitialized: false // 初始化状态标记 } }, async created() { // 模拟从数据库加载数据的逻辑 const dbData = await fetchApprovalData() this.approvalLanguageModel = dbData.approvalLanguage this.isInitialized = true // 数据加载完成后标记为已初始化 }, methods: { handleCheckboxClick() { // 仅初始化完成后才执行目标函数 if (this.isInitialized) { this.createDraftEmailTemplate() } } }
关于click事件的说明
click事件只会在用户手动点击复选框(包括点击复选框的标签文本)时触发,完全不会在初始化填充数据阶段触发,完美匹配你的需求。只要配合nextTick或者初始化状态标记,就能保证函数执行时拿到的是最新的approvalLanguageModel值。
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

