vue3点赞与踩逻辑

vue开发项目中,有很多页面需求点击改变文本颜色或背景颜色的点击事件;

这里如需用到标可以先引入;

1.静态布局

1.1.当引入图标完成后我们应该先进行静态页面的布局

<div class="estimate">
            <div
              class="upvote"
              @click="onLike(item.id)"//点击事件,因为这里说是用v-for循环渲染的,所以传id的时候也是同理
              :class="{ active: item.isLikeActive }"
            >
              <i class="iconfont icon-dianzan"></i> // 图标
              <span>{{ item.thumbsup }}</span> //点赞数量
            </div>
            //下面是踩的与上面同理
            <div
              class="disapprove"
              @click="dislike(item.id)" 
              :class="{ active: item.isDislikeActive }"
            >
              <i class="iconfont icon-cai"></i>
              踩
            </div>
          </div>

1.2.css 

.estimate {
        display: flex;
        .upvote,
        .disapprove {
          padding: 6px 8px;
          font-size: 1rem;
          cursor: pointer;
          vertical-align: middle;
          .icon {
            vertical-align: middle;
          }
          &:hover {
            color: #ccc;
          }
        }
      }

1.3.完成上面两个步奏后 效果图为

2.根据上面两个步奏我们已经完成静态的布局,接下来我们需要完成的是js里面的功能

由于我这里使用了setup语法糖,可根据不同语法不同更改

2.1创建一个对象

const tableData = reactive([
  {
    thumbsup: 44,
    stepon: 44,
    isLikeActive: false,
    isDislikeActive: false
  }
])

 我这里的四条数据只是掩饰一下,真实中应该这样写,多个数据通过for遍历

const tableData = reactive([
  {
    id: 1,
    title: '学洗',
    image:
      'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
    date: '2016-05-03',
    name: 'Tom',
    address:
      'No. 189, Grove St, Los Angeles111111111111111111111111111111111111111111111111111111111111',
    thumbsup: 44,
    stepon: 44,
    isLikeActive: false,
    isDislikeActive: false
  },...
])

2.2我们数据跟都准备好了,接下来就要完成点击事件,大家可以看看上面写静态的时候,已经绑定了点击事件,所以我们只需要完成js功能就可以了

// 点赞逻辑
const onLike = (id) => {
  tableData.forEach((item) => {
    if (item.id === id) {
      item.isLikeActive = !item.isLikeActive
      if (item.isLikeActive) {
        item.thumbsup++
        item.isDislikeActive ? item.stepon-- : item.stepon
        item.isDislikeActive = false // 与下面一样由于代码是从上到下执行如果这句话在上面执行三元表达式 则不会执行
      } else {
        item.thumbsup--
      }
      return
    }
  })
}
// 踩逻辑
const dislike = (id) => {
  tableData.forEach((item) => {
    if (item.id === id) {
      item.isDislikeActive = !item.isDislikeActive
      if (item.isDislikeActive) {
        item.stepon++
        item.isLikeActive ? item.thumbsup-- : item.thumbsup
        item.isLikeActive = false
      } else {
        item.stepon--
      }
      return
    }
  })
}

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现点赞功能需要前端和后端的协同工作,具体实现步骤如下: 1. 前端页面实现点赞按钮,点击按钮向后端发送请求。 2. 后端接收到请求后,判断该用户是否已经点过赞,如果没有点过则将点赞记录保存到数据库中,否则返回已经点过赞的提示信息。 3. 前端接收到后端的响应后,根据响应状态进行相应的处理,如更新点赞数、禁用点赞按钮等。 下面是一个简单的实现思路: 1. 前端代码: ```html <template> <div> <button @click="likePost">点赞</button> <p>{{ likeCount }}人已点赞</p> </div> </template> <script> export default { data() { return { postId: 1, // 文章ID likeCount: 0, // 点赞数 isLiked: false // 是否已经点赞 }; }, methods: { async likePost() { if (this.isLiked) return; // 如果已经点过赞,则不再发送请求 const res = await this.$axios.post("/like", { postId: this.postId }); if (res.data.code === 0) { this.isLiked = true; this.likeCount++; } else { alert(res.data.msg); } } }, mounted() { // 获取点赞数和是否已经点赞的状态 this.$axios.get("/like", { params: { postId: this.postId } }).then(res => { if (res.data.code === 0) { this.likeCount = res.data.data.likeCount; this.isLiked = res.data.data.isLiked; } }); } }; </script> ``` 2. 后端代码: ```java @RestController public class LikeController { @Autowired private LikeService likeService; @PostMapping("/like") public Result likePost(@RequestBody Map<String, Object> params) { Integer postId = (Integer) params.get("postId"); Integer userId = 1; // 假设当前用户ID为1 boolean isLiked = likeService.isLiked(postId, userId); if (isLiked) { return Result.fail("您已经点过赞了"); } likeService.saveLike(postId, userId); return Result.ok(); } @GetMapping("/like") public Result getLikeInfo(Integer postId) { Integer userId = 1; // 假设当前用户ID为1 LikeStatusDto likeStatus = likeService.getLikeStatus(postId, userId); return Result.ok(likeStatus); } } @Service public class LikeServiceImpl implements LikeService { @Autowired private LikeMapper likeMapper; @Override public boolean isLiked(Integer postId, Integer userId) { Like like = likeMapper.selectByPostIdAndUserId(postId, userId); return like != null; } @Override public void saveLike(Integer postId, Integer userId) { Like like = new Like(); like.setPostId(postId); like.setUserId(userId); likeMapper.insert(like); } @Override public LikeStatusDto getLikeStatus(Integer postId, Integer userId) { int likeCount = likeMapper.countByPostId(postId); boolean isLiked = isLiked(postId, userId); LikeStatusDto likeStatus = new LikeStatusDto(); likeStatus.setLikeCount(likeCount); likeStatus.setLiked(isLiked); return likeStatus; } } ``` 其中,`Like`类是一个简单的实体类,包含文章ID和用户ID两个属性;`LikeMapper`是用于操作数据库的Mapper类;`LikeService`是用于处理业务逻辑的Service类;`LikeStatusDto`是用于封装点赞数和是否已经点赞的状态的DTO类。 上述代码中,我们使用了`@PostMapping`和`@GetMapping`注解来处理前端发送的POST和GET请求,同时也使用了SpringBoot提供的注解来注入依赖、处理异常等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值