vue实现评论列表功能

下面是vue实现评论列表功能的完整攻略。

1. 初始化

首先,我们需要使用vue-cli初始化一个项目,使用以下命令:

vue create project-name

初始化完成后,我们需要安装axios和bootstrap,使用以下命令:

npm install axios bootstrap

2. 创建数据模型

我们需要先定义一个评论数据的模型,包含评论的id、内容、用户、时间等信息。例如:

{
  id: 1,
  content: '这是一个评论',
  user: '小明',
  time: '2021-07-01 10:00:00'
}

我们可以将模型放在一个单独的js文件中,例如:

export default {
  id: Number,
  content: String,
  user: String,
  time: String
}

3. 定义组件

接下来,我们需要定义一个评论列表组件和一个评论输入组件。

评论列表组件需要包含以下功能:

  • 获取评论列表数据
  • 渲染评论列表
  • 支持翻页
  • 支持删除评论

评论列表组件的代码示例:

<template>
  <div>
    <h2>评论列表</h2>
    <ul class="list-group">
      <li class="list-group-item" v-for="comment in comments" :key="comment.id">
        <p>{{comment.content}}</p>
        <small>{{comment.user}} {{comment.time}}</small>
        <button class="btn btn-sm btn-danger float-right" @click="deleteComment(comment.id)">删除</button>
        <hr>
      </li>
    </ul>
    <nav v-if="totalPage>1">
      <ul class="pagination">
        <li class="page-item" v-if="currentPage>1" @click="changePage(currentPage-1)"><a class="page-link" href="#">上一页</a></li>
        <li class="page-item" v-for="page in totalPage" :key="page" :class="{ active: currentPage==page }" @click="changePage(page)"><a class="page-link" href="#">{{page}}</a></li>
        <li class="page-item" v-if="currentPage<totalPage" @click="changePage(currentPage+1)"><a class="page-link" href="#">下一页</a></li>
      </ul>
    </nav>
  </div>
</template>

<script>
export default {
  data() {
    return {
      currentPage: 1,
      pageSize: 10,
      total: 0,
      comments: []
    }
  },
  created() {
    this.getComments()
  },
  methods: {
    getComments() {
      axios.get(`/api/comments?page=${this.currentPage}&pageSize=${this.pageSize}`).then(res => {
        this.comments = res.data.list
        this.total = res.data.total
      })
    },
    deleteComment(id) {
      axios.delete(`/api/comment/${id}`).then(res => {
        this.getComments()
      })
    },
    changePage(page) {
      this.currentPage = page
      this.getComments()
    }
  },
  computed: {
    totalPage() {
      return Math.ceil(this.total / this.pageSize)
    }
  }
}
</script>

其中,getComments方法用于获取评论列表数据,deleteComment方法用于删除评论,changePage方法用于切换页码。这些方法都需要通过调用后端接口来实现。

评论列表组件还需要在created生命周期中调用getComments方法,以获取初始评论列表数据。

评论输入组件需要包含以下功能:

  • 输入评论内容
  • 点击提交按钮提交评论

评论输入组件的代码示例:

<template>
  <form>
    <div class="form-group">
      <label for="content">评论内容</label>
      <textarea class="form-control" id="content" rows="3" v-model="content"></textarea>
    </div>
    <button type="submit" class="btn btn-primary" @click.prevent="submitComment">提交</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      content: ''
    }
  },
  methods: {
    submitComment() {
      axios.post('/api/comment', { content: this.content }).then(res => {
        this.content = ''
        this.$emit('add-comment')
      })
    }
  }
}
</script>

其中,submitComment方法用于提交评论内容,提交成功后会清空输入框并触发add-comment事件,以通知评论列表组件刷新数据。

4. 调用后端接口

getCommentsdeleteCommentsubmitComment等方法中,我们需要调用后端提供的接口来实现数据的获取、删除和添加。这里我们假设后端提供了以下接口:

  • GET /api/comments?page=X&pageSize=Y:获取评论列表数据,X为页码,Y为每页条数。
  • DELETE /api/comment/:id:根据id删除一条评论。
  • POST /api/comment:添加一条评论,content为评论的内容。

在实际项目中,这些接口需要根据后端实际实现进行调整。

5. 父子组件通信

最后,我们需要将评论输入组件和评论列表组件组合起来使用。为了让评论输入组件和评论列表组件进行通信,我们可以使用$emit方法来触发自定义事件,例如在评论输入组件中触发add-comment事件,以通知评论列表组件刷新数据。

