Состояние флажка не меняется

`Я использую vue3 с опциями API`

Для кода, опубликованного ниже, у меня есть checkbox, при проверке которого метод onCheckboxGeoTIFFOverlayBandAveragesChanged() должен выполняться. Несмотря на то, что я проверяю и снимаю флажок с checkbox несколько раз, запись журнала в onCheckboxGeoTIFFOverlayBandAveragesChanged всегда показывает, что значение isCheckboxGeoTIFFOverlayBandAveragesChecked ложно.

подскажите пожалуйста, почему это происходит и как это решить

код:

<template>
    <cds-checkbox id = "idCheckboxGeoTIFFOverlayBandAveragesContainer">
        <label id = "idTextGeoTIFFOverlayBandAverages">{{ tempTextBandAverages }}</label>
        <input
            type = "checkbox"
            :value = "compPropsVModelCheckGeoTIFFOverlayBandAverages"
            @input = "$emit('update:compPropsVModelCheckGeoTIFFOverlayBandAverages', $event.target.checked)"
            :disabled = "isCheckboxGeoTIFFOverlayBandAveragesDisabled"
            :checked = "isCheckboxGeoTIFFOverlayBandAveragesChecked"
            @change = "onCheckboxGeoTIFFOverlayBandAveragesChanged"
        />
    </cds-checkbox>
</template>

<script>
import { GeoTIFFOverlaySettingsConstants } from '../../../resources/GeoTIFFOverlaySettings/GeoTIFFOverlaySettingsConstants.js';

let msg = null;

export default {
    name: 'SentinelHubGeoTIFFOverlayBand1',
    data() {
        return {
            tempTextBandAverages: GeoTIFFOverlaySettingsConstants.CONST_STRING_BAND_1_AVERAGES.description,
        };
    },
    components: {},
    props: {
        isCheckboxGeoTIFFOverlayBandAveragesChecked: {
            type: Boolean,
            default: false,
        },
        isCheckboxGeoTIFFOverlayBandAveragesDisabled: {
            type: Boolean,
            default: false,
        },
        vModelCheckGeoTIFFOverlayBandAverages: {
            type: Boolean,
            default: null,
        },
    },
    emits: {
        'update:vModelCheckGeoTIFFOverlayBandAverages': null,
    },
    computed: {
        compPropsVModelCheckGeoTIFFOverlayBandAverages: {
            get() {
                return this.vModelCheckGeoTIFFOverlayBandAverages;
            },
            set(value) {
                this.$emit('update:vModelCheckGeoTIFFOverlayBandAverages', value);
            },
        },
    },
    methods: {
        onCheckboxGeoTIFFOverlayBandAveragesChanged() {
            msg = JSON.stringify({msg:verboseTag + '@watch.', isChecked: this.isCheckboxGeoTIFFOverlayBandAveragesChecked});
            console.info(msg);
        },
    },
};
</script>

Ваш код может быть более идиоматическим Vue.js! Хотите, чтобы vModelCheckGeoTIFFOverlayBandAverages синхронизировался с флажком? Если да, то я могу лучше переписать ваш компонент. Результат будет шокирующим. Какая у вас точная версия Vue?

Raeisi 22.06.2024 10:32

@Raeisi да, я тоже хочу синхронизировать. Я использую vue3 с опциями API. Спасибо

Amr 22.06.2024 11:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Привязка и использование Checkbox всегда были источником путаницы. Простое и базовое использование Checkbox в Vue можно реализовать следующим образом:

<input
  type = "checkbox"
  :value = "vModelCheckGeoTIFFOverlayBandAverages"
  :disabled = "isCheckboxGeoTIFFOverlayBandAveragesDisabled"
  @change = "onCheckboxGeoTIFFOverlayBandAveragesChanged"
/>

onCheckboxGeoTIFFOverlayBandAveragesChanged(e) {
  console.info('is checked', e.target.checked); // true or false
},

Флажок value связан со значением модели, и для наблюдения за изменениями мы можем прослушивать событие change и выбирать текущее проверенное состояние из $event.target.checked. Для других типов ввода текущее значение состояния доступно из $event.target.value. Хорошая реализация может быть:

<template>
  <cds-checkbox id = "idCheckboxGeoTIFFOverlayBandAveragesContainer">
    <label id = "idTextGeoTIFFOverlayBandAverages">{{ tempTextBandAverages }}</label>
    <input
      type = "checkbox"
      :value = "vModelCheckGeoTIFFOverlayBandAverages"
      :disabled = "isCheckboxGeoTIFFOverlayBandAveragesDisabled"
      @change = "onCheckboxGeoTIFFOverlayBandAveragesChanged"
    />
  </cds-checkbox>
