# 点赞与收藏
# 技术点
颗粒化组件 注册全局组件
# 1 目录结构
└─ src                          
   └─ components                
      └─ Tool            
         ├─ UserCollection      # 用户收藏
         └─ UserLike            # 用户点赞
# 2 使用地方
评论的点赞功能未使用该组件,因为评论点赞的数据量后期会很大,所以单独设计。
主要使用在 review, article, video 等组件中。
# 3 组件详解
以下以点赞组件为例
<div
    class="tool-item"
    :class="{ 'is-disabled': data.allow_like }"
    @click="likeClick()"
>
    <div class="tool-item-icon" :class="{ 'is-checked': data.is_like }">
        <!-- 点赞图标 -->
        <i class="m-icon m-icon-like-fill"></i>
    </div>
    <!-- 点赞数量 -->
    <div class="tool-item-count">{{ data.like_count || defaultCount }}</div>
</div>
// 引入点赞与取消点赞按钮
import { createLike, deleteLike } from "@/api/user";
export default {
    name: "UserLike",
    props: {
        // 资源类型,支持 photos、articles、videos等
        type: {
            required: true,
            type: String,
        },
        // 点赞数据
        data: {
            required: true,
            type: Object,
        },
        // 点赞数量默认值,如无点赞,则显示"喜欢"
        defaultCount: {
            default: "喜欢",
        },
    },
    methods: {
        async likeClick() {
        // 不允许点赞
            if (this.data.allow_like === 0) {
                return;
            }
            // 已经发起点赞或取消点赞时,不可重复发起请求
            if (this.loading) return;
            this.loading = true;
            let { code, data } = this.data.is_like
                ? await deleteLike(this.type, this.data.id)
                : await createLike(this.type, this.data.id);
            this.loading = false;
            if (code === 200) {
                // this.$emit("on-change", data);
                Object.assign(this.data, data);
            }
        },
    },
};
# 组件注册
在 main.js 中,引入并注册该组件
import UserLike from "./components/Tool/UserLike/index";
Vue.use(UserLike);
# 组件使用
<!-- 以照片点赞为例 -->
<user-like type="photos" :data="photo" default-count="" />