uniapp - 文章模块页面

news2024/11/17 12:29:10

在上一篇文章中,创建了一个空白的文章模块页面。在这一篇文章,让我们来向页面中填充内容。

目录

  • 页面效果
  • 涉及uniapp组件
    • 1.view
    • 2.swiper
    • 3.scroll-view
    • 4.属性解读
      • 1) class="style1 style2 .."
      • 2) circular单属性无赋值
      • 3) :autoplay="autoplay"
      • 4) @scrolltolower=“lower”属性前加@
  • 一、顶部banner图
  • 二、静态按钮列表
  • 三、横向滚动图
  • 四、动态列表 + 详情跳转
  • 五、详情页面
  • 参考资料

页面效果

填充前的页面
![填充前](https://img-blog.csdnimg.cn/direct/2a1b2998b39a4c89a3a70ce1a7b68526.png

填充后的页面
在这里插入图片描述

涉及uniapp组件

1.view

视图容器,类似传统html中的div,用于包裹各种元素的内容。

2.swiper

滑块视图,可上下和左右滑动,一般作为banner轮播图。
在这里插入图片描述

3.scroll-view

区域滚动视图,有纵向滚动和横向滚动。
在这里插入图片描述

4.属性解读

例子:
a.<swiper class="article-swiper" circular :autoplay="autoplay" :indicator-dots="true" :duration="1000"></swiper>

b.<scroll-view :scroll-top="scrollTop" scroll-y="true" class="scroll-Y" show-scrollbar="true" @scrolltoupper="upper"
				@scrolltolower="lower" @scroll="scroll" ></scroll-view>

1) class=“style1 style2 …”

class赋值的是自定义样式,具体样式定义内容在vue文件的

2) circular单属性无赋值

等价于circular=“true”,属性的静态绑定写法,不会变更

3) :autoplay=“autoplay”

vue中属性的动态绑定写法,绑定一个参数,参数值可根据界面操作(比如button、switch)变更

4) @scrolltolower=“lower”属性前加@

vue中动态绑定方法的写法

一、顶部banner图

/pages/article/article.vue

<template>
	<view class="u-p-l-10 u-p-r-10">
	  /**
		* class="article-swiper":样式为style中自定义的.article-swiper{...}
		* circular:是否采用衔接滑动
		* :autoplay="autoplay":是否自动切换,此处设置动态绑定autoplay参数
		* indicator-dots:是否显示面板展示点
		* duration="1000":滑动动画时长
		* 
		*/
		<swiper class="article-swiper" circular :autoplay="autoplay" indicator-dots duration="1000">
			/**
			* swiper下的每个swiper-item是一个滑动切换区域
			*/
			<swiper-item>
				
				<view class="article-swiper-item uni-bg-red">red</view>
			</swiper-item>
			<swiper-item>
				<view class="article-swiper-item uni-bg-green">green</view>
			</swiper-item>
			<swiper-item>
				<view class="article-swiper-item uni-bg-blue">blue</view>
			</swiper-item>
		</swiper>
		<view >
			<view>自动播放</view>
			/**
			 * switch 开关选择器
			 * :checked="autoplay":是否选中,由autoplay参数决定
			 * @change="changeAutoplay":checked改变时触发change事件,绑定changeAutoplay方法
			*/
				<switch :checked="autoplay" @change="changeAutoplay" />
			</view>
	</view>
</template>

<script>
	import config from "@/common/config.js"
	export default {
		data() {
			return {
				// 自动播放参数:默认值是true
				autoplay: true
			}
		},
		methods: {
			changeAutoplay(e) {
				// 点击时开关状态取反
			    this.autoplay = !this.autoplay
			}
		}
	}
</script>
<style lang="scss" scoped>
	.article-swiper {
		height: 300rpx;
	}
	
	.article-swiper-item {
		display: block;
		height: 300rpx;
		line-height: 300rpx;
		text-align: center;
	}
	
	.uni-bg-red {
		background-color: rgb(255, 85, 127);
	}
	
	.uni-bg-green {
		background-color: rgb(170, 255, 0);
	}
	
	.uni-bg-blue {
		background-color: rgb(85, 170, 255);
	}
</style>

二、静态按钮列表

/pages/article/article.vue

