当前位置:首页 > VUE

vue实现帖子点赞

2026-02-24 12:48:16VUE

实现帖子点赞功能

在Vue中实现帖子点赞功能,通常需要结合前端交互和后端数据存储。以下是具体实现方法:

前端组件实现

创建点赞按钮组件,使用Vue的响应式数据管理点赞状态:

vue实现帖子点赞

<template>
  <button @click="handleLike" :class="{ 'liked': isLiked }">
    {{ likeCount }} {{ isLiked ? '已赞' : '点赞' }}
  </button>
</template>

<script>
export default {
  props: {
    postId: Number,
    initialLiked: Boolean,
    initialLikeCount: Number
  },
  data() {
    return {
      isLiked: this.initialLiked,
      likeCount: this.initialLikeCount
    }
  },
  methods: {
    async handleLike() {
      try {
        const response = await axios.post(`/api/posts/${this.postId}/like`)
        this.isLiked = !this.isLiked
        this.likeCount = this.isLiked ? this.likeCount + 1 : this.likeCount - 1
      } catch (error) {
        console.error('点赞操作失败', error)
      }
    }
  }
}
</script>

<style scoped>
button {
  background: #fff;
  border: 1px solid #ccc;
  padding: 5px 10px;
  cursor: pointer;
}

.liked {
  background: #1890ff;
  color: white;
}
</style>

后端API接口

Node.js示例实现点赞API接口:

// Express路由
router.post('/posts/:id/like', async (req, res) => {
  try {
    const postId = req.params.id
    const userId = req.user.id // 从认证中获取用户ID

    // 检查用户是否已点赞
    const existingLike = await Like.findOne({ 
      where: { postId, userId }
    })

    if (existingLike) {
      // 取消点赞
      await existingLike.destroy()
      await Post.decrement('likeCount', { where: { id: postId } })
      return res.json({ liked: false })
    } else {
      // 添加点赞
      await Like.create({ postId, userId })
      await Post.increment('likeCount', { where: { id: postId } })
      return res.json({ liked: true })
    }
  } catch (error) {
    res.status(500).json({ error: '操作失败' })
  }
})

数据库设计

MySQL关系表结构设计:

vue实现帖子点赞

CREATE TABLE posts (
  id INT AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  content TEXT,
  like_count INT DEFAULT 0,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE likes (
  id INT AUTO_INCREMENT PRIMARY KEY,
  post_id INT NOT NULL,
  user_id INT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
  UNIQUE KEY (post_id, user_id)
);

优化点赞体验

实现即时反馈的优化方案:

// 在组件中添加防抖处理
methods: {
  handleLike: _.debounce(async function() {
    const action = this.isLiked ? 'unlike' : 'like'
    this.isLiked = !this.isLiked
    this.likeCount = this.isLiked ? this.likeCount + 1 : this.likeCount - 1

    try {
      await axios.post(`/api/posts/${this.postId}/${action}`)
    } catch (error) {
      // 回滚UI状态
      this.isLiked = !this.isLiked
      this.likeCount = this.isLiked ? this.likeCount + 1 : this.likeCount - 1
      alert('操作失败,请重试')
    }
  }, 300)
}

用户界面状态管理

使用Vuex管理全局点赞状态:

// store/modules/posts.js
const actions = {
  async toggleLike({ commit }, postId) {
    commit('TOGGLE_LIKE', postId)
    try {
      await api.toggleLike(postId)
    } catch (error) {
      commit('TOGGLE_LIKE', postId) // 出错时回滚
    }
  }
}

const mutations = {
  TOGGLE_LIKE(state, postId) {
    const post = state.posts.find(p => p.id === postId)
    if (post) {
      post.isLiked = !post.isLiked
      post.likeCount += post.isLiked ? 1 : -1
    }
  }
}

以上方案实现了完整的点赞功能,包括前端交互、后端API、数据库设计以及状态管理优化。

标签: 帖子vue
分享给朋友:

相关文章

vue 动画实现

vue 动画实现

Vue 动画实现方式 Vue 提供了多种方式实现动画效果,主要分为内置组件和第三方库集成。 使用 Vue 内置过渡组件 Vue 的 <transition> 和 <transiti…

vue 菜单实现

vue 菜单实现

Vue 菜单实现方法 在Vue中实现菜单功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-for动态生成菜单 通过数据驱动的方式动态渲染菜单项,适合菜单内容可能变化的场景: <t…

vue实现hexo

vue实现hexo

Vue 集成 Hexo 的实现方法 Hexo 是一个静态博客框架,而 Vue 是一个前端框架。将 Vue 集成到 Hexo 中可以通过以下方式实现: 在 Hexo 中使用 Vue 组件 通过 Hex…

vue实现fragment

vue实现fragment

Vue 实现 Fragment 的方法 在 Vue 中,Fragment 允许组件返回多个根节点而不需要包裹一个额外的 DOM 元素。以下是几种实现方式: 使用 Vue 3 的 <templa…

vue实现烟花

vue实现烟花

Vue 实现烟花效果 在 Vue 中实现烟花效果可以通过结合 CSS 动画和 JavaScript 动态生成烟花元素。以下是具体实现方法: 动态生成烟花元素 通过 Vue 的 v-for 动态生成烟…

vue如何实现登录

vue如何实现登录

实现登录功能的基本步骤 使用Vue实现登录功能通常需要结合后端API、状态管理以及路由控制。以下是常见的实现方式: 创建登录表单组件 在Vue组件中构建包含用户名和密码输入框的表单: <te…