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

Vue.js中实现Checkbox与Chip的双向绑定解决方案

解决Vue.js + Vuetify中Checkbox与Chip双向联动问题

Hey there! Let's work through this two-way binding issue together. I've reviewed your code and found several key issues that are causing the auto-selection of checkboxes and broken sync with chips. Here's how to fix it:

核心问题分析

  • v-model绑定类型不匹配:Checkbox和Chip都绑定了chip.text(字符串类型),但这类控件的v-model需要布尔值来控制状态(选中/显示)。
  • 事件指令错误:Vue中监听选择变化要用@change,而非v-change(这不是有效的Vue指令)。
  • 布尔值初始化错误:你把isOpen设为字符串'false',但布尔值不需要引号,字符串'false'会被Vue判定为真值,导致控件默认激活。
  • v-chip的v-model用法错误:Vuetify的v-chip组件的v-model需要绑定布尔值来控制显示/隐藏,而非文本字段。

修改后的完整代码

Template部分

<template>
  <div id="app">
    <v-layout row wrap>
      <!-- Checkbox列表,绑定isOpen布尔值 -->
      <v-flex v-for="chip in chips" :key="chip.id" xs12 sm4 md4>
        <v-checkbox :label="chip.name" v-model="chip.isOpen"></v-checkbox>
      </v-flex>
    </v-layout>

    <div class="text-xs-center">
      <!-- 下拉选择框,用@change监听变化 -->
      <v-select 
        :items="dataArr" 
        v-model="sensorDM" 
        label="Select" 
        class="input-group--focused" 
        item-value="text" 
        @change="call(sensorDM)"
      ></v-select>

      <!-- Chip列表,绑定isOpen控制显示,关闭时触发更新 -->
      <v-chip 
        v-for="tag in chips" 
        :key="tag.id" 
        v-model="tag.isOpen" 
        close
        @input="tag.isOpen = false"
      >
        {{ tag.name }}
      </v-chip>
      <br>
    </div>
  </div>
</template>

Script部分

import axios from 'axios'

export default {
  name: 'Creation',
  data: () => ({
    chips: [], // 初始化为空,后续由接口数据填充
    sensorDM: '', // 初始化下拉选中值
    dataArr: []
  }),
  created () {
    axios.get('http://localhost:4000/api/devices')
      .then(response => {
        this.fData(response.data.result)
      })
      .catch(err => console.error('Failed to fetch devices:', err))
  },
  methods: {
    fData(message) {
      // 整理下拉选项数据
      this.dataArr = message.map(el => el.sDM.name)
    },
    call(mes) {
      if (!mes) return // 避免空值请求
      
      axios.get(`http://localhost:4000/api/part1/Models/${mes}`)
        .then(res => {
          const resObj = res.data.response
          // 给每个设备项添加布尔类型的isOpen字段,默认不激活
          this.chips = resObj.map(el => ({
            id: el.id, // 确保有唯一id,没有的话可以用索引或其他唯一标识
            name: el.name,
            isOpen: false // 布尔值,控制checkbox和chip的状态
          }))
        })
        .catch(err => console.error('Failed to fetch models:', err))
    },
    submit(){
      console.log('Submit triggered')
    }
  }
}

关键修改说明

  1. 统一状态绑定字段:新增isOpen布尔字段,同时绑定Checkbox的选中状态和Chip的显示状态,确保双向联动。
  2. 修复事件监听:把v-change改为@change,符合Vue的事件绑定规范。
  3. 修正布尔值初始化:直接用false而非字符串'false',确保初始状态为未选中/隐藏。
  4. 优化数据处理:用map替代forEach来整理数组,代码更简洁且避免手动push的副作用。
  5. 添加错误处理:给axios请求添加catch块,方便排查接口请求问题。
  6. v-chip的关闭事件处理:通过@input事件在关闭Chip时同步设置isOpen为false,确保Checkbox也同步取消选中。

这样修改后,Checkbox的勾选状态会同步控制Chip的显示,关闭Chip时也会自动取消对应的Checkbox勾选,完美实现双向联动效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:01:17