Обновление реактивных данных в обратном вызове ответа axios внутри опции настройки — Vue 3

#javascript #vue.js #axios #vuejs3 #vue-composition-api

#javascript #vue.js #axios #vuejs3 #vue-composition-api

Вопрос:

Я выполняю вызов Axios в методе настройки моего компонента. Затем я хочу установить переменную с именем books. В vue 2 я бы сделал вызов в созданном перехватчике, а затем использовал this для установки переменной. В vue 3 this в методе установки нет доступа, так как вы получаете доступ к данным вне вызова axios? Я хочу получить массив книг, а затем установить для него переменную books. Как это можно сделать и есть ли лучший способ сделать это в Vue 3? Мой метод настройки выглядит следующим образом:

   setup() {
      let books = reactive<Array<Book>>([])
        HTTP.get('/books')
            .then(response => {
                //Normally here I would do this.books
                books = response.data
            })
            .catch(function (error) {
                console.log(error);
            })
            return { books }
  }
  

Ответ №1:

Согласно документам composition api :

реактивный
Принимает объект и возвращает реактивный прокси исходного …

ссылка
Принимает внутреннее значение и возвращает реактивный и изменяемый объект ref. Объект ref имеет единственное свойство .значение, которое указывает на внутреннее значение …

Таким reactive образом, функция должна иметь внутреннее свойство :

   setup() {
      let state = reactive<Array<Book>>({books:[]})
        HTTP.get('/books')
            .then(response => {
            
                state.books = response.data
            })
            .catch(function (error) {
                console.log(error);
            })
            return { books:toRef(state,'books') }
  }
  

или используйте ref

   setup() {
      let books = ref<Array<Book>>([])
        HTTP.get('/books')
            .then(response => {
              
                books.value = response.data
            })
            .catch(function (error) {
                console.log(error);
            })
            return { books }
  }
  

Комментарии:

1. Использование реактивного выброса этой ошибки Argument of type '{ books: undefined[]; }' is not assignable to parameter of type 'Book[]'. может быть связано с тем, что он ожидает один объект? Использование ref работает, но, насколько я понимаю, ref не должен использоваться с примитивными типами? Массив не так уж и запутан.

2. Это проблема с типизацией, может обогатить код для его отладки

3. Да, ссылки предназначены для примитивных типов, но они могут принимать тип объекта / массива

4. Хм, кажется немного запутанным, что вы можете использовать оба типа. Прошу прощения, но я не понимаю, что вы имеете в виду, говоря об обогащении кода? Следует ли добавить мой код в изолированную среду?

5. Я имею в виду имитировать эту часть кода, чтобы определить правильный тип в реактивном