Vue3用户关注与粉丝列表展示

文章目录

    • 说明
    • 功能描述:
    • 代码

说明

该组件主要是通过一个小抽屉进行用户粉丝与关注列表的展示

前提:这里用了elementPlus的组件库所以需要配置好elementPlus的组件库环境

这里采用的是根据传入的用户名进行查询。也可以修改为根据传入的用户id进行查询

功能描述:

  • 抽屉窗
  • 使用el-drawer实现一个侧边弹出窗口,用于显示用户的粉丝和关注列表。
  • 抽屉标题会根据确定的follwerFansType属性动态显示为“粉丝列表”或“关注列表”。
  • 用户信息展示
  • 使用el-cardel-table组件,以表格形式展示粉丝或关注列表的用户数据。
  • 每个用户信息行包括头像、用户名、简介等,头像和用户名可以点击并截图到用户的个人页面。
  • 操作按钮
  • 根据follwerFansType显示不同的按钮状态:
    • 如果是粉丝列表,且双方相互关注,则显示“已互关”按钮。
    • 如果是粉丝列表,且当前用户仅被对方关注,则显示“取消关注”按钮。
    • 否则,显示“关注”按钮。
  • 点击关注或取消关注按钮可直接执行关注或取消关注的操作。
  • 分页功能
  • 使用自定义的分页组件sy-pagination,当翻页时,通过handlePage方法触发分页请求并更新列表数据。
  • 数据获取与监听
  • fetchList根据follwerFansType动态获取粉丝或关注列表的方法。
  • 通过watch监听follwerFansType的变化,若变化则清空列表数据并重新请求。
  • 另外加载新的数据时,会根据当前页面码和用户筛选条件查询数据,并更新总记录数。
  • 关注与取消关注
  • followUser方法用于新增关注者。
  • unfollowUser方法通过确认弹窗执行取消关注操作,成功后会更新用户的关注状态。

代码