</template>

<script>
import { GeoTIFFOverlaySettingsConstants } from '../../../resources/GeoTIFFOverlaySettings/GeoTIFFOverlaySettingsConstants.js';

let msg = null;

export default {
  name: 'SentinelHubGeoTIFFOverlayBand1',
  data() {
    return {
      tempTextBandAverages: GeoTIFFOverlaySettingsConstants.CONST_STRING_BAND_1_AVERAGES.description,
    };
  },
  components: {},
  props: {
    // isCheckboxGeoTIFFOverlayBandAveragesChecked: {
    //   type: Boolean,
    //   default: false,
    // },
    isCheckboxGeoTIFFOverlayBandAveragesDisabled: {
      type: Boolean,
      default: false,
    },
    vModelCheckGeoTIFFOverlayBandAverages: {
      type: Boolean,
      default: null,
    },
  },
  emits: {
    'update:vModelCheckGeoTIFFOverlayBandAverages': null,
  },
  computed: {
    // compPropsVModelCheckGeoTIFFOverlayBandAverages: {
    //   get() {
    //     return this.vModelCheckGeoTIFFOverlayBandAverages;
    //   },
    //   set(value) {
    //     this.$emit('update:vModelCheckGeoTIFFOverlayBandAverages', value);
    //   },
    // },
  },
  methods: {
    onCheckboxGeoTIFFOverlayBandAveragesChanged(e) {
      const val = e.target.checked;
      console.info('is checked', val);
      this.$emit('update:vModelCheckGeoTIFFOverlayBandAverages', val);

      msg = JSON.stringify({
        msg: verboseTag + '@watch.',
        isChecked: this.vModelCheckGeoTIFFOverlayBandAverages,
        // isChecked: this.isCheckboxGeoTIFFOverlayBandAveragesChecked,
      });
      console.info(msg);
    },
  },
};
</script>

Опора isCheckboxGeoTIFFOverlayBandAveragesChecked не имеет смысла и не имеет уникального и определенного использования.

Вычисляемое свойство compPropsVModelCheckGeoTIFFOverlayBandAverages больше не требуется.

Переменную msg можно реализовать как вычисляемое свойство.

И родительский элемент будет обновлен таким образом:

<SentinelHubGeoTIFFOverlayBand1 v-model:vModelCheckGeoTIFFOverlayBandAverages = "checkBoxState"/>

Лучшая и более идиоматическая реализация могла бы выглядеть так (версия Vue ^ 3.4):

<template>
  <cds-checkbox id = "idCheckboxGeoTIFFOverlayBandAveragesContainer">
    <label id = "idTextGeoTIFFOverlayBandAverages">{{ tempTextBandAverages }}</label>
    <input
      type = "checkbox"
      :disabled = "isCheckboxGeoTIFFOverlayBandAveragesDisabled"
      v-model = "model"
    />
  </cds-checkbox>
</template>

<script setup>
import { GeoTIFFOverlaySettingsConstants } from '../../../resources/GeoTIFFOverlaySettings/GeoTIFFOverlaySettingsConstants.js';

import { computed, ref } from 'vue';

const model = defineModel('vModelCheckGeoTIFFOverlayBandAverages', { default: null });

defineProps({
  isCheckboxGeoTIFFOverlayBandAveragesDisabled: {
    type: Boolean,
    default: false,
  },
});

const tempTextBandAverages = GeoTIFFOverlaySettingsConstants.CONST_STRING_BAND_1_AVERAGES.description;
// const tempTextBandAverages = ref(GeoTIFFOverlaySettingsConstants.CONST_STRING_BAND_1_AVERAGES.description);

const msg = computed(() => JSON.stringify({
  msg: verboseTag + '@watch.',
  isChecked: this.vModelCheckGeoTIFFOverlayBandAverages,
}));

</script>

ОКОНЧАТЕЛЬНО В качестве предложения, пожалуйста, используйте общие названия для вашего реквизита. Скажем, чтобы передать статус отключенного, лучше использовать обычное имя disabled вместо isCheckboxGeoTIFFOverlayBandAveragesDisabled. Вместо vModelCheckGeoTIFFOverlayBandAverages используйте modelValue — стандартное имя основной модели во Vue 3.

Другие вопросы по теме