用vue+webpack+es6+sass实现Cnode网站(一)

news/2024/5/11 22:26:16/文章来源:https://blog.csdn.net/weixin_34368949/article/details/89369003

写在文章前:最近把官网的vue文档过了一遍,准备写个项目来巩固下自己对vue的学习。因为cnode网站有开放的api,所以我决定用vue+webpack+es6+sass的技术栈去实现这个网站(单页面的形式)。这篇系列的文章我主要是分享下自己怎么开发还有怎么实现一个个vue组件去构建整个网站。关于webpack配合vue的使用可以关注我的另外一篇博文webpack+vue配置,感谢Cnode网站提供的开放API。

建议阅读前准备内容

  • 单页面应用

  • 路由vue-router文档

  • webpack+vue配置

1. 构建我们的项目目录

├── README.md          
├── index.html         // 项目入口文件
├── package.json       // 项目配置文件
├── src                // 生产目录
│   ├── vue            // 组件
│   |    ├──about.vue
│   |    ├──artlist.vue
│   |    ├──article.vue
│   |    ├──login.vue
│   |    ├──loading.vue
│   |    ├──search.vue
│   ├── components     // 各种子组件
│   |    ├──header.vue
│   |    ├──returnTop.vue
│   |    ├──menu.vue
│   ├── js             // 外部引入的js文件
│   ├── scss           //scss文件
│   ├── img           //图片文件
│   ├── filters.js     //过滤器
│   └── main.js        // Webpack 预编译入口    
└── webpack.js          // Webpack 配置文件

2.今天要实现的一个效果

图片描述

在上面的gif动画中我们总共看到了几个页面

  • loading.vue(首页过渡加载)

  • artlist.vue(列表展示页)
    几个组件

  • header.vue(头部)

  • meun.vue(菜单栏)

  • returnTop.vue(返回顶部)

在正式内容开始前先简单的说下,我们看到的一个页面是由各个组件组成的,而我们可以把页面拆分成一个各个组件,每个组件单独一个文件,组件的结构是这样的,避免内容过多下面讲到的组件我都不写style,具体代码开源在了 github上,有兴趣的可以去看下。

<template><!--html结构-->
</template>
<script>//js
</script>
<style>//style
</style>

3.具体页面开发

3.1首页过度也难loading.vue

我们要实现的是一个loading图等待2秒进入artlist列表页

<template><div><img class="loading" src="../img/loading.gif" alt=""></div>
</template>
<script>export default {ready : function() {setTimeout(() => {this.$route.router.go({name : 'artlist'});}, 2000);}}
</script>

3.1主题列表页artlist.vue

我们的列表页的结构是这样的:

<template><nv-header></nv-header><div class="artlist"><ul class="artlistTab clearfix"><li v-for="item in itemTab" :class="{'on':initIndex === $index}" v-on:click="changeTab($index)">{{item.title}}</li></ul><div class="artlistCon"><div v-for="art in artlist" class="artitem clearfix" v-link="{name:'article',params:{id:art.id}}"><a class="avatar" href="javascript:void(0);"><img :src="art.author.avatar_url" :alt="art.author.loginname"></a><div class="art-inf"><p class="title">{{art.title}}</p><span>{{art.reply_count}}/{{art.visit_count}}</span><span>{{art.create_at | getDateTime }}</span></div></div></div></div><nv-top></nv-top>
</template>

tab主题导航的渲染
我们把列表的导航加载进来,官方API的有主体分类ask,share,job,good
所以得出我们的数据itemTab。

itemTab : [{'title' : '全部', 'type' : 'all'},{'title' : '精华', 'type' : 'good'},{'title' : '分享', 'type' : 'share'},{'title' : '问答', 'type' : 'ask'},{'title' : '招聘', 'type' : 'job'}
]

然后在定义一个输出请求接口的对象:

searchKey : {page : 1,limit : 20, //每页加载20条tab : 'all' //主题 有all ask share job good
}

顺便再定义哥artilist[]空数组来存放等下取出来的数据。

