Możesz mieć nieskończoną pętlę aktualizacji w funkcji renderowania składnika


Jestem nowy w VueJS, mam ostrzeżenie od Vue,
[Vue warn]: You may have an infinite update loop in a component render function.

Kiedy używam zmiennej V-for w V-bind: style, oto przykład:
w szablonach:
<div v-for="item in model.items" v-bind:class="test(item.result)">
{{item.id}}

w skryptach:
data() {
return {
accept: false,
not_accept: false,
};
},
methods: {
test(result) {
if (result == 'accept') {
this.accept = true;
this.not_accept = false;
} else if (result == 'Not accept') {
this.accept = false;
this.not_accept = true;
} else {
console.log(result);
} return {
success: this.accept,
danger: this.not_accept,
};
},
},

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

@Decade ma rację w tej kwestii. Oto dokładny problem:
  • Jesteś w metodzie renderowania renderowania listy elementów przy użyciu wartości stanu
UWAGA: metoda renderowania jest uruchamiana po każdej zmianie stanu

<ol start="2">
[*]
Następnie próbujesz powiązać klasę na podstawie wyniku działania funkcji
test
, ta funkcja jest błędna, ponieważ próbuje ponownie zmienić stan, powodując pętlę render-test-render.
[/*]
[/list]
Możesz rozwiązać ten problem, upewniając się, że funkcja testowa nie zmienia stanu, na przykład:
methods: {
test(result) {
let accept;
if (result == 'accept') {
accept = true;
} else if (result == 'Not accept') {
accept = false;
} else {
console.log(result);
} return {
success: accept,
danger: !accept,
};
},
}

Mam nadzieję, że to pomogło!
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Po pierwsze, nie jestem pewien, dlaczego masz
not_accept
, czy możesz zamiast tego użyć
! This.accept
?
Nie jestem pewien, dlaczego otrzymałeś to ostrzeżenie, ale oto, co myślę.
Obserwator
v-bind: class
monitoruje zmiany w
item.result
,
this.accept
i
this.not_accept
... Każda zmiana tych wartości spowoduje ponowne renderowanie po ponownym wywołaniu
test
. Ale w ramach
test
zmieniasz
this.accept
i
this.not_accept
, więc Vue musi ponownie sprawdzić, czy wynik zmienił się z tego powodu i póki może

jeszcze raz

zmień
this.accept
i
this.not_accept
i tak dalej.
Powiązanie
class
i dane są nieprawidłowe.
class
ustawi to samo dla każdego elementu, ale wygląda na to, że potrzebujesz niestandardowego stylu dla każdego elementu w zależności od
item .result
. Naprawdę nie powinieneś zmieniać żadnej z właściwości
this
wewnątrz
test
.
Trudno udzielić wyczerpującej odpowiedzi, ponieważ nie jestem do końca pewien, jak działa twój komponent i co powinien robić.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz otrzymać ten błąd, jeśli wywołasz funkcję zamiast przekazywać ją w dyrektywie vue. Oto przykład:
Zrobiłem zwyczaj

dyrektywy, aby załadować dane za pośrednictwem AJAX, gdy wyświetlana jest karta ładowania początkowego
https://gist.github.com/jessli ... 2c1de
.

To jest złe:
>
v-on-show-bs-tab="getFirstPageSites()"

Tutaj wydaje się, że vue wywołuje funkcję (a raczej ocenia wyrażenie) i przekazuje wynik do dyrektywy.

To jest dobre:
>
v-on-show-bs-tab="getFirstPageSites"

Tutaj przekazuję funkcję po nazwie, abym mógł ją nazwać w dyrektywie.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się