Jak przypisać do ref asynchroniczną wartość z gettera

Jak przypisać do ref asynchroniczną wartość z gettera

Wątek przeniesiony 2023-09-27 10:44 z JavaScript przez Riddle.

anckor
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 314
0

Wewnątrz Vuex w pliku actions.js mam akcję, która pobiera dane z backendu, a następnie je ustawia:

Kopiuj
    async loadData(context) {
        const response = await fetch(
            `http://localhost:9090/api/v1`, {
                headers: {
                    'Content-Type': 'application/json'
                }
            }
        );

        const responseData = await response.json();

        const data = {
            email: responseData.email
        };

        context.commit('setEmail', data);
    },

Teraz jak wewnątrz jakiegoś komponentu zrobię sobie takie coś:

Kopiuj
const email = ref(store.getters.email)

żeby potem wyświetlić to w polu tekstowym:

Kopiuj
 <input v-model="email"/>

to to pole tekstowe zawsze jest puste. To dlatego, że request trwa powiedzmy około 1 sekundę i zanim się skończy to komponent już dawno się wyrenderuje gdy store.getters.email jeszcze jest null. Przyczynę znam ale jak to obejść już nie mam pojęcia. Proszę o pomoc.

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1

ref jest raczej używany do typów prymitywnych. W przypadku obiektów standardem jest reactive. No i pytanie w jaki sposób to przypisujesz. Object.assign(obiekt, dane)?

Jeszcze możesz dać ifa na tym inpucie. Vue dynamicznie podmieni wartość w momencie, gdy nie będzie nullem.

anckor
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 314
0

Rozwiązałem problem w ten sposób:

Kopiuj
const email = ref('');
watch(
    () => store.getters.email,
    (newEmail) => {
        email.value = newEmail;
    }
);
X0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 44
0

Mozna skorzystac z computed get set

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.