【前端Vue】社交信息头条项目完整笔记第4篇:五、首页—频道编辑,处理页面弹出层【附代码文档】

本文主要是介绍【前端Vue】社交信息头条项目完整笔记第4篇:五、首页—频道编辑,处理页面弹出层【附代码文档】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

社交媒体-信息头条项目完整开发笔记完整教程(附代码资料)主要内容讲述:一、项目初始化使用 Vue CLI 创建项目,加入 Git 版本管理,调整初始目录结构,导入图标素材,引入 Vant 组件库,移动端 REM 适配。二、登录注册准备,实现基本登录功能,登录状态提示,表单验证,验证码处理,处理用户 Token。三、个人中心,四、首页—文章列表TabBar 处理,页面布局,处理已登录和未登录的页面展示,用户退出,展示登录用户信息,优化设置 Token。五、首页—频道编辑处理页面弹出层,创建频道编辑组件,页面布局,展示我的频道,展示推荐频道列表,添加频道。六、文章搜索创建组件并配置路由,页面布局,处理页面显示状态,搜索联想建议,搜索结果,搜索历史记录。七、文章详情创建组件并配置路由,页面布局,关于后端返回数据中的大数字问题,展示文章详情,处理内容加载状态,关于文章正文的样式。八、文章评论展示文章评论列表,评论点赞,发布文章评论,评论回复。九、用户页面创建组件并配置路由,页面布局,展示用户信息,用户关注,展示用户文章列表。十二、编辑用户资料创建组件并配置路由,页面布局,展示用户信息,修改昵称,修改性别,修改生日。

全套笔记资料代码移步: 前往gitee仓库查看

感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~


全套教程部分目录:


部分文件图片:

五、首页—频道编辑

处理页面弹出层

