当前位置:首页 > VUE

vue 中实现互斥选中

2026-01-20 21:34:51VUE

实现互斥选中的方法

在Vue中实现互斥选中(即单选效果)可以通过多种方式完成,以下是几种常见的方法:

使用v-model绑定同一个变量

通过将多个选项的v-model绑定到同一个变量,Vue会自动处理互斥逻辑。当选中一个选项时,其他选项会自动取消选中。

vue 中实现互斥选中

<template>
  <div>
    <input type="radio" id="option1" value="option1" v-model="selectedOption">
    <label for="option1">Option 1</label>
    <input type="radio" id="option2" value="option2" v-model="selectedOption">
    <label for="option2">Option 2</label>
    <input type="radio" id="option3" value="option3" v-model="selectedOption">
    <label for="option3">Option 3</label>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedOption: ''
    }
  }
}
</script>

使用计算属性和方法

对于非radio元素(如按钮或自定义组件),可以通过计算属性和方法手动实现互斥逻辑。

vue 中实现互斥选中

<template>
  <div>
    <button 
      v-for="option in options" 
      :key="option.value"
      :class="{ active: selectedOption === option.value }"
      @click="selectOption(option.value)"
    >
      {{ option.label }}
    </button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      options: [
        { value: 'option1', label: 'Option 1' },
        { value: 'option2', label: 'Option 2' },
        { value: 'option3', label: 'Option 3' }
      ],
      selectedOption: ''
    }
  },
  methods: {
    selectOption(value) {
      this.selectedOption = value
    }
  }
}
</script>

使用Vuex或Pinia管理状态

在大型应用中,可以使用状态管理工具(如Vuex或Pinia)集中管理选中状态。

// store.js (Vuex示例)
import { createStore } from 'vuex'

export default createStore({
  state: {
    selectedOption: ''
  },
  mutations: {
    setSelectedOption(state, value) {
      state.selectedOption = value
    }
  }
})
<template>
  <div>
    <button 
      v-for="option in options" 
      :key="option.value"
      :class="{ active: $store.state.selectedOption === option.value }"
      @click="$store.commit('setSelectedOption', option.value)"
    >
      {{ option.label }}
    </button>
  </div>
</template>

使用自定义指令

可以创建自定义指令来处理互斥选中逻辑,适用于需要复用的场景。

// main.js
app.directive('mutex', {
  mounted(el, binding, vnode) {
    el.addEventListener('click', () => {
      const group = binding.arg || 'default'
      const value = binding.value
      vnode.context.selectedOptions = { ...vnode.context.selectedOptions, [group]: value }
    })
  }
})
<template>
  <div>
    <button v-mutex:group1="'option1'" :class="{ active: selectedOptions.group1 === 'option1' }">Option 1</button>
    <button v-mutex:group1="'option2'" :class="{ active: selectedOptions.group1 === 'option2' }">Option 2</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedOptions: {
        group1: ''
      }
    }
  }
}
</script>

以上方法均可实现互斥选中效果,选择哪种方式取决于具体场景和项目需求。对于简单场景,直接使用v-model最为简便;对于复杂场景,可能需要结合状态管理或自定义指令。

标签: 互斥vue
分享给朋友:

相关文章

vue实现rtc

vue实现rtc

Vue 实现 RTC 的步骤 安装依赖 在 Vue 项目中安装 WebRTC 相关依赖,如 simple-peer 或 peerjs,用于简化 WebRTC 的实现。 运行以下命令安装 simple-…

vue实现导出

vue实现导出

Vue 实现导出功能的方法 在 Vue 项目中实现导出功能通常涉及将数据导出为 Excel、CSV 或其他格式。以下是几种常见的实现方式: 使用 xlsx 库导出 Excel 安装 xlsx 库:…

vue实现录音

vue实现录音

Vue 实现录音功能 在 Vue 中实现录音功能可以通过浏览器提供的 MediaRecorder API 完成。以下是具体实现方法: 引入依赖 确保项目支持现代浏览器 API,无需额外安装库。若需兼…

vue实现子表格

vue实现子表格

Vue 实现子表格的方法 在 Vue 中实现子表格可以通过多种方式完成,以下是几种常见的方法: 使用嵌套组件 创建一个父表格组件和一个子表格组件,通过 props 将数据传递给子表格组件。父表格的每…

vue实现全选下载

vue实现全选下载

Vue实现全选下载功能 全选下载功能通常涉及前端文件列表的多选操作和批量下载逻辑。以下是基于Vue的实现方案: 数据准备与渲染 在Vue组件中定义文件列表数据和选中状态: data() { r…

vue实现搜索过滤

vue实现搜索过滤

Vue 实现搜索过滤 使用计算属性实现搜索过滤 在 Vue 中,计算属性(computed)是实现搜索过滤的常见方法。通过计算属性动态过滤数据,无需修改原始数据。 <template>…