我们要先定义拉取数据的方法函数,我们把拉取到的数据列表放在我们先前定义的artlist[]数组里面,利用vue的双向绑定的特性配合v-for我们就可以把我们的列表页的主题内容渲染出来了。

//获取数据方法
gerArtlist : function() {let rqdata = $.param(this.searchKey);$.get('https://cnodejs.org/api/v1/topics?' + rqdata, (data) => {if(data.success){this.artlist = data['data'];this.scroll = true;}})

}
页面刚打开的时候我们要去取第一次的数据

ready : function() {this.gerArtlist(this.initIndex);});

切换主题的时候我们要给每个item绑定一个事件changeTab($index),利用$index这个索引,改变我们this.searchKey.tab在去请求数据

// 标签tab切换方法
changeTab : function(index) {this.initIndex = index;this.searchKey.tab = this.itemTab[index].type;this.artlist = [];this.searchKey.limit = 20;this.gerArtlist(this.initIndex);
}

我们设置的是当前页面打开的时候加载了20条数据,现在我们要实现下拉,超过了一定的区域在去请求下一个20条的内容,就是改变searchKey.limit,每次触发下拉条件就叠加20.

// 超过滚动获取数据方法
scrollArtlist : function() {if(this.scroll){let totalheight = parseFloat($(window).height()) + parseFloat($(window).scrollTop());if ($(document).height() <= totalheight + 200) {this.scroll = false;this.searchKey.limit += 20;this.gerArtlist();}}
}

在ready里面绑定下scroll