<template>
	<view class="u-p-l-10 u-p-r-10">
		<view>
			<view class="rowClass">
				<u-row>
				/**
				 * u-row、u-col:流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。
				 * span:定义u-col应该跨越的列数
				 * v-for="(item,index) in navList":列表渲染指令
				 *	(1) navList:data中的源数据数组
				 *  (2) item:data数据navList数组的别名
				 *  (3) index:navList数组的索引
				 * @tap="clickNav(item):方法暂未定义
				 *
				 * image:按钮图片
				 * item.name:静态按钮名称
				 */
					<u-col span="3" text-align="center" v-for="(item,index) in navList" :key="index">
						<view class="u-padding-20" @tap="clickNav(item)" hover-class="hoverClass">
							<image :src="item.src" style="width: 90rpx;height: 90rpx;" mode="widthFix"></image>
							<view class="tabName">{{item.name}}</view>
						</view>
					</u-col>
				</u-row>
			</view>
		</view>
	</view>
</template>
<script>
	import config from "@/common/config.js"
	export default {
		data() {
			return {
				navList:[
					{name:"发布文章",url:"pages/center/publishArticle"},
					{name:"我的文章",url:"pages/center/myArticle"},
					{name:"所有文章",url:"pages/center/allArticle"},
					{name:"浏览记录"}
				]
			}
		}
	}
</script>
<style lang="scss" scoped>
.rowClass{
		border-radius: 8px;
		background-color: rgb(255, 255, 255);
		margin-top: 10rpx;
		text-align: center;
	}
	
	.hoverClass{
		background-color: #E4E7ED;
	}

	.tabName{
		font-size: 28rpx;
		color: $u-main-color;
	}
</style>

三、横向滚动图

/pages/article/article.vue

<template>
	<view class="u-p-l-10 u-p-r-10">
		<view>
			<view >
				<text>滚动文章banner</text>
			</view>
			<view>
			/**
				 * :scroll-top="scrollTop":设置竖向滚动条位置
				 * scroll-y="true":允许纵向滚动
				 * show-scrollbar="true":是否出现滚动条,仅支持app-nvue
				 * @scrolltoupper="upper":滚动到顶部/左边,会触发 scrolltoupper 事件
				 * @scrolltolower="lower":滚动到底部/右边,会触发 scrolltolower 事件
				 * @scroll="scroll":滚动时触发
				 *
				 */
				<scroll-view :scroll-top="scrollTop" scroll-y="true" class="scroll-Y" show-scrollbar="true" @scrolltoupper="upper"
					@scrolltolower="lower" @scroll="scroll" >
					<view id="demo1" class="scroll-view-item uni-bg-red">A</view>
					<view id="demo2" class="scroll-view-item uni-bg-green">B</view>
					<view id="demo3" class="scroll-view-item uni-bg-blue">C</view>
					
				</scroll-view>
			</view>
		</view>
	</view>
</template>
<script>
	import config from "@/common/config.js"
	export default {
		data() {
			return {
				scrollTop: 0,
				old: {
					scrollTop: 0
				}
			}
		},
		methods: {
			upper: function(e) {
				console.log(e)
			},
			lower: function(e) {
				console.log(e)
			},
			scroll: function(e) {
				console.log(e)
				this.old.scrollTop = e.detail.scrollTop
			}
		}
	}
</script>
<style lang="scss" scoped>
.uni-bg-red {
		background-color: rgb(255, 85, 127);
	}
	
	.uni-bg-green {
		background-color: rgb(170, 255, 0);
	}
	
	.uni-bg-blue {
		background-color: rgb(85, 170, 255);
	}
	
	.scroll-Y {
			height: 300rpx;
	}
	
	.scroll-view-item {
			height: 300rpx;
			line-height: 300rpx;
			text-align: center;
			font-size: 36rpx;
	}
</style>

四、动态列表 + 详情跳转

/pages/article/article.vue

<template>
	<view class="u-p-l-10 u-p-r-10">
		<view>
			<view >
				<text>滚动文章列表</text>
			</view>
			<view class="wrap">
				<scroll-view scroll-Y style="heignt: 100%;width 100%">
					<view>
					/**
					 * @click="clickContent(item):点击触发clickContent方法,跳转详情页面
					 */
						<view class="tabSwiper" v-for="(item,value) in articleList" :key="item.id" @click="clickContent(item)">
							<view class="top">
								<view class="left">
									<u-icon name="bell" :size="35" color="#2979ff"></u-icon>
									<view class="title">{{ item.title }}</view>
									<u-icon name="arrow-right" color="rgb(203,203,203)" :size="26"></u-icon>
								</view>
								
								<view class="right">{{ item.createTime }}</view>
							</view>
							<view class="item">
								<view class="content">
									<view class="title u-line-2">{{ item.content }}</view>
								</view>
							</view>
						</view>
					</view>
				</scroll-view>
			</view>
		</view>
	</view>
