Как поместить возвращаемое значение в другое возвращаемое значение в JS vue - PullRequest
0 голосов
/ 28 марта 2020

Я хочу, чтобы "topic1" была значением названия и ключа моей породы, но когда я пытаюсь поместить this.topic1 вместо ручной печати, она ничего не показывает.

Или есть какой-либо другой способ, чтобы мое имя кнопки совпадало с моим параметром получения API и отправляло имя при нажатии?

new Vue({
  el: '#app2',
  components: { Async },

  data() {
    return {
      topic1: null,
      topic2: null,

      currentBreed: 0,
      breeds: [
        { name: this.topic1 , key: this.topic1 },
        { name: "German Shepherd", key: "germanshepherd" },
        { name: "Husky", key: "husky" },
        { name: "Pug", key: "pug" },
        { name: "(Error)", key: "error" },
      ]
    }
  },
  async created() {
    try {
      this.promise = axios.get(
        "https://k67r3w45c4.execute-api.ap-southeast-1.amazonaws.com/TwitterTrends"
      );
      const res = await this.promise;
      this.topic1 = res.data[0].Trends;
      this.topic2 = res.data[1].Trends;  
    } catch (e) {
      console.error(e);
    }  
  },

  async mounted () {

  let test = this.topic1;


  },
  computed: {

    breedKey() {
      return this.breeds[this.currentBreed].key;
    }
  }
})

1 Ответ

1 голос
/ 28 марта 2020

Здесь есть несколько проблем.

Функция data вызывается только один раз, когда создается соответствующий экземпляр Vue. Внутри этой функции вы можете получить ссылку на ее Vue экземпляр через this. В этот момент некоторые свойства, например, соответствующие props, уже будут существовать. Однако другие не будут.

Объект, возвращенный из data, используется для создания новых свойств в экземпляре. В этом случае вы создаете 4 свойства: topic1, topic2, currentBreed и breeds. Vue создает эти свойства на основе этого возвращаемого объекта, поэтому они не будут существовать до тех пор, пока не будет запущена функция data.

Поэтому, когда вы пишете { name: this.topic1 , key: this.topic1 }, в этой функции data, вы попытка получить доступ к свойству topic1, которое еще не существует. Как таковой он будет иметь значение undefined. Итак, вы создаете запись, эквивалентную { name: undefined , key: undefined },.

Кроме того, нет ссылки на topic1. Этот объект не будет обновляться при изменении значения topic1.

Также стоит отметить несколько моментов, касающихся синхронизации.

  1. Функция data будет вызываться раньше перехват created, поэтому вызов axios не выполняется до тех пор, пока не будут заполнены свойства data.
  2. Вызов axios является асинхронным.
  3. Использование await может сделать код немного легче для чтения, но «ожидание» - это всего лишь иллюзия. Оставшийся код внутри функции не будет работать до тех пор, пока не будет решено ожидаемое обещание, но это не заставит ничего ждать вне функции. await эквивалентно использованию then.
  4. Компонент будет визуализироваться сразу после вызова ловушки created. Это синхронно, оно не будет ждать запроса axios. Затем будет вызван хук mounted, все до завершения вызова axios.

Все это означает, что вам может потребоваться настроить шаблон для обработки случая, когда вызов axios еще не завершена, так как изначально будет отображаться до того, как станут доступны значения topic1 и topic2.

В частности, для свойства breeds у вас есть несколько вариантов. Один из них заключается в том, чтобы ввести значения сразу после загрузки значения:

breeds: [
  { name: "" , key: "" }, // Initially empty values
  { name: "German Shepherd", key: "germanshepherd" },
  // ...
const res = await this.promise;
this.topic1 = res.data[0].Trends;
this.topic2 = res.data[1].Trends;  
this.breeds[0].name = this.breeds[0].key = this.topic1;

Другой - использовать свойство computed для breeds (вы удалите его из data для this):

computed: {
  breeds () {
    return [
      { name: this.topic1 , key: this.topic1 },
      { name: "German Shepherd", key: "germanshepherd" },
      { name: "Husky", key: "husky" },
      { name: "Pug", key: "pug" },
      { name: "(Error)", key: "error" },
    ]
  }
}

Поскольку мы используем свойство computed, оно будет обновляться при изменении topic1 как реактивной зависимости.

Использование свойства computed возможно, наиболее естественное решение в этом случае, но есть и другие приемы, которые вы можете использовать, чтобы заставить это работать.

Например, вы можете использовать средства получения свойств для двух свойств в этом первом объекте размножения (это JavaScript получатели собственности, ничего общего с Vue):

data () {
  const vm = this;

  return {
    topic1: null,
    topic2: null,

    currentBreed: 0,
    breeds: [
      {
        get name () {
          return vm.topic1;
        },

        get key () {
          return vm.topic1;
        }
      },
      { name: "German Shepherd", key: "germanshepherd" },
      { name: "Husky", key: "husky" },
      { name: "Pug", key: "pug" },
      { name: "(Error)", key: "error" },
    ]
  }
},

Я не защищаю этот подход для вашего случая использования, но это интересный способ сделать это, который иногда может быть полезным. Ключевым моментом, на который следует обратить внимание, является то, как зависимость от topic1 оценивается только при обращении к свойствам name и key, а не при выполнении функции data. Это позволяет регистрировать topic1 как зависимость от того, к чему обращаются name и key, например, во время рендеринга.

...