Неожиданная мутация Prop

Я передаю свойство apiStepNumber из родительского компонента в дочерний компонент и использую его в дочернем компоненте как значение v-model.

ПРИМЕЧАНИЕ. Фрагменты кода не будут работать. Пожалуйста, избегайте их запуска. Фрагменты предназначены только для понимания.

Родительский компонент

Я вызываю различные API внутри родительского компонента и обновляю apiNumber data variable как 1 2 3.. и так далее при успешных вызовах API и передаю его как реквизит apiStepNumber.

if (firstApiCallSuccessful) this.apiNumber = 2;

if (secondApiCallSuccessful) this.apiNumber = 3;

..so on

<child-component :apiStepNumber = "apiNumber"></child-component>

Дочерний компонент

(Я использую опору apiStepNumber в качестве значения v-модели и других базовых вычислений, но получаю ошибку, как "Unexpected mutation of 'apiStepNumber' prop" в v-model = "apiStepNumber" )

<script>
export default {
    props: {
        apiStepNumber: {
            type: Number,
            required: true,
            default: 1,
        },
    },
    data() {
        return {
            steps: [
                { id: 1, text: "Emailing the Link" },
                { id: 2, text: "Getting Details" },
                { id: 3, text: "Extracting Data" },
                { id: 4, text: "Validating Data" },
                { id: 5, text: "Almost there..." },
                { id: 6, text: "All Done!" },
            ],
        };
    },
}
</script>
<v-stepper v-model = "apiStepNumber" vertical>
  <v-stepper-step
    v-for = "(item, i) in steps"
    :key = "item.id"
    :complete = "apiStepNumber > i + 1"
    :step = "i + 1"
    :color = "apiStepNumber > i + 1 ? 'success' : 'primary'"
  >{{ item.text }}</v-stepper-step>
</v-stepper>

Что я пробовал

  1. Сохранение значения реквизита в локальной переменной данных внутри дочернего компонента и использование этой локальной переменной, а не реквизита напрямую, но это не соответствует моим требованиям.
  2. Пытался просмотреть другие сообщения на StackOverflow по этой теме, но не смог решить проблему.

Заранее спасибо за вашу помощь в этом.

В редакторе есть формат «код». Нет необходимости использовать сниппеты, если они неработоспособны, особенно если для этого требуется комментарий по этому поводу.

Estus Flask 17.04.2024 10:24

Конечно, отредактирую его соответствующим образом. Спасибо !

Harsh Shukla 17.04.2024 11:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
243
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Как говорится в ошибке, реквизиты не могут быть изменены. Если у дочернего элемента нет необходимости иметь собственное состояние (например, для отмены изменений), ему нужен родительский элемент, чтобы применить все изменения к состоянию, именно так работает двусторонняя привязка.

Ребенку необходимо генерировать событие при изменениях. Для Vue 2 можно следовать соглашению v-model следующим образом:

<v-stepper
  :value = "modelValue"
  @input = "$emit('input', $event)"
>

apiStepNumber необходимо переименовать в apiNumber соглашение:

props: {
    value: {
         ...

Родитель может использовать <child v-model = "apiNumber"> для получения значений от события input.

В вопросе он называется apiNumber, поэтому в вашем случае это, скорее всего, <child-comment v-model = "apiNumber">.

Estus Flask 17.04.2024 12:33

Спасибо! Также, пожалуйста, дайте мне знать, если нам нужно переименовать его в родительском компоненте, передавая его в качестве реквизита.

Harsh Shukla 17.04.2024 12:40

Вот как он переименован в родительском компоненте: <child-comComponent v-model = "apiNumber"> вместо <child-comComponent :apiStepNumber = "apiNumber"> . А у ребенка это props: { modelValue : {..... См. документацию vuejs.org/guide/comComponents/v-model.html#basic-usage . Использование v-модели по умолчанию предполагает использование свойства modelValue.

Estus Flask 17.04.2024 12:48

Спасибо за помощь. Я попытался реализовать ваше решение, и оно решает проблему мутации, но почему-то я не получаю желаемой функциональности, которую искал в своем проекте, тогда как когда я удалил v-модель и использовал атрибуты v-bind и value, это дало мне желаемые результаты без каких-либо предупреждений или ошибок о мутации prop.

Harsh Shukla 18.04.2024 09:46

@HarshShukla Можете ли вы уточнить, как это выглядит? Вопрос не содержит тега версии vue. Если это версия 2, вам придется заменить все упоминания «modelValue» на «value».

Estus Flask 18.04.2024 09:53

Извините, забыл указать версию. Да, это v2, а не v3, можете ли вы предложить изменения согласно v2, если это возможно? Я попробую и сообщу, работает это или нет.

Harsh Shukla 18.04.2024 09:55

Я обновил. Вы можете использовать любые имена свойств и событий, это просто комбинация значение+ввод, позволяющая сократить его до v-модели в родительском элементе.

Estus Flask 18.04.2024 10:05

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