Dostęp do router.currentRoute poza komponentem

Dostęp do router.currentRoute poza komponentem
DE
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:7
0

Witajcie,
nie mam sporego doświadczenia w VUEJS jak i w samym JS, stąd prawdopodobnie ugrzązłem na wydawałoby się dość trywialnym temacie.

Słowem wyjaśnienia projekt to aplikacja SPA mająca się komunikować z backendem via REST API a postawiona jest na VITESSE (boilerplate VUE3+Typescript+Pinia+composition API ....)

Postanowiłem jako, że aplikacja z założenia będzie dość złożona wydzelić warstwę komunikującą się po HTTP.

W związku z powyższym stworzyłem folder /src/api a w nim kolejne pliki z podzielonymi na grupy metodami wykonującymi konkretne zapytania via axios (jak niżej)

Kopiuj
import type { AxiosInstance, AxiosRequestConfig } from 'axios'
import axios from 'axios'
import { router } from '~/main'


const axiosInstance: AxiosInstance = axios.create({
  baseUrl: import.meta.env.API_URL,
  headers: {
    'Content-type': 'application/json',
    'Authorization': 'Bearer ' + 'TOKENXXXXXXXXXXXXX',
    'Language': router.currentRoute.value.params.lang,
  },
})

async function axiosCall<T>(config: AxiosRequestConfig) {
  try {
    const { data } = await axiosInstance.request<T>(config)
    return [null, data]
  }
  catch (error) {
    return [error]
  }
}

export async function sendMessage(formData) {
  return axiosCall<void>({ method: 'post', url: '/send-message', data: formData })
}

OPIS PROBLEMU

W headerach chciałbym umieszczać aktualnie wybrany język przez usera do backendu:

Kopiuj
 'Language': router.currentRoute.value.params.lang,

problem tylko w tym że router jest w tym momencie "niezainicjowany".

Mimo że jestem na ścieżce /en/contact to router.fullPath pokazuje "/", a router.currentRoute.value.params jest pustym obiektem

jednak jak wykonam coś takiego w powyższym pliku:

Kopiuj
async function getLang() {
  await router.isReady()
  console.log('routerLang:', router.currentRoute.value.params.lang)
}

getLang()

to oczywiście na konsoli bez zająknięcia pojawia się "routerLang: en"

Oczywiście obejściem jest wyekstrahowanie języka z dostępnego w tym etapie: window.location.href jednak to z pewnością niezgodne ze sztuką

Jak z takimi problemami sobie radzić ?

Pozdrawiam i z góry dziekuję

edytowany 1x, ostatnio: Riddle
Xarviel
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 21 godzin
  • Postów:847
0

Konfiguracje Axiosa możesz sobie nadpisać (https://axios-http.com/docs/config_defaults)

Kopiuj
const axiosInstance: AxiosInstance = axios.create({
  baseUrl: 'https://xxx.pl/api/',
})

axiosInstance.defaults.baseUrl = 'https://zzz.com/api/v2/';

więc ja na Twoim miejscu stworzyłbym sobie funkcję

Kopiuj
export const setAxiosLanguage = (language: string): void => {
  axiosIstance.defaults.headers.common['Language'] = language;
}

i używałbym jej w tych komponentach, które odpowiadają za zmianę języka

DE
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:7
0
Xarviel napisał(a):

Konfiguracje Axiosa możesz sobie nadpisać (https://axios-http.com/docs/config_defaults)

Kopiuj
const axiosInstance: AxiosInstance = axios.create({
  baseUrl: 'https://xxx.pl/api/',
})

axiosInstance.defaults.baseUrl = 'https://zzz.com/api/v2/';

więc ja na Twoim miejscu stworzyłbym sobie funkcję

Kopiuj
export const setAxiosLanguage = (language: string): void => {
  axiosIstance.defaults.headers.common['Language'] = language;
}

i używałbym jej w tych komponentach, które odpowiadają za zmianę języka

Witaj,
dziękuję, że zechciałeś się pochylić nad tematem. Tak jak pisałem, nie jestem specjalnie biegły w temacie zakulisowych zdarzeń w VUE/JS i to co wpisałeśz konfiguracją Axiosa rozumiem, ponieważ już korzystałem z takiego podejścia tylko mam wątpliwość gdzie taka funkcja powinna zostać ulokowana ponieważ nie mam dedykowanych komponentów odpowiadających za zmianę języka (co może właśnie być złym podejściem)?

Na ten moment jeśli użytkownik wejdzie na /en/contact to uznaję że ustawił sobie język na angielski tak samo jak na /de/configurator to zaczynam rozmawiać z nim po niemiecku.
i18n robi to po stronie frontu w oparciu o routing w App.vue -> i to również dzieje się PO zaczytaniu się mojego /src/api/contact.ts

Będę wdzięczny za jeszcze jakąś podpowiedz

Pozdrawiam

Xarviel
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 21 godzin
  • Postów:847
0

Musisz po prostu w jakimś komponencie wykryć jaki jest obecny język i zmienić konfiguracje axiosa (https://stackoverflow.com/questions/67141277/is-there-a-way-to-watch-a-change-of-the-i18ns-current-locale)

W teorii powinno to być coś takiego...

Kopiuj
<script setup lang="ts">
import { useI18n } from 'vue-i18n';
// import { setAxiosLanguage } from '..'; <-- tutaj importujesz tą wcześniejszą funkcję, którą zrobiłem

const { t, locale } = useI18n();

watch(locale, () => {
  console.log('locale', locale.value);

  // setAxiosLanguage(locale.value);
});
</script>

ale jak będzie w praktyce to nie wiem, ciężko to ocenić na podstawie jednego pliku

edytowany 1x, ostatnio: Xarviel
DE
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:7
0

Dziękuję za po raz kolejny poświęcony czas. Zamysł rozumiem, ale...

Od 3h kombinuję i wydaje mi się, że to tak nie zadziała.

W ogólności mówię o tym, że w moim pliku xxx.ts gdzie mam cała logikę API i tworzę instancję klienta axios nie ma jeszcze zainicjowanego routera ...i nie ma go też w żadnym pliku, który ładuje się przed nim. Pełnowartościowe komponenty mające dostęp do routera ładują się zawsze po pliku xxx.ts.

Efekt jest taki że jak dodam wpis:

Kopiuj
axiosIstance.defaults.headers.common['Language'] = 'xyz';

w jakimkolwiek pliku, który ładuje się przed xxx.ts (np. main.ts) to zapytanie uwzględni to i request posiada ten nagłówek, natomiast gdy dodam to w jakimkolwiek ładowanym później (np. App.vue), już nie.

Utknąłem :(

Zastanawiam się nad stworzeniem instancji samego klienta REST API jako composables a jedynie same endpointy (funkcje obsługujące konkretne zapytania) jakoś umieścić w /src/api/xxxxx.ts (jeden plik to jeden set dziedzinowo powiązanych metod)

to powinno rozwiązać problem z inicjalizowaniem samej instancji axiosa (a przynajmniej tak mi się wydaje...) jednak nie wiem jak to sprytnie ograć :(

Xarviel
Mniej więcej kumam o co chodzi, ale z "dostępem" do jednego pliku jedynie tyle jestem wstanie Ci pomóc.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)