Простой пример Nativescript Vue create() mount () никогда не запускается
Ниже приведен очень простой пример Nativescript Vue от начинающего пользователя. Как показано ниже, он отображает список из 5 заголовков сообщений.
Так что выше тест хорошо начать, пока я использую только computed
вернуть данные в шаблон. Однако, если я попытаюсь использовать create()
или же mounted()
события / жизненный цикл, чтобы установить posts
собственность, я ничего не получаю на дисплее. console.log
линии никогда не отображают сообщение, поэтому они никогда не стреляют. Почему бы и нет?
Кроме того, если я пытаюсь использовать выборку (позвоните fetchPosts()
метод) вытащить посты из тест рестави, я не получаю данных и console.error
ничего не показывает Почему бы и нет?
<template>
<Page class="page">
<ActionBar class="action-bar">
<Label class="action-bar-title" text="Home"></Label>
</ActionBar>
<ScrollView>
<StackLayout class="home-panel">
<!--Add your page content here-->
<Label v-for="post in posts" :text="post.title" :key="post.id"/>
</StackLayout>
</ScrollView>
</Page>
</template>
<script>
export default {
// posts: [],
// create() {
// console.log("create event fired");
// this.posts = this.getPosts();
// },
// mounted() {
// console.log("mounted event fired");
// this.posts = this.getPosts();
// },
computed: {
posts() {
//return this.fetchPosts();
return this.getPosts();
}
},
methods: {
fetchPosts() {
fetch("https://jsonplaceholder.typicode.com/posts")
.then(res => res.json())
.then(res => {
console.log("fetch response", res);
return res;
})
.catch(err => {
console.error(err);
return [{ id: 0, title: "Error: " + err }];
});
},
getPosts() {
return [
{
userId: 1,
id: 1,
title:
"sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
body:
"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
userId: 1,
id: 2,
title: "qui est esse",
body:
"est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
},
{
userId: 1,
id: 3,
title: "ea molestias quasi exercitationem repellat qui ipsa sit aut",
body:
"et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"
},
{
userId: 1,
id: 4,
title: "eum et est occaecati",
body:
"ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit"
},
{
userId: 1,
id: 5,
title: "nesciunt quas odio",
body:
"repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque"
}
];
}
}
};
</script>
<style scoped lang="scss">
// Start custom common variables
@import "../app-variables";
// End custom common variables
// Custom styles
.fa {
color: $accent-dark;
}
.info {
font-size: 20;
}
</style>
1 ответ
Есть некоторые проблемы, которые я идентифицирую в вашем коде:
- правильное имя крюка жизненного цикла
created
неcreate
posts
список должен быть внутриdata
:data() { return { posts: [] }; },
fetchPosts()
ничего не возвращает, но вы ожидаете вернутьposts
, Вы должны установитьposts
внутриthen
Перезвоните:fetchPosts() { fetch("https://jsonplaceholder.typicode.com/posts") .then(res => res.json()) .then(res => this.posts = res) .catch(err => console.error(err)); }
а это потому что
fetch
возвращаетPromise
, Q: Как вернуть данные изPromise
? A: Вы не можете!
Полный код:
<script>
export default {
data() {
return {
posts: [{
title: '1 Title',
id: 1
}]
};
},
created() {
console.log("create event fired");
this.posts = this.fetchPosts();
},
mounted() {
console.log("mounted event fired");
this.fetchPosts();
},
methods: {
fetchPosts() {
return fetch("https://jsonplaceholder.typicode.com/posts")
.then(res => res.json())
.then(res => this.posts = res);
}
}
};
</script>
Код был протестирован здесь.
Для меня это тоже не стрельба, вместо использования смонтированного или созданного я добавил загруженное событие в элемент страницы
<template>
<page @loaded="startMyApp">
......
</template>
<script>
export default {
data() {
return {
}
},
methods: {
startMyApp()
{
}
}
</script>