You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue表格中jQuery修改input值后v-model未更新的解决方法

解决Bootstrap-Vue可编辑表格v-model与jQuery修改值不同步的问题

核心原因

Vue的v-model依赖监听输入框的input/change事件同步数据,而jQuery直接调用$(input).val(newVal)修改DOM值时,不会触发这些事件,导致Vue无法感知值变化,进而出现数据不同步的情况。

方案一:抛弃jQuery,直接操作Vue响应式数据(推荐)

遵循Vue数据驱动的设计思路,直接修改绑定的数据源,而非操作DOM。这种方式逻辑清晰,天然保证v-model同步。

示例代码如下:

<template>
  <b-table :items="tableItems" :fields="fields">
    <template #cell(field1)="{ item }">
      <b-form-input
        v-model.number="item.field1"
        type="number"
        @input="syncField2(item)"
        placeholder="百分比(如12)"
      />
    </template>
    <template #cell(field2)="{ item }">
      <b-form-input
        v-model.number="item.field2"
        type="number"
        @input="syncField1(item)"
        placeholder="金额(如12)"
      />
    </template>
  </b-table>
</template>

<script>
export default {
  data() {
    return {
      totalBudget: 100,
      fields: ['field1', 'field2'],
      tableItems: [
        { field1: 12, field2: 12 }
      ]
    }
  },
  methods: {
    syncField2(item) {
      // 百分比转金额:总预算 × 百分比/100,保留两位小数避免精度问题
      item.field2 = parseFloat((this.totalBudget * (item.field1 / 100)).toFixed(2))
    },
    syncField1(item) {
      // 金额转百分比:(金额/总预算)×100,保留两位小数
      item.field1 = parseFloat(((item.field2 / this.totalBudget) * 100).toFixed(2))
    }
  }
}
</script>

如果需要显示%或$符号,直接在模板中格式化即可,比如{{ item.field1 }}%、${{ item.field2 }},不要将符号存入绑定的数值字段,避免类型错误。

方案二:保留jQuery时,手动触发input事件

若因特殊需求必须使用jQuery操作DOM,修改值后需手动触发input事件,让Vue感知到变化:

// 修改Field2输入框值后触发input事件
const $field2Input = $('.target-field2-input')
$field2Input.val(newValue)
$field2Input.trigger('input')

// 修改Field1输入框值后同理
const $field1Input = $('.target-field1-input')
$field1Input.val(newValue)
$field1Input.trigger('input')

此方式不推荐,容易引发DOM操作与响应式数据的不一致问题,违背Vue的设计理念。

内容的提问来源于stack exchange,提问作者hrdfgn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:24:51