</template>
<script>
	import config from "@/common/config.js"
	export default {
		data() {
			return {
				pageNum:1,
				pageSize:50,
				articleList: [],
			}
		},
		onLoad() {
			this.getArticleList();
		},
		methods: {
			clickContent(item){
						if(item.id){
							this.$u.route('/pages/article/content', {
								id: item.id
							});
						}
			},
			getArticleList(){
				let url = "/api/cmsApi/findArticleList";
				this.$u.get(url,{
					pageNum:this.pageNum,
					pageSize:this.pageSize,
					orderByColumn:'create_time',
					isAsc:'desc'
				}).then(obj => {
					let data = obj.rows
					data.filter(item=>{
						this.articleList.push(
							{
								id:item.id,
								title: item.smallTitle,
								content: item.bigTitle,
								createTime: item.createTime
							}
						)
					})
				});
			}
		}
	}
</script>
<style lang="scss" scoped>
.tabSwiper {
		width: 710rpx;
		background-color: #ffffff;
		margin: 20rpx auto;
		border-radius: 20rpx;
		box-sizing: border-box;
		padding: 20rpx;
		font-size: 28rpx;
		.top {
			display: flex;
			justify-content: space-between;
			.left {
				display: flex;
				align-items: center;
				.title {
					margin: 0 10rpx;
					font-size: 32rpx;
					font-weight: bold;
				}
			}
			.right {
				color: $u-tips-color;
			}
		}
		.item {
			display: flex;
			margin: 20rpx 0 0;
			.left {
				margin-right: 20rpx;
				image {
					width: 200rpx;
					height: 200rpx;
					border-radius: 10rpx;
				}
			}
			.content {
				.title {
					font-size: 28rpx;
					line-height: 50rpx;
				}
			}
			.right {
				margin-left: 10rpx;
				padding-top: 20rpx;
				text-align: right;
			}
		}
	}
	
	.wrap {
		display: flex;
		flex-direction: column;
		height: calc(100vh - var(--window-top));
		width: 100%;
		
	}
</style>

五、详情页面

/pages/article/content.vue 添加详情页面的vue文件

<template>
	<view>
		<u-navbar :is-back="true" :title="title" :border-bottom="false"></u-navbar>
		<view class="u-content">
			<u-parse :html="content"
			:autosetTitle="true"
			:show-with-animation="true"
			:selectable="true"></u-parse>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				title:'文章详情',
				content: ``
			}
		},
		onLoad(option) {
			let id = option.id
			let url = "/api/cmsApi/getArticle/"+id;
			this.$u.get(url).then(res => {
				this.title = res.data.smallTitle
				this.content = res.data.articleContent
			});
		},
	}
</script>

<style>
	page{
		background-color: #FFFFFF;
	}
</style>
<style lang="scss" scoped>
	.u-content{
		margin:0 10rpx;
		padding: 24rpx;
		font-size: 34rpx;
		color: $u-main-color;
		line-height: 1.8;
		white-space: pre-wrap !important;
	}
</style>

在pages.json添加文章详情页的的路由

{
	"pages": [// pages 设置页面路径及窗口表现
    //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
		{
     // pages节点的第一项为应用入口页(即首页)
			"path": "pages/index/index",
			"style": {
				"navigationStyle": "custom" ,// 导航栏样式:取消原生系统导航栏
				"navigationBarTitleText": "首页", // 导航栏标题文字
				"enablePullDownRefresh": true,  // 下拉刷新
				"app-plus": {
          // 编译到App平台的特定样式
					"pullToRefresh": {
            // 下拉刷新小圈圈样式
						"support": true,
						"color": "#2979ff", //小圈圈的颜色
						"style": "circle" //小圈圈的样式
					}
				}
			}
		},{
        	"path" : "pages/article/article",
        	"style" : 
        	{
				"navigationStyle": "custom" ,
        		"navigationBarTitleText" : "文章",
        		"enablePullDownRefresh" : true
        	}
        },
		{
			"path" : "pages/article/content",
			"style" : 
			{
				"navigationStyle": "custom" ,
				"navigationBarTitleText" : "文章详情",
				"enablePullDownRefresh" : true
			}
		}]
}