Vant 中内置了 [Popup 弹出层]( 组件。

1、在 data中添加一个数据用来控制弹层的显示和隐藏

data () {return {...isChannelEditShow: true // 这里我们先设置为 true 就能看到弹窗的页面了}
}

2、然后在首页模板中的频道列表后面添加弹出层组件

<!-- 频道编辑 -->
<van-popupclass="edit-channel-popup"v-model="isEditChannelShow"position="bottom":style="{ height: '100%' }"closeableclose-icon-position="top-left"
>内容</van-popup>
<!-- /频道编辑 -->
.edit-channel-popup {padding-top: 100px;box-sizing: border-box;
}

测试查看结果。

创建频道编辑组件

1、创建 views/home/components/channel-edit.vue

<template><div class="channel-edit">频道编辑</div>
</template><script>
export default {name: 'ChannelEdit',components: {},props: {},data () {return {}},computed: {},watch: {},created () {},mounted () {},methods: {}
}
</script><style scoped lang="less"></style>

2、在首页中加载注册

import ChannelEdit from './components/channel-edit'
export default {...components: {...ChannelEdit}
}

3、在弹出层中使用频道编辑组件

<!-- 频道编辑 -->
<van-popupv-model="isChannelEditShow"position="bottom"closeableclose-icon-position="top-left":style="{ height: '100%' }"
>
+  <channel-edit />
</van-popup>
<!-- /频道编辑 -->

页面布局

<template><div class="channel-edit"><van-cell title="我的频道" :border="false"><van-buttonsize="mini"roundtype="danger"plain>编辑</van-button></van-cell><van-grid :gutter="10"><van-grid-itemclass="channel-item"v-for="value in 8":key="value"text="文字"/></van-grid><van-cell title="频道推荐" :border="false"></van-cell><van-grid :gutter="10"><van-grid-itemclass="channel-item"v-for="value in 8":key="value"text="文字"/></van-grid></div>
</template><script>
export default {name: 'ChannelEdit',components: {},props: {},data () {return {}},computed: {},watch: {},created () {},mounted () {},methods: {}
}
</script><style scoped lang="less">
.channel-edit {.channel-item {height: 86px;/deep/ .van-grid-item__content {background-color: #f5f5f6;.van-grid-item__text {color: #222;font-size: 28px;}}}
}
</style>

展示我的频道

1、在父组件中把 channels 传递给频道编辑组件

image-20200316002816033

2、在频道编辑组件中声明接收父组件的 userChannels 频道列表数据并遍历展示

image-20200316002911027

image-20200316002958971

展示推荐频道列表

1571040968593

没有用来获取推荐频道的数据接口,但是我们有获取所有频道列表的数据接口。

所以:所有频道列表 - 我的频道 = 剩余推荐的频道

实现过程所以一共分为两大步:

  • 获取所有频道
  • 基于所有频道和我的频道计算获取剩余的推荐频道

获取所有频道

1、封装数据接口

/*** 获取所有频道*/
export const getAllChannels = () => {return request({method: 'GET',url: '/app/v1_0/channels'})
}

2、在编辑频道组件中请求获取所有频道数据

image-20200316021948407

image-20200316022017473

3、在调试工具中测试是否有拿到数据

处理展示推荐频道

思路:所有频道 - 用户频道 = 推荐频道

1、封装计算属性筛选数据

image-20200316022123370

  • 遍历所有频道
  • 对每一个频道都判断:该频道是否属于我的频道
  • 如果不属于我的频道,则收集起来
  • 直到遍历结束,剩下来就是那些剩余的推荐频道

2、模板绑定

image-20200316022153646

添加频道

频道管理-添加频道

思路:

  • 给推荐频道列表中每一项注册点击事件
  • 获取点击的频道项
  • 将频道项添加到我的频道中
  • ~~将当前点击的频道项从推荐频道中移除~~
  • 不需要删除,因为我们获取数据使用的是计算属性,当我频道发生改变,计算属性重新求值了

1、给推荐频道中的频道注册点击事件

image-20200316030501261

2、在添加频道事件处理函数中

image-20200316030518012

然后你会神奇的发现点击的那个推荐频道跑到我的频道中了,我们并没有去手动的删除点击的这个推荐频道,但是它没了!主要是因为推荐频道是通过一个计算属性获取的,计算属性中使用了 channels(我的频道)数据,所以只要我的频道中的数据发生变化,那么计算属性就会重新运算获取最新的数据。

编辑频道

思路:

  • 给我的频道中的频道项注册点击事件
  • 在事件处理函数中
  • 如果是编辑状态,则执行删除频道操作
  • 如果是非编辑状态,则执行切换频道操作

处理编辑状态

1、在 data 中添加数据用来控制编辑状态的显示

image-20200316033317098

2、在我的频道项中添加删除图标

image-20200316033121847

image-20200316033200148

3、处理点击编辑按钮

image-20200316033239687

切换频道

功能需求:在非编辑器状态下切换频道。

1、给我的频道项注册点击事件

image-20200316040309812

2、处理函数

image-20200316040344551

3、在父组件中监听处理自定义事件

image-20200316040428331

让激活频道高亮

思路:

  • 将首页中的激活的标签索引传递给频道编辑组件
  • 在频道编辑组件中遍历我的频道列表的时候判断遍历项的索引是否等于激活的频道标签索引,如果一样则作用一个高亮的 CSS 类名

1、将首页组件中的 active 传递到频道编辑组件中

image-20200316004637299

2、在频道编辑组件中声明 props 接收

image-20200316004657340

3、判断遍历项,如果 遍历项索引 === active,则给这个频道项设置高亮样式

image-20200316004830847

image-20200316004847629

删除频道

功能需求:在编辑状态下删除频道。

image-20200316042008623

频道数据持久化

业务分析

频道编辑这个功能,无论用户是否登录用户都可以使用。

不登录也能使用

  • 数据存储在本地
  • 不支持同步功能

登录也能使用

  • 数据存储在线上后台服务器
  • 更换不同的设备可以同步数据

添加频道

思路:

  • 如果未登录,则存储到本地
  • 如果已登录,则存储到线上
  • 找到数据接口
  • 封装请求方法
  • 请求调用

1、封装添加频道的请求方法

/*** 添加用户频道*/
export const addUserChannel = channels => {return request({method: 'PATCH',url: '/app/v1_0/user/channels',data: {channels}})
}

2、修改添加频道的处理逻辑

async onAddChannel (channel) {try {this.userChannels.push(channel)if (this.user) {// 已登录,数据存储到线上await addUserChannel([{id: channel.id, // 频道 idseq: this.userChannels.length // 频道的 序号}])} else {// 未登录,数据存储到本地setItem('channels', this.userChannels)}} catch (err) {console.log(err)this.$toast('添加频道失败')}
},

删除频道

思路:

  • 如果未登录,则存储到本地
  • 如果已登录,则存储到线上
  • 找到数据接口
  • 封装请求方法
  • 请求调用

1、封装删除用户频道请求方法

/*** 删除用户频道*/
export const deleteUserChannel = channelId => {return request({method: 'DELETE',url: `/app/v1_0/user/channels/${channelId}`})
}

2、修改删除频道的处理逻辑

image-20200316051028617

async deleteChannel (channel) {try {if (this.user) {// 已登录,将数据存储到线上await deleteUserChannel(channel.id)} else {// 未登录,将数据存储到本地setItem('channles', this.userChannels)}} catch (err) {console.log(err)this.$toast('删除频道失败,请稍后重试')}
}

正确的获取首页频道列表数据

首页-获取频道列表

提示:获取登录用户的频道列表和获取默认推荐的频道列表是同一个数据接口。后端会根据接口中的 token 来判定返回数据。

async loadChannels () {try {let channels = []if (this.user) {// 已登录,请求获取线上的频道数据const { data } = await getChannels()channels = data.data.channels} else {// 未登录const localChannels = getItem('channels')if (localChannels) {// 有本地频道数据,则使用channels = localChannels} else {// 没有本地频道数据,则请求获取默认推荐的频道列表const { data } = await getChannels()channels = data.data.channels}}// 将数据更新到组件中this.channels = channels} catch (err) {console.log(err)this.$toast('数据获取失败')}
},

未完待续, 同学们请等待下一期

全套笔记资料代码移步: 前往gitee仓库查看

感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~

这篇关于【前端Vue】社交信息头条项目完整笔记第4篇:五、首页—频道编辑,处理页面弹出层【附代码文档】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/897300

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n