gpt4 book ai didi

javascript - Laravel 5 : show comments using Vue.js

转载 作者:行者123 更新时间:2023-12-02 22:50:07 24 4
gpt4 key购买 nike

我正在创建博客评论系统,我想使用 vue.js 显示帖子的评论。在控制台中,它显示

Property or method "comment" is not defined on the instance but referenced during render.

此外,当我 try catch 用户名时,出现此错误

Error in render: "TypeError: Cannot read property 'user' of undefined"

I want to show comments and users who commented to a particular post

在 show.blade.php 中。

web.php

Route::get('results/{post}', 'ResultsController@show')->name('posts.show');

结果 Controller

public function show(Post $post)
{
$recommended_posts = Post::latest()
->whereDate('date','>',date('Y-m-d'))
->where('category_id','=',$post->category_id)
->where('id','!=',$post->id)
->limit(7)
->get();

$posts['particular_post'] = $post;
$posts['recommended_posts'] = $recommended_posts;

//return $post->comments()->paginate(5); it returns objects

return view('posts.show',compact('posts'));
}

评论.vue

<div class="reply-comment" :v-for="comment in comments">
<div class="user-comment" >
<div class="user">
<!--<img src="" alt="" >-->
<avatar :username="comment.user.name" :size="30" ></avatar>
</div>
<div class="user-name">
<span class="comment-name">{{ comment.user.name }}</span>
<p> {{ comment.body }} </p>
</div>
</div>
<div class="reply">
<div class="seemorecomments">
<a href="">see more</a>
</div>
<button class="reply-button">
<i class="fas fa-reply"></i>
</button>
</div>
</div>


<script>
import Avatar from 'vue-avatar'
export default {
props: ['post'],
components: {
Avatar
},
mounted() {
this.fetchComments()
},
data: () => ({
comments: {
data: []
}
}),
methods: {
fetchComments() {
axios.get(`/results/${this.post.id}`).then(({ data }) => {
this.comments = data
})
}
}
}

show.blade.php

<comments-component :post="{{ $posts['particular_post']->comments }}"></comments-component>

迁移表

Schema::create('comments', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('user_id');
$table->integer('post_id');
$table->text('body');
$table->integer('comment_id')->nullable();
$table->timestamps();
});

comment.php,我有这个。

protected $with = ['user'];

最佳答案

您的 Vue 文件存在一些小问题,可以很快解决。

首先,您应该将 comments 定义为一个空数组 - 一个集合将作为对象数组返回到 Vue。通过在开头添加不必要的 data 属性,您可以在检索数据之前允许 v-for 循环在模板中运行。

编辑:我不确定您编写此数据函数的方式,因此我以我熟悉的方式重新编写了它。

data() {
return {
comments: []
}
},

其次,您希望从响应中获取正确的数据。 Axios 数据存储在另一层深度 (response.data)。当然,如果您对结果进行分页,它们会更深一层 (response.data.data)。

fetchComments() {
axios.get(`/results/${this.post.id}`).then(response => {
this.comments = response.data

// or for paginated results
// this.comments = response.data.data
})
}
<小时/>

编辑:感谢您提供要点!我想我现在看得更清楚了。

像这样更新你的 Controller :
您想要将评论加载到此处的帖子中。

public function show(Post $post)
{
$recommended_posts = Post::latest()
->whereDate('date','>',date('Y-m-d'))
->where('category_id','=',$post->category_id)
->where('id','!=',$post->id)
->limit(7)
->get();

// load the post comments here
$post->load('comments');
$posts['particular_post'] = $post;
$posts['recommended_posts'] = $recommended_posts;

return view('posts.show',compact('posts'));
}

你的 Blade 就像这样:
您的模块需要一个帖子,而不是一组评论。

<comments-component :post="{{ $posts['particular_post'] }}"></comments-component>

你的 Vue 是这样的:
您实际上根本不需要使用 Axios,因为我们已经加载了评论。

<script>
import Avatar from 'vue-avatar'
export default {
props: ['post'],
components: {
Avatar
},
data() {
return {
comments: this.post.comments
}
},
}
</script>

关于javascript - Laravel 5 : show comments using Vue.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58213001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com