typescript - Vue.js 3 Composition API vs. Options API
Kan noen forklare hvorfor dette ikke fungerer med script-setup, men uten det fungerer.
I malen bruker jeg v-for for å iterere gjennom string[]:
<div v-for="lang in data.translatedLanguages" class="translationTableBodyRow">
<div class="translationTableBodyCell">xx</div>
<div class="translationTableBodyCell">{{ lang }}</div>
<div class="translationTableBodyCell">10 %</div>
<div class="translationTableBodyCell">Edit</div>
</div>
Kode med <script lang="ts">:
Fungerer, v-for finner elementene og jeg ser radene.
<script lang="ts">
import axios, {isCancel, AxiosError} from 'axios';
import { defineComponent } from 'vue'
export default defineComponent({
data() {
return {
data: { translatedLanguages: [] }
}
},
mounted() {
axios.get("https://translation.colreminder.com/test/data.php?request=langTranslated").then(response => {
console.log(response.request.response);
this.data = JSON.parse(response.request.response)
this.data.translatedLanguages
console.log(this.data.translatedLanguages);
});
}
});
</script>
Skript med <script setup lang="ts">:
Fungerer ikke, jeg ser ingen rader fordi v-for ser ikke ut til å finne elementene, men dataobjektet er ikke tomt.
<script lang="ts">
import axios, {isCancel, AxiosError} from 'axios';
import { onMounted, reactive, VueElement } from 'vue';
import type { LanguagesTranslated } from './main';
var data: LanguagesTranslated = { translatedLanguages: [] };
onMounted(() => {
axios.get("https://translation.colreminder.com/test/data.php?request=langTranslated").then(response => {
console.log(response.request.response);
data = JSON.parse(response.request.response);
console.log(data.translatedLanguages);
});
});
</script>
SpråkOversatt er dette grensesnittet:
export interface LanguagesTranslated {
translatedLanguages: string[];
}
Svar #1
Ditt første eksempel bruker Options API. Når du bruker Options API, blir egenskapene i objektet som returneres av data() gjort reaktive automatisk.
Funksjonen setup() og <script setup> er de to måtene å bruke Composition API på. Når du bruker Composition API, oppfører koden din seg mer som vanlig JavaScript. For å opprette en reaktiv variabel må du eksplisitt opprette den ved å bruke en av funksjonene i Reaktivitet API: ref(), reactive(), eller computed().
Siden eksemplet ditt med <script setup> oppretter en vanlig variabel, er den ikke reaktiv, og v-for evalueres ikke på nytt når du tildeler den på nytt.
Prøv dette:
<script setup lang="ts">
import axios, { isCancel, AxiosError } from 'axios';
import { ref, onMounted } from 'vue';
import type { LanguagesTranslated } from './main';
// Use `ref` here to create a Ref.
const data = ref<LanguagesTranslated>({ translatedLanguages: [] });
onMounted(() => {
axios
.get("https://translation.colreminder.com/test/data.php?request=langTranslated")
.then(response => {
console.log(response.request.response);
// Use `data.value`, as `data` is a Ref.
data.value = JSON.parse(response.request.response);
console.log(data.value.translatedLanguages);
});
});
</script>