详情页效果如下
在这里插入图片描述

参考资料

uni-app官网

在此感谢@Ann_0207的技术支持!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gitlab将本地文件项目上传至gitlab服务

打开gitlab网页界面&#xff0c;登陆管理员账号 &#xff08;测试服务器安装的gitlab&#xff0c;浏览器输入ip或配置的gitlab地址&#xff09; 创建新项目 使用gitlab创建项目 创建一个新项目&#xff08;忽略分组&#xff09; &#xff08;忽略分组&#xff09; 在创建工…

网络原理-------TCP协议

文章目录 TCP协议TCP协议段格式TCP原理确认应答机制 (安全机制)超时重传机制 (安全机制)连接管理机制 (安全机制)滑动窗口 (效率机制)流量控制 (安全机制)拥塞控制 (安全机制)延迟应答 (效率机制)捎带应答 (效率机制) 基于TCP的应用层协议 TCP协议 TCP, 即 Transmission Contr…

鸿蒙OS开发:【一次开发,多端部署】(导航栏) 导航栏

一多导航栏 介绍 本示例展示了导航组件在不同设备形态下的样式。 在sm设备上&#xff0c;以tabs形式展示&#xff0c;内容、导航为上下样式布局&#xff0c;通过点击底部tabs切换内容&#xff1b;在md/lg设备上&#xff0c;以[SideBarContainer]形式展示&#xff0c;内容、导…

OZON平台支持什么ERP,芒果店长ERP

随着跨境电商行业的飞速发展&#xff0c;越来越多的电商平台与ERP系统展开了紧密的合作&#xff0c;旨在通过技术整合提升商家的运营效率和市场竞争力。在众多电商平台中&#xff0c;OZON以其独特的商业模式和强大的市场影响力&#xff0c;吸引了众多商家的目光。而芒果店长ERP…

Linux基础知识,配置网卡(七)

一、简介 1. 虚拟机的网络设置 目的1&#xff1a;让物理机和虚拟机之间可以互相通信 目的2&#xff1a;让虚拟机可以上网 目的3&#xff1a;让虚拟机之间可以互相通信 2.网络的类别 类别1&#xff1a;实现物理机和虚拟机之间通信 物理机只要安装了vmware之后&#xff0c;就会…

“SSH服务器拒绝了密码,请再试一次”的问题解决思路

大家在使用XShell工具连接Ubuntu系统时&#xff0c;可能会出现错误如下: 通过在网上查阅资料和实践解决这个问题&#xff0c;将我的思路分享给大家&#xff01; 首先&#xff0c;我会先从使用Xshell连接远程服务器会涉及哪些东西上思考这个问题&#xff0c;即通过ssh服务连接远…

2024年5月软考成绩什么时候出?附查询方式

2024年5月软考成绩查询时间及查询方式&#xff1a; 查询时间&#xff1a;预计在2024年7月上旬进行。 查询方式&#xff1a; 方式一&#xff1a;登陆中国计算机技术职业资格网&#xff08;www.ruankao.org.cn&#xff09;&#xff0c;点击报名系统&#xff0c;输入注册账号和…

ResNet论文解读—Residual Learning Deep for lmage Recognition(2016)

ResNet论文解读—Residual Learning Deep for lmage Recognition&#xff08;2016&#xff09; 研究背景 图像识别中的深度残差学习网络(MSRA:微软亚洲研究院) 认识数据集&#xff1a;ImageNet的大规模图像识别挑战赛 LSVRC-2015&#xff1a;ImageNet Large Scale Visual Rec…

Android 中资源文件夹RES/RAW和ASSETS的使用区别

文章目录 1、res/raw 文件夹1.1、特点1.2、使用方法1.3、示例&#xff1a; 2. assets 文件夹2.1、特点2.2、使用方法2.3、示例&#xff1a; 3、使用场景3.1、res/raw 使用场景3.2、assets 使用场景 4、比较与选择5、文件夹选择的建议6、 示例代码总结6.1、res/raw 示例6.2、ass…

