#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. Я имею в виду имитировать эту часть кода, чтобы определить правильный тип в реактивном