Vue.js: передача реквизита данным для использования в v-модели

Я пытался передать реквизиты таким данным, как я видел в другом сообщении:

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

props: {
  idInput:   { type: String, required: false },
  nameInput: { type: String, required: false },
},
data() {
  return {
    id: this.idInput,
    name: this.nameInput,
  }
}

Так что я могу использовать его здесь:

<t-input v-model = "name" type = "text" />

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

data() { return { game: {} } },
beforeCreated() { this.game = { name: "myName", id: "myID" }
<ChildComponent :name-input = "game.name" :id-input = "game.id" />

Проблема в том, что «имя» кажется неопределенным, в то время как если я сделаю то же самое, но изменю «имя» на «nameInput», это сработает, но я получаю ошибку Vue, говорящую мне не использовать такие реквизиты. Есть идеи?

На момент рендеринга nameInput, вероятно, еще не определено. Попробуйте использовать значение по умолчанию для этого реквизита.

Anatoly 12.12.2020 21:32

Сделал это, но та же ошибка, на этот раз вместо undefined это пустая строка.

David Díaz 12.12.2020 21:35

Какое сообщение об ошибке вы получаете?

kasvith 12.12.2020 22:06

> Избегайте прямого изменения реквизита, так как значение будет перезаписано при каждом повторном рендеринге родительского компонента. Вместо этого используйте данные или вычисляемое свойство на основе значения реквизита. Проп мутируется: "nameInput"

David Díaz 12.12.2020 22:15
Поведение ключевого слова "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) для оценки ваших знаний,...
2
4
3 313
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот функциональный пример, который я создал, чтобы продемонстрировать этот случай:

const comp = Vue.component('comp', { 
  template: '#myComp',
  props: {
    idInput:   { type: String, required: false },
    nameInput: { type: String, required: false },
  },
  data() {
    return {
      id: this.idInput,
      name: this.nameInput,
    }
  }
});

new Vue({
  el: "#myApp",
  data () {
    return {
      game: {}
    }
  },
  created() {
    this.game = { name: 'myName', id: 'myID' };
  },
  components: { comp }
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id = "myApp">
  <comp :name-input = "game.name" :id-input = "game.id" />
  {{game}}
</div>

<template id = "myComp">
  <div>
    {{idInput}}
    <br>
    <input v-model = "name" type = "text" />
  </div>
</template>

Обновлено: После проверки кода я думаю, что проблема в том, что вы устанавливаете атрибут game в data родительского компонента на beforeCreated. Вместо этого установите его на created.

РЕДАКТИРОВАТЬ ОП нашел другой способ сделать это. Вместо того, чтобы передавать реквизиты один за другим, передайте только 1 реквизит с объектом и используйте его атрибуты в v-model.

Эй, спасибо, что уделили время! К сожалению, у меня почти то же самое, и я до сих пор не могу найти, где ошибка. В любом случае будем стараться, еще раз спасибо.

David Díaz 12.12.2020 21:59

@DavidDíaz, поделившись ссылкой на скрипку, другим будет проще отлаживать ваш код

Majed Badawi 12.12.2020 22:00

Хотелось бы, но я использую некоторые библиотеки и API и не знаю, как это воспроизвести.

David Díaz 12.12.2020 22:25

@DavidDíaz сравните этот код с вашим. Также нельзя использовать реквизит для v-model, используйте data

Majed Badawi 12.12.2020 22:30

Это код, пытался добавить только актуальную информацию. И да, я пытаюсь использовать данные вместо реквизита, но значение данных кажется пустым. gist.github.com/dd8888/d3461474eac1f8a6d8a6ee5c3b2ef77c

David Díaz 12.12.2020 22:35

@DavidDíaz, проблема в том, что вы пытаетесь изменить data в родительском компоненте на beforeCreated, что невозможно, вместо этого установите его на created. Я обновил ответ.

Majed Badawi 12.12.2020 22:45

Найден способ сделать это! Вместо того, чтобы передавать реквизиты один за другим, если я передам только 1 реквизит с объектом и использую его атрибуты в v-модели, и это сработает. Большое спасибо за помощь

David Díaz 12.12.2020 22:59

Пожалуйста. Не стесняйтесь принимать ответ как решение или редактировать его с вашими окончательными выводами. Это поможет будущим посетителям с такой проблемой.

Majed Badawi 12.12.2020 23:01

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