Raven2掠夺者2渡鸦2账号需要验证怎么解决 超简单验证账号教程

《渡鸦2》是一款源自韩国的创新力作&#xff0c;作为《Raven》系列的最新续篇&#xff0c;这款游戏在MMORPG手游领域内再度扩展了其标志性的暗黑奇幻宇宙&#xff0c;融入了大量革新的游戏设计与丰富内容。定档于2024年5月29日开启公测的《渡鸦2》&#xff0c;正处在紧张刺激的…

2024年物理化学与工程技术发展国际会议(ICPCETD 2024)

全称&#xff1a;2024年物理化学与工程技术发展国际会议&#xff08;ICPCETD 2024&#xff09; 会议网址:http://www.icpcetd.com 会议时间: 2024.06.30 截稿时间&#xff1a;2024.06.21 会议地点: 上海 投稿邮箱&#xff1a;icpcetd_info163.com 投稿标题&#xff1a;ArticleT…

【UE C++】 虚幻引擎C++开发需要掌握的C++和U++的基础知识有哪些?

目录 0 引言1 关键的 C 知识2 Unreal Engine 相关知识3 学习建议 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xff1a;【UE C】 虚幻引擎C开发需要掌握的C和U的基础知识有哪些&#xff1f;❣️ 寄语&…

代码随想录算法训练营第五十三天||1143.最长公共子序列、1035.不相交的线、53. 最大子序和

文章目录 一、1143.最长公共子序列 思路 二、1035.不相交的线 思路 三.53. 最大子序和 思路 一、1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原…

VPN的详细理解

VPN&#xff08;Virtual Private Network&#xff0c;虚拟私人网络&#xff09;是一种在公共网络上建立加密通道的技术&#xff0c;通过这种技术可以使远程用户访问公司内部网络资源时&#xff0c;实现安全的连接和数据传输。以下是对VPN的详细介绍&#xff1a; 选择代理浏览器…

node_相关知识点

Node.js采用谷歌的V8引擎&#xff0c;是一个服务器端的、非阻断式I/O的、事件驱动的JavaScript运行环境&#xff0c;可优化应用程序的传输量和规模。传统服务器多线程&#xff08;一个请求一个线程&#xff09;易阻塞。 一、线程、进程&#xff1a; 进程&#xff1a;进程负责…

今天想看点干货?Constraintlayout等你好久啦!

大家好&#xff0c;我是小布丁。 从今天开始要开一个新坑啦&#xff0c;我会系统地把我学到的Android基础知识分享出来&#xff0c;我也想过这样是否有必要&#xff0c;毕竟分享的都是一些很基础的内容&#xff0c;但是很多人也和我一样正处于Android小白阶段&#xff0c;我能…

RedHat9 | DNS剖析-配置转发DNS服务器

一、实验环境 1、转发DNS服务器 转发服务器&#xff08;Forwarding Server&#xff09;接受查询请求&#xff0c;但不直接提供DNS解析&#xff0c;而是将所有查询请求发送到另外一台DNS服务器&#xff0c;查询到结果后保存在本地缓存中。如果没有指定转发服务器&#xff0c;D…

PyCharm基本配置内容

如何更换 Python 解释器 输入一段代码点击运行后&#xff0c;画面下方有一个路径如图中框中所示&#xff1a; 上面的路径为虚拟路径&#xff0c;可以改为我们自己设置的路径 点击设置&#xff0c;选择settings 选择Project&#xff1a;y002———》Python Interpreter&#…

MySQL 重启之后无法写入数据了?

数据库交接后因 persist_only 级别的参数设置引发的故障分析。 作者&#xff1a;不吃芫荽&#xff0c;爱可生华东交付服务部 DBA 成员&#xff0c;主要负责 MySQL 故障处理及相关技术支持。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系…

解密Prompt系列15. LLM Agent之数据库应用设计:DIN C3 SQL-Palm BIRD

上一章我们主要讲搜索引擎和LLM的应用设计&#xff0c;这一章我们来唠唠大模型和DB数据库之间的交互方案。有很多数据平台已经接入&#xff0c;可以先去玩玩再来看下面的实现方案&#xff0c;推荐 [sql translate]&#xff1a;简单&#xff0c;文本到SQL&#xff0c;SQL到文本…