组合后的代码示例:

<template>
  <div>
    <comment-input @add-comment="getComments"></comment-input>
    <comment-list></comment-list>
  </div>
</template>

<script>
import CommentInput from './CommentInput.vue'
import CommentList from './CommentList.vue'

export default {
  components: {
    CommentInput,
    CommentList
  },
  methods: {
    getComments() {
      this.$refs.commentList.getComments()
    }
  }
}
</script>

其中,$refs.commentList指向评论列表组件的实例,getComments方法通过该实例调用获取评论数据的方法,以刷新评论列表。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现评论列表功能 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue2 响应式系统之数组

    Vue2响应式系统之数组 在Vue2的响应式系统中,对于数组的变化是具有特殊处理的。当数组发生变化时,Vue会自动检测和触发视图的更新。下面,我们来详细讲解Vue2响应式系统中数组的完整攻略。 直接更改数组的值 我们可以直接使用常规数组的方法更改数组的值,例如使用push、pop、splice等方法,Vue会检测到这些变化并更新视图。下面是一个示例说明: l…

    Vue 2023年5月27日
    00
  • 输入npm run xxx后执行原理深入解析

    输入npm run xxx后执行原理深入解析 1. npm run xxx的作用 npm run xxx是用来执行在项目package.json文件中scripts字段中定义的脚本命令xxx。 例如在package.json文件中,定义了以下脚本: "scripts": { "start": "node ap…

    Vue 2023年5月28日
    00
  • vue+jsplumb实现工作流程图的项目实践

    下面我将详细讲解一下“vue+jsplumb实现工作流程图的项目实践”的攻略步骤。 步骤一:安装vue及相关插件 第一步是安装Vue.js,可以使用npm或yarn进行安装。同时,还需要安装Vue Router和Vue Resource插件来支持我们实现跨组件通信和网络请求。 npm install vue vue-router vue-resource -…

    Vue 2023年5月28日
    00
  • 详解Vue的sync修饰符

    Vue的sync修饰符是一个用于实现双向绑定的语法糖,它能够将一个组件的数据状态同步到父组件中,并且在修改子组件数据时,自动更新父组件的状态。 什么是Vue的sync修饰符 sync修饰符是一个特殊的写法,它可以简化我们在组件通信过程中使用v-on和v-bind的写法。 我们都知道,在Vue中,子组件不能直接修改父组件的状态,这是为了保证整个应用程序的稳定性…

    Vue 2023年5月28日
    00
  • VUE v-for循环中每个item节点动态绑定不同函数的实例

    要实现在VUE v-for循环中每个item节点动态绑定不同函数的实例,可以使用以下步骤: 在每个item节点上绑定一个唯一的key值,以便Vue能够追踪节点的增、删、移动操作。 <ul> <li v-for="(item, index) in items" :key="item.id"> {{…

    Vue 2023年5月28日
    00
  • 浅谈Vue响应式(数组变异方法)

    浅谈Vue响应式(数组变异方法) 什么是Vue响应式 Vue.js是一款轻量级的、渐进式的JavaScript框架,它采用数据驱动视图的思想,通过对数据的绑定,前端开发者可以更加方便的进行数据的处理和控制。Vue.js的核心理念是响应式编程,也就是当数据发生变化时,我们的视图会自动更新。 数组变异方法 Vue将一些常用的JavaScript数组操作方法进行了…

    Vue 2023年5月27日
    00
  • 浅谈Vue.js路由管理器 Vue Router

    下面我来为大家详细讲解一下“浅谈Vue.js路由管理器 Vue Router”的完整攻略。 1. 什么是Vue Router Vue Router 是 Vue.js 官方的路由管理器,它和 Vue.js 的核心深度集成,可以让我们轻松地实现单页面应用程序 (SPA) 的路由功能。Vue Router 基于Vue.js强大的组件化和数据响应能力,可以非常方便地…

    Vue 2023年5月27日
    00
  • Vue程序化的事件监听器(实例方案详解)

    关于“Vue程序化的事件监听器(实例方案详解)”的完整攻略,我这里给出以下内容: 什么是程序化的事件监听器 程序化的事件监听器,顾名思义就是通过编写程序来实现对一些特定事件的监听。在Vue中,可以通过编写一些代码来监听某些事件的发生,这些事件可以是页面的滚动、鼠标的点击或移动等等。 如何在Vue中实现程序化的事件监听器 在Vue中实现程序化的事件监听器通常有…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部