ready : function() {$(window).on('scroll',() => {this.scrollArtlist();});

3.2返回顶部组件
在我们的列表页引入返回顶部组件和头部组件作为子组件

components : {'nv-header' : require('../components/header.vue'),'nv-top' : require('../components/returnTop.vue')
}

返回顶部组件returnTop.vue

<template><div class="return-top" v-show="showTop" v-on:click="returnTop"></div>
</template>
<script>export default {data : function() {return {showTop : false}},ready : function() {$(window).on('scroll', () => {if($(window).scrollTop() > 150){this.showTop = true;}else{this.showTop = false;}    })},methods : {returnTop : function() {$(window).scrollTop(0);this.showTop = false;}}}
</script>

3.3头部组件

<template><!-- 遮罩层 --><div class="page-cover"  v-show="coverShow" v-on:click="hideMenu"></div><!-- 头部 --><div class="header"><span class="left-menu" v-on:click="showMenu"></span>cnode.js</div><nv-menu :showm="menuShow"></nv-menu>
</template>
<script>export default {data : function() {return {coverShow : false,menuShow : false}},methods : {showMenu : function() {this.coverShow = true;this.menuShow = true;},hideMenu : function() {this.coverShow = false;this.menuShow = false;}},components : {'nv-menu' : require('./menu.vue')}}
</script>

在我们的header组件中我们引入了一个menu组件,props : ['showm']利用父子组件间的通信,给meun绑定了个:class="{'showMeun':showm}"利用css3来实现过渡

<template><div class="meun" :class="{'showMeun':showm}"><ul><li v-link="{name:'home'}">首页</li><li v-link="{name : 'search'}">搜索</li><li v-link="{name : 'login'}">登录</li><li v-link="{name : 'login'}">注册</li><li v-link="{name : 'about'}">关于</li></ul></div>
</template>
<script>export default {props : ['showm']}
</script>
<style lang="sass">.meun {position: fixed;top: 0px;left:-200px;width: 200px;height: 100%;background: #444444;transition: all .3s ease;z-index: 99;ul {padding-top: 3rem;li {color: #fff;padding: 16px 0;text-align: left;text-indent: 10px;line-height: 20px;font-size: 20px;margin: 0 25px;}}}.showMeun {transform: translateX(200px);}
</style>

结束语

由于是空闲的时间做的,所以只实现了部分功能,后面会继续完善,源码已经放在github

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

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

相关文章

php开发视频直播平台技术,视频直播网站开发千万不能忘的一个知识点

对于视频直播网站开发的技术人员来讲&#xff0c;音视频即时通讯技术是需要熟练掌握的。毕竟像直播这样重视互动和实时性的应用场景&#xff0c;即时通讯可以从中起到很大的配合作用。目前市面上有很多服务商所提供的SDK可以帮助实现这一技术&#xff0c;但是在选择哪一家服务商…

java 网站统计工具,MyPerf4J

MyPerf4J是什么&#xff1f;一个针对高并发、低延迟应用设计的高性能、无侵入的Java方法性能监控和统计工具。受 [perf4j](https://github.com/perf4j/perf4j) 和 [TProfiler](https://github.com/alibaba/TProfiler)启发而来。MyPerf4J具有以下几个特性&#xff1a;* 无侵入: …

用CI做网站架构的一点心得

2019独角兽企业重金招聘Python工程师标准>>> 项目简述 日PV数万&#xff0c;针对海外&#xff0c;跨五个大洲&#xff0c;南美&#xff0c;北美&#xff0c;欧洲&#xff0c;非洲&#xff0c;东南亚。 服务器环境 windows服务器数个分属不同大洲 数据库&#xff1a;…

php 网站301重定向设置代码实战案例

php 网站301重定向设置代码实战案例 301重定向就是页面永久性移走的意思&#xff0c;搜索引擎知道这个页面是301重定向的话&#xff0c;就会把旧的地址替换成重定向之后的地址。 302重定向就是页面暂时性转移&#xff0c;搜索引擎处理302的话&#xff0c;不会将旧的地址替换成新…

美媒:乌克兰极右黑客攻破波兰国防部网站

美《防务新闻》网站7月15日报道&#xff0c;乌克兰一个与极右组织“右区”有关的黑客组织宣称&#xff0c;他们成功攻入波兰国防部服务器&#xff0c;并窃取了大量机密信息。波兰国防部发表声明称&#xff0c;被窃的信息并非机密&#xff0c;目前正在调查有关的网络攻击事件。 …

建站手册-网站主机:网站主机服务商

ylbtech-建站手册-网站主机&#xff1a;网站主机服务商1.返回顶部 1、http://www.w3school.com.cn/hosting/host_providers.asp2、2.返回顶部1、如果您希望让全世界的人都看到您的网站&#xff0c;就必须把它存储在一个 web 服务器。 大多数小的企业和公司都把他们的网站存储在…

webmatrix mysql_使用微软的webmatrix配置php网站的步骤

第一步&#xff0c;下载webmatrix3。在 Windows Azure 中创建一个Web Sites&#xff0c;下载并进行自定义&#xff0c;然后部署返回到 Windows Azure Web Sites。我们将使用 WebMatrix&#xff0c;一个免费、 轻量级的 web开发工具。我们将看一些WebMatrix 中&#xff0c;使写作…

挂机网站是什么原理_万词霸屏的实现原理

在客户跟推之邦沟通万词霸屏产品的时候&#xff0c;经常会问到“万词霸屏是什么原理来实现的”&#xff1b;一般我们客户顾问遇到这种问题都会说“利用合作媒体平台的高权重快速实现成千上万关键词的搜索引擎首页排名”&#xff1b;这个说法到底正确吗&#xff1f;作为在搜索排…

linux中VIM画图,用Vim画图_Linux教程_Linux公社-Linux系统门户网站

在Linux上其实并不缺少画图软件(比如yEd等)&#xff0c;那么为什么还需要用VIM来画图&#xff1a;更轻&#xff0c;不需要安装太多东西更小&#xff0c;就是一些文本&#xff0c;比图片什么的小多了&#xff0c;使用起来也更简单更有逼格首先&#xff0c;在VIM中安装DrawIt插件…

Flink 实战 : 统计网站PV,UV

2019独角兽企业重金招聘Python工程师标准>>> Flink 实战&#xff1a;统计网站PV&#xff0c;UV PV&#xff0c;UV PV&#xff08;Page View) : 页面点击次数UV&#xff08;User View&#xff09;: 独立用户访问次数假定需求如下&#xff0c;每间隔1分钟&#xff0c;…

大型网站架构系列:分布式消息队列(一)

大型网站架构系列&#xff1a;分布式消息队列&#xff08;一&#xff09; 原文:大型网站架构系列&#xff1a;分布式消息队列&#xff08;一&#xff09;以下是消息队列以下的大纲&#xff0c;本文主要介绍消息队列概述&#xff0c;消息队列应用场景和消息中间件示例&#xff0…

夺命雷公狗—玩转SEO---32---DEDE网站地图制作

网站地图需要网站制作完成后&#xff0c;且需要提交到搜索引擎了才开始做的~~&#xff01; 首先我们需要的就是下载一个 尖叫青蛙 的软件 下载地址&#xff1a; https://pan.baidu.com/s/1ArfqCKSdjZIiRAsoBt0zjg 提取码&#xff1a;fg61 原文地址&#xff1a;https://www.…

【前端项目实战—品优购】网站favicon图标制作

favicon.ico一般用于作为缩略图的网站标志&#xff0c;它显示在浏览器的地址栏或者标签上&#xff0c;如下图所示。目前主要的浏览器都支持favicon.ico图标。 一、制作favicon图标 把品优购图标切成png图片。&#xff08;具体切图过程请见之前的文章&#xff0c;PSD文件需要…

跨屏网:专注于几百万PC网站的移动化诉求

2019独角兽企业重金招聘Python工程师标准>>> 随着技术的发展&#xff0c;智能手机、Pad、智能电视以及移动可穿戴设备等多个屏幕的出现&#xff0c;使得网络营销人员&#xff0c;对于多屏的探讨更加频繁。前些年&#xff0c;谈论较多的是“多屏整合”技术&#xff1…

Keybase推新开放身分验证 可支持小型社交网站

把密钥作为身份的加密社交平台Keybase&#xff0c;宣布推出新的身分验证协议&#xff0c;可让任何小型网站透过Keybase来验证用户身分&#xff0c;过去只有大型网站如Twitter、GitHub、Reddit、Coinbase和Hacker News支持&#xff0c;现在开始向较小型的社群软件招手。最先支持…

大型网站系统架构的演化

前言 一个成熟的大型网站&#xff08;如淘宝、京东等&#xff09;的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性&#xff0c;它总是随着用户量的增加&#xff0c;业务功能的扩展逐渐演变完善的&#xff0c;在这个过程中&#xff0c;开发模式、技术架构、设计…

手把手教你,嘴对嘴传达------Nginx网站服务(访问状态统计,基于域名,端口,IP的虚拟web主机访问)

文章目录一、Nginx简介二、Nginx服务基础1、Nginx概述2、Nginx编译安装&#xff08;过程&#xff09;3、Nginx的访问状态统计三、Nginx访问控制1、基于授权的访问控制2、基于客户端的访问控制四&#xff1a;Nginx虚拟主机1、Nginx虚拟主机应用2、基于域名的虚拟Web主机3、基于I…

使用docusaurus搭建个人网站

文章目录1.nodejs环境搭建2.Docusaurus 简介3.安装 Docusaurus4.配置1.nodejs环境搭建 在Vmware(Win10)中安装Ubunt16.04的环境使用vscode(Win10)的remote ssh功能远程连接至Ubuntu中进行测试 apt install -y nodejsnode安装 apt install nodejs-legacy -y最好升级nodejs版本…

Win7下IE8无法打开https类型的网站解决方法笔记

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01;现象&#xff1a;一台笔记本(XP系统),一台台…

linux上的磁盘分区,实践篇 - Linux中磁盘分区详解_Linux教程_Linux公社-Linux系统门户网站...

Linux中磁盘mbr分区——实践篇fdisk命令语法fdisk(选项)(参数)选项-b 指定每个分区的大小-l 列出分区表信息-v 显示版本信息参数设备文件&#xff1a;例如/dev/sda实例选择要操作的磁盘&#xff1a;[rootlinuxidc ~]#fdisk /dev/sdb输入m可列出可以执行的命令&#xff1a;Comma…