流浪のwolf

卷帝

导航

点赞,取消点赞组件

<template>
  <div class="collect-container">
    <van-loading v-if="isLoading" type="spinner" color="#1989fa"></van-loading>
    <van-icon
      v-else
      :color="attitude === 1 ? '#ff0000' : '#777'"
      :name="attitude === 1 ? 'good-job' : 'good-job-o'"
      @click="clickHandler"
    />
  </div>
</template>

<script>
import { addLikeArticleApi, delLikeArticleApi } from "@/api/Article";
export default {
  name: "collectArticle",
  data() {
    return {
      isLoading: false, // 节流阀
    };
  },
  props: {
    // 是否点赞,对文章的态度  1   2
    attitude: {
      type: [String, Number],
      required: true,
    },
    // 文章的 id
    articleId: {
      type: [String, Number],
      required: true,
    },
  },
  methods: {
    async clickHandler() {
      // 判断是否登录了,未登录不允许点击
      if (!this.$store.state.user) return this.$toast.fail("登录后才可以操作");
      // 节流阀 => 开始转圈圈
      this.isLoading = true;
      try {
        if (this.attitude === 1) {
          // 去过已经点赞就取消
          await delLikeArticleApi(this.articleId);
        } else {
          // 如果未点赞就点赞
          await addLikeArticleApi({
            target: this.articleId,
          });
        }
        // 更新视图(按钮的状态)
        // vue 是单向数据流传递
        const newNum = this.attitude === 1 ? 0 : 1;
        this.$emit("changeAttitude", newNum);
      } catch (error) {
        console.log({ error });
        this.$toast.fail("操作失败");
      }
      this.isLoading = false;
    },
  },
};
</script>

<style>
</style>

父组件传值 :

   <!-- 点赞组件 likeArticle -->
          <likeArticle
            :article-id="articleInfo.art_id"
            :attitude="articleInfo.attitude"
            @changeAttitude="articleInfo.attitude = $event"
          ></likeArticle>

posted on 2022-10-16 15:33  流浪のwolf  阅读(16)  评论(0编辑  收藏  举报