无法使用 vuejs 3 读取 null 的属性“标题”

mar*_*jib 3 json vue.js

我是新手vuejs3,我尝试使用jsonwith vuejs3,我在视图中显示了课程blog / index,当单击其中的课程时,index它重定向到该课程点击的详细信息,在我的情况下,它给了我错误:Uncaught (in promise) TypeError: Cannot read property 'title' of null

博客/index.vue

<template lang="">
    <div class="row">
       <div class="col-md-6" v-for="post in posts">
          <h1><router-link :to="{ name: 'post-show', params: { id: post.id, slug: post.slug }}">{{ post.title }}</router-link></h1>
          <p class="lead">{{ post.content }}</p>
       </div>
    </div>
</template>
<script>
export default {
    data() {
      return {
         posts: []
      }
    },
    mounted() {
       fetch('http://localhost:5000/posts')
          .then(res => res.json())
          .then(data => this.posts = data)
          .catch(err => console.log(err))
    },
}
</script>
Run Code Online (Sandbox Code Playgroud)

博客/show.vue

<template lang="">
   <h1>{{ post.title }}</h1>
   <p>{{ post.content }}</p>
</template>
<script>
export default {

    props: ['id', 'slug'],
    data(){
        return {
            post: null
        }
    },
    mounted() {
        fetch(`http://localhost:5000/posts/${this.id}`)
          .then(res => res.json())
          .then(data => this.post = data)
          .catch(err => console.log(err))
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

路由器/index.js

  {
        path: '/blog/:id/:slug',
        name: 'post-show',
        component: Show,
        props: true
      },
Run Code Online (Sandbox Code Playgroud)

数据/db.json

{
    "posts": [
        {
           "id": 1,
           "title"  : "learn angular",
           "slug"   : "learn-angular",
           "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Ratione, possimus."
        },
        {
           "id": 2,
           "title"  : "learn react",
           "slug"   : "learn-react",
           "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Ratione, possimus."
        },
        {
           "id": 3,
           "title"  : "learn laravel",
           "slug"   : "learn-laravel",
           "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Ratione, possimus."
        },
        {
           "id": 4,
           "title"  : "learn symfony",
           "slug"   : "learn-symfony",
           "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Ratione, possimus."
        },
        {
           "id": 5,
           "title"  : "learn jee",
           "slug"   : "learn-jee",
           "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Ratione, possimus."
        },
        {
           "id": 6,
           "title"  : "learn php",
           "slug"   : "learn-oracle",
           "content": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Ratione, possimus."
        }
     ],
     "users": []
}
Run Code Online (Sandbox Code Playgroud)

Jor*_*dan 13

问题出在你的blog/show.vue文件上。

请注意在您的数据中,如何post设置为null

当您的组件安装时,它会尝试读取post.titlepost.content但失败,因为post尚未包含这些属性。

检索和设置发布数据的方法仅在组件安装后运行。

一种方法是不显示<h1><p>标签,直到post数据不再null使用类似属性v-if="post"

或者,您可以通过将其设为对象来为您的帖子设置一些默认值:

post: {
   title: '',
   content: '',
}
Run Code Online (Sandbox Code Playgroud)

这样,当组件安装时,属性title就会content存在。

最后,您可以使用三元:

<h1>{{ post ? post.title: '' }}</h1>
<p>{{ post ? post.content: '' }}</p>
Run Code Online (Sandbox Code Playgroud)

在这种方法中,如果 post 存在,它将呈现属性 - 否则它呈现一个空字符串。