<template><el-drawer v-model="drawer" title="粉丝与关注列表" :with-header="false" size="26.5%"><el-card class="followersAndfans-list"><template #header><div class="card-header"><span v-if="props.follwerFansType==='fans'">粉丝列表</span><span v-else>关注列表</span></div></template><el-table :data="userList" style="width: 100%"><!-- 粉丝名和简介列 --><el-table-column label="信息" width="300"><template #default="scope"><div class="user-info"><img :src="scope.row.picture" alt="picture" class="picture"  @click="navigateToUserProfile(scope.row)" /><div class="user-details"><span class="username"  @click="navigateToUserProfile(scope.row)">{{ scope.row.username }}</span><p class="bio">{{ scope.row.description }}</p></div></div></template></el-table-column><!-- 关注按钮列 --><el-table-column label="操作" width="100"><template #default="scope"><el-button v-if="scope.row.follower && follwerFansType==='fans'" type="primary" @click="unfollowUser(scope.row)" size="small" aria-disabled="true">已互关</el-button><el-button v-else-if="scope.row.follower" type="primary" @click="unfollowUser(scope.row)" size="small" aria-disabled="true">取消关注</el-button><el-button v-else type="success" size="small" @click="followUser(scope.row)">关注</el-button></template></el-table-column></el-table></el-card><!-- 分页按钮 --><sy-pagination:page="pageData.page":total="pageData.total":pageSize="pageData.pageSize"@changePage="handlePage"/></el-drawer>
</template><script setup>
import { onMounted, pushScopeId, ref, watch } from 'vue';
import { fetchFollowersList } from '@/api';
import { fetchFansList } from '@/api';
import { follwerAndFans } from '@/api';
import { Unfollow } from '@/api';
const { proxy } = getCurrentInstance();
// 定义并初始化 drawer 变量
const drawer = ref(false);
const userList = ref([]);// 定义props
const props = defineProps({username: {type: String,required: true},follwerFansType: {type: String,required: true,}
});const pageData = ref({username: props.username,page: 1,pageSize: 10,total: 0
});const navigateToUserProfile = (user) => {// 跳转到点击的用户个人页面const userProfileUrl = `/userProfile/${user.id}`;window.open(userProfileUrl, '_blank'); // 在新标签页打开
};// 获取列表数据(即用户数据)
async function fetchList(){await nextTick();// 确保 DOM 更新完成,即确保先将follwerFansType传进来后再执行fetchListpageData.value.username = props.username;if (props.follwerFansType==="fans") {//获取粉丝列表fetchFansList(pageData.value).then(res=>{userList.value.push(...res.data.records);pageData.value.total = res.data.total;})} else {//获取关注列表fetchFollowersList(pageData.value).then(res=>{userList.value.push(...res.data.records);pageData.value.total = res.data.total;})}
};// 监听 follwerFansType 的变化
watch(() => props.follwerFansType, (newVal, oldVal) => {if (newVal !== oldVal) {userList.value = []; // 清空 userListpageData.value.page = 1; // 重置分页信息//校验传入follwerFansType是否变化,变化才重新获取数据,避免重复查询fetchList();}else{return;}
});//分页查询
function handlePage(page) {pageData.value.page++;fetchList();
}; // 新增关注和粉丝
function followUser(user) {follwerAndFans({followerName:user.username,fanName:props.username}).then(res=>{proxy.$modal.msgSuccess(res.msg);})user.follower = true;
}//取消关注
const unfollowUser = (user) => {ElMessageBox.confirm('确定要取消关注吗?', '系统提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {Unfollow({followerName:user.username,fanName:props.username}).then(res=>{proxy.$modal.msgSuccess(res.msg);user.follower = false;})}).catch(() => {});
};// 暴露父组件需要调用的属性何方法
defineExpose({ drawer,fetchList,watch});</script><style scoped>
.picture {width: 50px;height: 50px;border-radius: 50%;margin-right: 10px;
}.user-info {display: flex;align-items: center;
}.user-details {display: flex;flex-direction: column;
}.username {font-weight: bold;
}.bio {color: #999;font-size: 12px;
}
</style>

父组件调用:

引入并声明所需的变量:

import FollowersAndFansList from './FollowersAndFansList.vue';
const FollowersAndFansListRef = ref(null);
const follwerFansType = ref(null);

在需要的地方使用:

<div><FollowersAndFansList :follwerFansType="follwerFansType" :username="user.username" ref="FollowersAndFansListRef" />
</div>

点击后展示的函数

//点击展示关注或者粉丝列表
function followersOrfansHandleClick(type) {if (FollowersAndFansListRef.value) {follwerFansType.value=typeFollowersAndFansListRef.value.drawer = true;FollowersAndFansListRef.value.watch();}
}

为粉丝或者关注添加相应的点击事件,即可

            <el-col :span="6"><div class="grid-content ep-bg-purple"><a class="topBtnItem hand-style" @click="followersOrfansHandleClick('followers')"><el-badge :value="count.followed" :max="100" class="item">关注</el-badge></a></div></el-col><el-col :span="6"><div class="grid-content ep-bg-purple"><a class="topBtnItem hand-style" @click="followersOrfansHandleClick('fans')"><el-badge :value="count.fans" :max="100" class="item">粉丝</el-badge></a></div></el-col>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/458209.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter实战之——模拟登录

本篇介绍使用JMeter 如何对需要登录的站点进行压力测试。 基本Session验证的机制 使用session进行请求验证的机制是一种常见的Web应用认证方式。 该认证方式的主要内容如下&#xff1a; 一、登录过程 用户输入&#xff1a;用户在登录页面输入用户名和密码。发送请求&#x…

JDBC: Java数据库连接的桥梁

什么是JDBC&#xff1f; Java数据库连接&#xff08;Java Database Connectivity&#xff0c;简称JDBC&#xff09;是Java提供的一种API&#xff0c;允许Java应用程序与各种数据库进行交互。JDBC提供了一组标准的接口&#xff0c;开发者可以利用这些接口执行SQL语句、处理结果集…

XQT_UI 组件|02| 按钮 XPushButton

XPushButton 使用文档 简介 XPushButton 是一个自定义的按钮类&#xff0c;基于 Qt 框架构建&#xff0c;提供了丰富的样式和功能选项。它允许开发者轻松创建具有不同外观和行为的按钮&#xff0c;以满足用户界面的需求。 特性 颜色设置&#xff1a;支持多种颜色选择。样式设…

Python之Excel自动化处理(三)

一、Excel数据拆分-xlrd 1.1、代码 import xlrd from xlutils.copy import copydef get_data():wb xlrd.open_workbook(./base_data/data01.xlsx)sh wb.sheet_by_index(0){a: [{},{},{}],b:[{},{},{}],c:[{},{},{}],}all_data {}for r in range(sh.nrows):d {type:sh.cell…

css知识点梳理2

1. 选择器拓展 在 CSS 中&#xff0c;可以根据选择器的类型把选择器分为基础选择器和复合选择器&#xff0c;复合选择器是建立在基础选择器之上&#xff0c;对基本选择器进行组合形成的。 ​ 复合选择器是由两个或多个基础选择器&#xff0c;通过不同的方式组合而成的&#xf…

《a16z : 2024 年加密货币现状报告》解析

加密社 原文链接&#xff1a;State of Crypto 2024 - a16z crypto译者&#xff1a;AI翻译官&#xff0c;校对&#xff1a;翻译小组 当我们两年前第一次发布年度加密状态报告的时候&#xff0c;情况跟现在很不一样。那时候&#xff0c;加密货币还没成为政策制定者关心的大事。 比…

服务器数据恢复—EXT3文件系统下邮件数据被误删的数据恢复案例

服务器数据恢复环境&#xff1a; 邮件服务器中有一组由8块盘组成的RAID5阵列, 上层是Linux操作系统EXT3文件系统。 服务器故障&#xff1a; 由于误删除导致文件系统中的邮件数据丢失。 服务器数据恢复过程&#xff1a; 1、将故障服务器中所有硬盘做好标记后取出&#xff0c;硬…

Python实现Android设备录屏功能及停止录屏功能

1、功能概述&#xff1f; 提供源码下载 之前通过ADB命令实现了实时的录屏功能。但是很遗憾&#xff0c;虽然通过adb命令录屏非常方便&#xff0c;但由于权限限制&#xff0c;无法在安卓系统较高的设备上使用。现选择使用另一开源工具来解决这一问题&#xff0c;并记录使用详细…

pytorh学习笔记——cifar10(六)MobileNet V1网络结构

基础知识储备&#xff1a; 一、深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09; MobileNet的核心是深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09;&#xff0c;深度可分离卷积是卷积神经网络&#xff08;CNN&#xf…

Java 基于 poi 和 itextpdf 实现 excel 转 pdf

目录 问题 实现思路 pom Excel2PDFUtil Excel2PDFUtilTest 输出结果 问题 工作中遇到一个需求&#xff0c;需要实现 excel 文件的预览&#xff0c;实现的思路就是将 excel 转成 pdf 文件&#xff0c;上传到文件服务器上得到文件地址&#xff0c;预览时只需要返回 pdf 预…

UHF机械高频头的知识和待学习的疑问

电路图如上所示&#xff1a; 实物开盖清晰图如下&#xff1a; 待学习和弄懂的知识&#xff1a; 这是一个四腔的短路线谐振。分别是输入调谐&#xff0c;放大调谐&#xff0c;变频调谐和本振 第一个原理图输入为75欧&#xff08;应该是面向有同轴线的天线了&#xff09;如下图…

【vue+leaflet】自定义控件(五)

老规矩, 一健三连, 先赞后看 先看效果图 自定义控件: 支持和自带控件有相同的增删改查功能, 处理与自带控件来回切换,互相使用的部分问题 新建一个组件 imgControl.vue 1, html 没什么东西,就一个div盒子装leaflet图层 <template><div class"imgBox">…

Java | Leetcode Java题解之第513题找树左下角的值

题目&#xff1a; 题解&#xff1a; class Solution {public int findBottomLeftValue(TreeNode root) {int ret 0;Queue<TreeNode> queue new ArrayDeque<TreeNode>();queue.offer(root);while (!queue.isEmpty()) {TreeNode p queue.poll();if (p.right ! nu…

Cursor的composer和chat的应用

提到 Cursor 就不得不提及它的 Composer 功能。“Composer” 的中文释义为 “作曲家”&#xff0c;在此处它有着特定的含义。 Cursor 提供了两种人机对话方式。一种是 Chat&#xff0c;它与 ChatGPT 之类的工具差别不大。另一种则是强大的 Compose。 在编写程序时&#xff0c…

基于GA遗传优化的风光储微电网削峰填谷能量管理系统matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 削峰填谷的基本概念与意义 4.2 GA优化 5.完整工程文件 1.课题概述 基于GA遗传优化的风光储微电网削峰填谷能量管理系统matlab仿真。通过遗传算法优化风光储微电网的充放电控制过程&#xff0c;然后…

配置smaba (Linux与windows通信)

在Ubuntu上安装Samba是一个简单的过程。以下是详细的步骤&#xff0c;帮助你从安装到基本配置。 步骤1&#xff1a;更新软件包列表 首先&#xff0c;打开终端&#xff0c;确保你的软件包列表是最新的&#xff1a; sudo apt update 步骤2&#xff1a;安装 Samba 接下来…

项目部署 —— 前端、后端

一、 前端 ● 二号标题 在命令框里输入 npm run build 打包成功&#xff1a; 项目就会出现一个 dist 文件夹 将Linux的nginx文件夹中&#xff0c;重命名为 news 二、 后端 ● 通过maven打包后端程序 最终会在项目中生成一个 target 文件夹&#xff0c;将 news-1.0-SNAPSHOT.…

汇编语言

前言 汇编语言是各种CPU提供的机器指令的助记符的集合&#xff0c;可以通过汇编语言直接控制硬件系统进行工作&#xff1b; Q&#xff1a;为什么说汇编语言可以直接操作硬件&#xff1f;那么汇编过程还有什么意义呢&#xff1f; A&#xff1a;汇编语言利用助记符代替机器指令的…

Python数据分析——Numpy

纯个人python的一个小回忆笔记&#xff0c;当时假期花两天学的python&#xff0c;确实时隔几个月快忘光了&#xff0c;为了应付作业才回忆起来&#xff0c;不涉及太多基础&#xff0c;适用于有一定编程基础的参考回忆。 这一篇笔记来源于下面哔哩哔哩up主的视频&#xff1a; 一…

反编译华为-研究功耗联网监控日志

摘要 待机功耗中联网目前已知的盲点&#xff1a;App自己都不知道的push类型的被动联网、app下载场景所需时长、组播联网、路由器打醒AP。 竞品 策略 华为 灭屏使用handler定时检测&#xff08;若灭屏30分钟内则周期1分钟&#xff0c;否则为2分钟&#xff09;&#xff0c;检…