在单选按钮更改时更改 class

Changing class on radio button change

我的第一列 (Test1) 处于活动状态,因此背景变为橙色。为什么单击单选按钮时活动 class 不会更改为第二列 (Test2)? 我希望它在单击单选按钮时更改活动 class。

我有以下模板:

<template v-if="columns" v-for="(item, index) in columns" v-bind="item">
    <div class="card-container"
         :style="{'height': item.height+'%'}"
         :class="{ active: item.active}">
        <div class="card-inner">
            <input type="radio" v-if="item.selectedDefault" checked v-model="currentInput" name="cardRadioGroup"
                   :value="item.id" v-on:change="updateDetails(item, index)"/>
            <input type="radio" v-else v-model="currentInput" name="cardRadioGroup" :value="item.id"
                   v-on:change="updateDetails(item, index)"/>
            <template v-if="item.gbAmount === null">
                Onbeperkt
            </template>
            <template v-else>
                {{ item.gbAmount }} GB
            </template>
            {{ currentInput }}
        </div>
    </div>
</template>

使用以下 Vue 代码:

import {onMounted} from "vue";

export default {
name: 'Card',
components: {Details},

data() {
    const columns =
        {
            "Test1": {
                "id": 1,
                "gbAmount": 0,
                "price": 5,
                "selectedDefault": false,
                "informationGet": ["bla", "bla"],
                "informationUsing": "Boop.",
                "recommended": false,
                "height": 16.66,
                "active": true,
            },
            "Test2": {
                "id": 2,
                "gbAmount": 1,
                "price": 10,
                "selectedDefault": false,
                "informationGet": ["beh", "beh"],
                "informationUsing": "Beep",
                "recommended": false,
                "height": 33.33,
                "active": false,
            },
        }

    return {
        columns,
        currentColumn: {},
        checkedCard: [],
        currentInput: null,
    };
},

methods: {
    updateDetails(item, index) {
        this.currentColumn = {
            ...item,
            name: index,
            active: true,
        }
        console.log($(this.currentColumn));
    },
},

setup() {
    return {};
},

};

和CSS:

.active {
  background: orange;
}

您更新 this.currentColumn 但在模板中使用 this.columns。正确的是:

updateDetails(item, index) {
    Object.keys(this.columns).forEach(key => this.columns[key].active = false);
    this.columns[index].active = true;
    console.log(this.columns);
 }
<template>
  <div v-for="column in columns" :key="column.id">
    <div
      class="card-container"
      :style="{ height: column.height + '%' }"
      :class="{ active: column.id === currentInput }"
    >
      <div class="card-inner">
        <input
          type="radio"
          name="cardRadioGroup"
          :value="column.id"
          v-model="currentInput"
        />
        <template v-if="column.gbAmount === null"> Onbeperkt </template>
        <template v-else> {{ column.gbAmount }} GB </template>
        {{ currentInput }}
      </div>
    </div>
  </div>
</template>

<script lang="ts">
import { ref } from 'vue'

const columns = [
  {
    id: 1,
    gbAmount: 0,
    price: 5,
    selectedDefault: false,
    informationGet: ['bla', 'bla'],
    informationUsing: 'Boop.',
    recommended: false,
    height: 16.66,
  },
  {
    id: 2,
    gbAmount: 1,
    price: 10,
    selectedDefault: false,
    informationGet: ['beh', 'beh'],
    informationUsing: 'Beep',
    recommended: false,
    height: 33.33,
  },
]

export default {
  name: 'Card',
  setup() {

    const currentInput = ref(columns[0].id)

    return {
      columns,
      currentInput,
    }
  },
}
</script>