Uncaught SyntaxError: Must be called at the top of a `setup` function vue 3
4 января 2021 г. 7:20
Если в кратце: проблема в том, что ваша функция должна быть вызвана вверху функции setup(), а не быть вложенной в другую функцию (вызов которой происходит из setup()).
Проще понять наглядно, почему может возникнуть ошибка Uncaught SyntaxError: Must be called at the top of a `setup` function, на примере моего случая, когда для тестов я решил обернуть axios.get() в setTimeout:
<script>
import { ref } from 'vue'
import ui_state from "../state";
import axios from "axios";
export default {
name: 'Component',
setup() {
const { locale_url } = ui_state
const data = ref('')
setTimeout(() => {
axios.get(locale_url('/apps/'))
.then(response => {
data.value = response.data;
})
}, 1000);
return {
data
}
}
}
</script>
Консоль выдавала ошибку:
Uncaught SyntaxError: Must be called at the top of a `setup` function
at createCompileError (message-compiler.esm-bundler.js?f92f:32)
at createI18nError (vue-i18n.esm-bundler.js?47e2:71)
at useI18n (vue-i18n.esm-bundler.js?47e2:1928)
at locale_url (state.js?faae:25)
at eval (Component.vue?5ea5:49)
Проблема оказалась в том, что в мой скрипт ui_state (который я создал для хранения общего состояния приложения) я использую useI18n(), который импортировал с библиотекри vue-i18n:
import { reactive } from 'vue';
import { useI18n } from 'vue-i18n'
const state = reactive({
base_url: 'http://localhost:8000/'
});
const locale_url = (url) => {
const { locale } = useI18n()
return state.base_url + '/' + locale.value + url
}
const ui_state = {
locale_url
}
export default ui_state
В моём случае функия locale_url() служит для формирования url в зависимости от используемого языка.
Так как функия locale_url() находилась в другой функции, а не в setup(), то и возникала ошибка. Ошибки не было бы, если бы в функции locale_url() не использовался бы useI18n(). Но мне нужно его использовать для получения текущего locale.
Для решения моего примера достаточно вычислить url до использования setTimeout:
<script>
import { ref } from 'vue'
import ui_state from "../state";
import axios from "axios";
export default {
name: 'Component',
setup() {
const { locale_url } = ui_state
const data = ref('')
const url = locale_url('/apps/')
setTimeout(() => {
axios.get(url)
.then(response => {
data.value = response.data;
})
}, 1000);
return {
data
}
}
}
</script>
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0