#javascript #vue.js #axios #vuex #vuejs3
Вопрос:
Я пытаюсь реализовать функцию convert() в проекте Vue3.
У меня есть functions.js файл для хранения некоторых «глобальных» базовых функций
import axios from 'axios'
let functions = {}
functions.convert = async (amount, currencySetting) => {
const result = await getRate(currencySetting)
const rateData = result.data
const rate = rateData[`EUR_${currencySetting}`]
const converted = rate * amount
return Math.round(converted)
}
function getRate(currency) {
const apiKey = process.env.VUE_APP_CURRENCY_API_KEY
return axios.get(
`https://free.currconv.com/api/v7/convert?q=EUR_${currency}amp;compact=ultraamp;apiKey=${apiKey}`
)
}
export default functions
Я вызываю функцию внутри такого компонента, как этот
<script>
import functions from '@/functions.js'
export default {
name: 'SltResult',
props: {
data: {
type: Object,
required: true
}
},
computed: {
formattedIrp() {
if (this.data.irp != 'n/a') {
const currencySetting = this.$store.state.currency.currency
if (currencySetting != 'EUR') {
const convertedIrp = functions.convert(this.data.irp, currencySetting)
return convertedIrp currencySetting
} else {
return this.data.irp '€'
}
}
return this.data.irp
}
}
}
</script>
Но это не работает должным образом, я получаю только ожидающий результат обещания… Кто-нибудь может сказать мне, что я делаю не так? Я изучаю Vue и JS….
Комментарии:
1. Мое первое предположение состоит в том, что вычисляемая функция не является асинхронной и вызывает асинхронную функцию, вы, вероятно, захотите использовать наблюдателя, который вызывает функцию, выполняющую запрос, а затем обновляет
formattedIrp
, которая вместо этого находится внутриdata
.
Ответ №1:
В вашем коде есть две проблемы.
- Логичный вопрос. Нет смысла вызывать ajax внутри вычисляемого свойства, просто используйте обычный метод.
- Проблема синтаксиса. Ваша
convert
функция асинхронна, а это значит, что вам нужно подождать, пока она получит значение.
Это рабочая версия вашего кода:
<script>
import functions from '@/functions.js'
export default {
name: 'SltResult',
data: () => ({
formattedIrp: null,
}),
props: {
data: {
type: Object,
required: true
}
},
mounted() {
if (this.data.irp != 'n/a') {
const currencySetting = this.$store.state.currency.currency
if (currencySetting != 'EUR') {
functions.convert(this.data.irp, currencySetting).then(result => {
this.formattedIrp = result currencySetting;
})
} else {
this.formattedIrp = this.data.irp '€'
}
}
this.formattedIrp = this.data.irp
}
}
}
</script>
Комментарии:
1. Спасибо Хайтам, я только изменил created() на updated (), и теперь он работает!
2. Да,
created
это была ошибка. Это должно бытьmounted
, если значениеirp
не изменится илиupdated
если значение может измениться.
Ответ №2:
Попробуйте это:
const getRate = async (currency) => {
const apiKey = process.env.VUE_APP_CURRENCY_API_KEY
return (await axios.get(
`https://free.currconv.com/api/v7/convert?q=EUR_${currency}amp;compact=ultraamp;apiKey=${apiKey}`
))
}