基于Vue,Vue-router,Vuex的简书网站模仿(二)

news/2024/4/27 9:04:29/文章来源:https://blog.csdn.net/weixin_33895657/article/details/89276718

接着上一篇我们接着讲,关于这个网站的专题页面和2015精选页面,如果有小伙伴没看过上一篇文章,这里附上上一篇文章的的链接基于Vue,Vue-router,Vuex的简书网站模仿
这里是网站的源码下载地址 Github Repo
这里是Demo地址,在线感受vue的魅力

页面结构分析

图片描述

  • App.vue:黄色框部分和紫色框部分

  • Topic.vue:橙色框部分

  • Topic_article.vue:蓝色框部分(同时也是重点部分,实现点击排序)

学会分析页面结构,是用vue开发一个比较重要的地方(我猜的),所以我再次分析了一次。页面结构分析结束后,接下来就是上代码的时候了。

Topic.vue(橙色框部分)

topic.vue部分和上一篇文章的home.vue部分是如出一辙的,为了让大家加深印象,我就再讲一次(我不会讲我是来凑字数的,嘿嘿)。上代码:

<template>
<div><div class="showbar"><div class="cover-image_2"></div><div class="text" style="text-shadow:1px 1px 1px #000000"><h1>专题</h1><h3>让思想汇聚,流传</h3><p style="font-size:14px;margin-bottom:5px">专题内容由多位写作者提供</p><a href="#"><i class="fa fa-pencil"></i>&nbsp;&nbsp;新建专题</a></div></div><div class="article-page"><nav><span class="search clearfloat"><span class="input"><input type="search" placeholder="搜索"></span><span class="search-icon"><i class="fa fa-search"></i></span></span>       </nav><div class="article-list"><ul class="btn-group"><li :class="{active: show === 'hot'}"><a @click="displayTopic('hot')"v-link="'/topic/topic_article'" >热门</a></li><li :class="{active: show === 'recommend'}"><a @click="displayTopic('recommend')"v-link="'/topic/topic_article'" >推荐</a></li></div><router-view></router-view></div>
</div>
</template>
<script>import {displayTopic} from '../vuex/actions'export default {vuex:{getters:{show: state => state.show_2},actions:{displayTopic}}} 
</script>

由于橙色框部分里热门和推荐两个导航按钮,要根据两个按钮展示不同的文章,这就和上一篇文章里的Home.vue里实现的方式一样,我们通过:class="{active: show === 'hot'}来判断当前按钮是否处于被点击状态,这里的show来自于vuex(getters)获取到的show,并且给它加上不一样的样式。通过@click="displayTopic('hot')点击事件来更换不同的show值和文章内容。这样我们就实现了点击切换按钮状态和文章区域内容。下面放上点击事件的代码:
actions.js:

export const displayTopic = ({ dispatch },show) => {dispatch('DISPLAY_TOPIC',show)
} 

store.js:

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const state = {topics:{fir: {img:'../../static/topic_1.jpg',title:'游戏',par:'玩转简书的第一步,从这个专题开始。\想上首页热门榜么?好内容想被更多人看到么?来投稿吧!\如果被拒也不要灰心哦~入选文章会进一个队列挨个上首页,请耐心等待。\投稿必须原创。如果发现有非...',            number:'97233',concern:'121.7',keys:'故事、连载',time:'20160620'        },sec: {img:'../../static/topic_3.jpg',title:'诗',par:'诗,让你感受自己的心灵。\专题主编:苏锦年 投稿须知:\1.本专题收录古诗、词、现代诗以及诗词点评及指导。\2.内容必须为原创,切勿用其他诗人的诗句。\3.文章排版整洁,注意...',            number:'35420',concern:'146.6',keys:'诗',time:'20160630'}},show_2:'hot'
}const mutations = {DISPLAY_TOPIC (state, show) {const topic = {hot: {fir: {img:'url../../static/vue-demo-hot.jpg',title:'游戏',par:'玩转简书的第一步,从这个专题开始。\想上首页热门榜么?好内容想被更多人看到么?来投稿吧!\如果被拒也不要灰心哦~入选文章会进一个队列挨个上首页,请耐心等待。\投稿必须原创。如果发现有非...',            number:'97233',concern:'121.7k',keys:'故事、连载'},sec: {img:'../../static/topic_3.jpg',title:'诗',par:'诗,让你感受自己的心灵。\专题主编:苏锦年 投稿须知:\1.本专题收录古诗、词、现代诗以及诗词点评及指导。\2.内容必须为原创,切勿用其他诗人的诗句。\3.文章排版整洁,注意...',            number:'35420',concern:'146.6k',keys:'诗',time:'20160630'}},recommend: {fir: {img:'../../static/topic_1.jpg',title:'游戏',par:'玩转简书的第一步,从这个专题开始。\想上首页热门榜么?好内容想被更多人看到么?来投稿吧!\如果被拒也不要灰心哦~入选文章会进一个队列挨个上首页,请耐心等待。\投稿必须原创。如果发现有非...',            number:'97233',concern:'121.7',keys:'故事、连载',time:'20160620'        },sec: {img:'../../static/topic_3.jpg',title:'诗',par:'诗,让你感受自己的心灵。\专题主编:苏锦年 投稿须知:\1.本专题收录古诗、词、现代诗以及诗词点评及指导。\2.内容必须为原创,切勿用其他诗人的诗句。\3.文章排版整洁,注意...',            number:'35420',concern:'146.6',keys:'诗',time:'20160630'},thi: {img:'../../static/topic_2.jpg',title:'@IT互联网',par:'@IT 专题 由 IT大分类,转定位于IT·互联网行业观察与思考,数码产品极客体验。\主编:向右奔跑 http://www.jianshu.com/users/54b5900965ea...',            number:'8409',concern:'111.1',keys:'互联网、产品、科技',time:'20160625'            }}}state.show_2 = showstate.topics = topic[show]    }
}
export default new Vuex.Store({state,mutations
})

这里面我省掉了上一章的代码。这里面我才用模拟的数据,可以清楚的看到实现方式。接下来讲解排序部分,这里算是一个重点吧,因为我在这里遇到了坑。

Topic_article.vue(蓝色框部分)

这部分我们要实现根据小导航的切换来显示不同的顺序(热门,推荐,最新更新),这里我只做了推荐和最新更新这两部分。首先要实现这种效果,我们第一时间想到的就应该是和大导航一样给小导航添加class绑定和点击事件。接下来看代码,先是Topic_article.vue的代码:

<template><div class="topic_article_container"><div class="sequence-nav" v-if="show === 'recommend'"><a @click="sortContent('time'), change = 'new'":class="{active: change === 'new'}">最新更新&nbsp;&nbsp;·</a>            <a @click="change = 'hot'":class="{active: change === 'hot'}">热门排序&nbsp;&nbsp;·</a><a @click="sortContent('concern'), change = 'new'":class="{active: change === 'concern'}">关注度排序</a></div><ul><li v-for="content in topic"><a href="" class="topic_article_img"><img :src="content.img"></a><div class="topic_content"><h5>{{ content.title }}</h5><p>{{ content.par }}</p><div class="topic_button"><a href="#"><i class="fa fa-fw fa-plus"></i><span>添加关注</span></a></div><p><a href="#" style="color:#4094c7">{{ content.number}}篇文章</a>&nbsp;&nbsp;·&nbsp;&nbsp;{{content.concern}}k人关注<span class="topic_tag"><i class="fa fa-tags"></i>{{ content.keys}}</span></p></div></li></ul></div>
</template>
<script>import { sortContent } from '../vuex/actions'export default {data (){let change = 'hot'return {change}},vuex: {getters: {topic: state => state.topics,show: state => state.show_2},actions: {sortContent}}}
</script>

因为这个小导航栏在热门页面里是没有的,这里才用了vue的v-if功能实现,通过getters获得此时的show变量,判断是否是推荐页面,如果是就显示。这里的文章依然采用vue的列表渲染功能(真好用),同时给小导航栏设置了点击事件,和改变背景的一个变量。接下来放上actions.js里面的代码:

export const sortContent = ({ dispatch },method) => {dispatch('SORTCONTENT',method)
}

也是那么短小精悍,毕竟我只用于分发事件。下面是store.js里面的代码:

SORTCONTENT (state, method){const temp = state.topicslet arr = []let Arr = objClone(state.topics)switch(method){case 'time':arr = [temp.fir.time, temp.sec.time, temp.thi.time].sort()breakcase 'concern':arr = [temp.fir.concern, temp.sec.concern, temp.thi.concern].sort()breakdefault:break} for(let keys in state.topics){if(Arr[keys][method] == arr[2]){state.topics.fir = Arr[keys]}else if(Arr[keys][method] == arr[1]){state.topics.sec = Arr[keys]}else if(Arr[keys][method] == arr[0]){state.topics.thi = Arr[keys]}}function objClone(myObj){if(typeof(myObj) != 'object') return myObj;if(myObj == null) return myObj;var myNewObj = new Object();for(var i in myObj){myNewObj[i] = objClone(myObj[i]);}return myNewObj;}}

这个事件的代码也很好理解,通过对不同的method,把不同的变量进行排序后赋值给一个数组,然后依次与topics做匹配,因为我这里只模拟了三个数据,故这部分操作比较简单。重点的是当我匹配topics里第三个属性(thi)的值的时候,这个时候topics里的第三个属性值已经变了(因为如果第二个属性(sec)的值是最小的,就会把这个属性赋给第三个属性,这时候第三个属性就变了,所以第三次匹配的时候还是得出和第二次同样的结果)。这时候我的做法是克隆一个和topics相同的对象,用这个对象去匹配,匹配好了之后把这个对象里相应的值赋值给topics。我讲的有点啰嗦,具体看代码实现。(ps:克隆对象的时候,我竟然直接进行赋值克隆,殊不知都是指向同一个地址空间,后来了解到需要重新开一个地址空间才能克隆,故有了上面那段objClone函数。)
到这里简书两个主要的部分就讲完了(Home.vue,Topic.vue)
接下来说一说2015年精选页面

2015精选页面

这个页面相对来说比较简单,就一个vue的列表渲染(不用列表渲染的话代码太多,太长,关键是逼格不高),先上页面:
图片描述

图中类似的标签有12个,故才用列表渲染来简化重复的代码,接下来是代码部分:

Bonus.vue

<template><div class="bonus-container"><div class="bonus-header"><span class="yellow">&nbsp;&nbsp;简书2015</span><i>&nbsp;·&nbsp;</i><span>每月一篇好文章&nbsp;&nbsp;</span></div><div class="share"><span><a href="#"><i class="fa fa-mobile"></i>手机查看效果更佳</a></span><span><a href="#"><i class="fa fa-weibo"></i>分享到微博</a></span><span><a href="#"><i class="fa fa-wechat"></i>分享到微信</a></span><span><a href="#">更多分享</a></span></div><ul class="text-list"><li v-for="article in articles" :style="{ background: article.article.bg, backgroundSize: '100%', backgroundRepeat: 'no-repeat',      backgroundColor: '#ffffff'}" <div class="content"><a class="mask" href="#"><div class="button">阅读全文></div></a><div class="bonus-text"><div class="bonus-text-title">{{ article.article.title}}</div><div class="line"></div><div class="bonus-text-content">{{article.article.content_1}}<br>{{article.article.content_2}}<br>{{article.article.content_3}}<br>{{article.article.content_4}}<br>{{article.article.content_5}}<br>{{article.article.content_6}}<br></div></div><div class="author"></div></div></li>
</template>
<script>export default {data () {let articles = ''return {articles}},vuex: {getters: {texts: state => state.texts}},ready: function() {this.articles = [{article: this.texts.Jan}, {article: this.texts.Feb}, {article: this.texts.Mar}, {article: this.texts.Apr}, {article: this.texts.May}, {article: this.texts.Jun}, {article: this.texts.Jul}, {article: this.texts.Aug}, {article: this.texts.Sep}, {article: this.texts.Oct}, {article: this.texts.Nov},  {article: this.texts.Dec}]}}
</script>

store.js_Bonus部分

下面是store.js里面模拟的数据

    texts:{Jan:{title:'给你90天,成为不一样的自己',content_1:"如果你应付不了现在的生活和工作",content_2:"无论你走到哪里,",content_3:"无论你换了什么工作,什么公司,",content_4:"都无济于事。",content_5:"因为你根本没想让自己成熟起来,",content_6:"想让变的更优秀也不过是一句口头禅。",author:'',bg:'url(../../static/bonus_1.jpg)'},Feb:{title:'使你更有思想的20本书',content_1:"真正伟大的当代文学,",content_2:"正如人们借由狄更斯来了解十九世纪的英国,",content_3:"后人也可以通过《自由》来了解",content_4:"二十一世纪初期的美国。",content_5:"",content_6:"",author:'',bg:'url(../../static/bonus_2.jpg)'},Mar:{title:'无感是最舒适的爱情',content_1:"爱情原本就是个很娇气的东西,",content_2:"它经不起太多的矫情,你死我活和无理取闹,",content_3:"也经不起任何的伪装,刻意讨好和忍辱负重。",content_4:"当她拂去所有的惊喜,荣幸,不敢置信和小心翼翼,",content_5:"才是爱情最原本的样子。",content_6:"当她不再刻意的感受他的存在,",author:'',bg:'url(../../static/bonus_3.jpg)'},Apr:{title:'无感是最舒适的爱情',content_1:"爱情原本就是个很娇气的东西,",content_2:"它经不起太多的矫情,你死我活和无理取闹,",content_3:"也经不起任何的伪装,刻意讨好和忍辱负重。",content_4:"当她拂去所有的惊喜,荣幸,不敢置信和小心翼翼,",content_5:"才是爱情最原本的样子。",content_6:"当她不再刻意的感受他的存在,",author:'',bg:'url(../../static/bonus_4.jpg)'}

这里我只给出5条数据,后面都是重复的,代码就不过多讲解了,实现方式和前面的一样。看到这里是不是感觉写一个网页很简单,是不是觉得Vue可好玩了,是的话那就对了,加油吧!骚年!
结尾还是那句话,求个收藏什么的,如有错误,欢迎斧正。

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

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

相关文章

Google Analytics SEO 实时 网站 访问量 统计

/**************************************************************************** Google Analytics SEO 实时 网站 访问量 统计* 说明&#xff1a;* 之前一直在想要怎么才能让aplexos.com域名网站能够统计访问量&#xff0c;网站是使用* github.io搭建&…

某政府机关网站的友情链接

今天上江苏建设人才网查些信息&#xff0c;网址&#xff1a;http://www.jschr.gov.cn/jschr/Default.aspx?不经意间在其首页底部“相关链接”栏目有个名为“dnf外挂”的链接&#xff0c;甚感兴趣&#xff0c;遂点击&#xff0c;指向网址 http://bbs.kid-game.net/ &#xff0…

用户请求队列化_高性能网站实用技巧之消息队列篇

什么是消息队列消息队列&#xff08;Message Queue&#xff09;是一种进程间通信或同一进程的不同线程间的通信方式。进程或者线程之间通过 消息 进行通信&#xff0c;消息发送后可以立即返回&#xff0c;由消息系统来确保信息的可靠传递&#xff0c;消息发布者&#xff08;生产…

html底部导航_干货:通过HTML、XML站点导航,让电商网站SEO排名更靠前

站点地图有两种类型&#xff1a;HTML和XML。HTML站点地图主要指导访问者,XML站点地图指导搜索引擎机器人&#xff0c;以确保它们找到要索引的站点URL。了解两种站点地图类型的优缺点将有助于你优化搜索引擎。XML站点地图XML使信息让机器可读&#xff0c;XML站点地图为搜索引擎提…

html icon 引入emoji,给网站标题加Emoji表情ico图标

能在百度搜索(搜索引擎基本都支持)标题中自动显示Emoji表情ico图标的&#xff0c;如果快照更新的快&#xff0c;很快就会显示&#xff0c;但是现在很多知名的网站通常也是不会显示出来&#xff0c;一些比较知名的博客也都没有出现Emoji表情的ico图标&#xff0c;不管什么原因&a…

50佳精美的单页网站设计作品欣赏(下篇)

单页网站是指只有一个页面的网站&#xff0c;这种形式的网站曾经非常流行&#xff0c;现在依然有很多人喜欢。不过&#xff0c;并不是每个网站都适合做成单页&#xff0c;一般都是内容比较少而且将来内容也不怎么增加的情况才适合这样做。如果你打算做一个这样的网站&#xff0…

win7下安装IIS7.0及部署VS2010 ASP.NET程序网站的相关问题

配置环境操作系统&#xff1a;microsoft windows 7服务平台&#xff1a;.net4.0开发工具&#xff1a;microsoft visual studio 20101.配置安装IIS(1)控制面板--->程序和功能--->打开或关闭windows功能&#xff08;左边&#xff09;--->internet信息服务。具体配置如…

网站静态化处理—缓存(4)

上篇我补充了下SSI的知识&#xff0c;SSI是一个十分常见的技术&#xff0c;记得多年前我看到很多门户网站页面的后缀是.shtml&#xff0c;那么这就说明很多门户网站都曾经使用过SSI技术&#xff0c;其实现在搜狐网站也还在用shtml&#xff0c;如下图所示&#xff1a; 由此可见S…

黑客组织匿名者(Anonymous)入侵肯尼亚石油公司网站

黑客组织Anonymous正力图清除些恶行。像童工&#xff0c;腐败和不公平现象如今在全球被完整地呈现。 就在几天前这个组织再次出现&#xff0c;参与表面似乎是一场废弃的与跨国公司的对抗&#xff0c;而实际上这个被称为“操作金丝雀”的组织现已经在参与始于去年冬天的非洲公司…

网络营销第六课(9):SEO搜索引擎优化(长尾关键词选取)

大家好&#xff0c;今天继续给大家讲一下关于“长尾关键词”的一些问题。主要是关于“长尾关键词”的拓展方式。 常用长尾关键词拓展方式&#xff1a;&#xff08;10条&#xff09; 1、产品或服务特点功能&#xff08;质地、类别、行业背景&#xff09; 2、产品或服务价格费用&…

收集的一些有用的网站

2019独角兽企业重金招聘Python工程师标准>>> hhttp://www.chinaz.com/ 站长之家https://www.google.com/webmasters/tools/home?hlzh-CN google 站长工具https://www.google.com/analytics google 网站分析http://tuboren.com 很不错的一个站&#xff0c;有大…

html外网发布网站的步骤,.NET发布网站详细步骤

本文章分为三个部分: web网站发布、IIS6 安装方法、ASP.NET v4.0 安装方法一、web网站发布1.打开 Visual Studio 2013 编译环境2.在其解决方案上右击弹出重新生成解决方案,以查看是否有错误3.如果项目没有错误右击WebUI层发布4.这样将会看到以下界面5.在配置文件中新建配置文件…

大家来分享自己收藏的前端开发网站

2019独角兽企业重金招聘Python工程师标准>>> 前端开发导航网站 HTML5研究小组 UI制造 MooSee摩色 appui loveui 盒子UI 移动设备产品设计 AndroidUI设计指导 转载于:https://my.oschina.net/kisshua/blog/138763

警惕钓鱼网站

概述 于今日某伙计&#xff0c;突然在官方大群里发布了一条大家感兴趣的通知&#xff0c;具体讲是一个在线的腾讯文档&#xff0c;如下图。便习惯性的点开查看。 以假乱真的腾讯文件 打开该文档&#xff0c;是一则通知&#xff0c;通知里有一张清晰度有限的图片&#xff08;图…

ts 使用Visual Studio2012和TFS网站管理源代码

所需工具Visual Studio 2012http://tfs.visualstudio.com/微软网站微软账号 hotmail 或live都行达到目的适合于个人项目&#xff0c;多用户管理微软自家版本的git比如在公司的测试项目提交到tfs&#xff0c;然后在家里获取进行修改享用tfs的其它服务&#xff0c;如work items、…

探测网站(三)nikto探测Web服务器漏洞

2019独角兽企业重金招聘Python工程师标准>>> Nikto是一款开源的Web程序扫描器&#xff0c;可以扫描服务器中的存在的一些问题。Nikto是linux/Unix中的一款工具&#xff0c;可以从官方网站上下载&#xff0c;解压到本地运行。这里直接采用backtrack 5中集成的nikto工…

微信公众平台开发(免费云BAE+高效优雅的Python+网站开放的API)

虽然校园App是个我认为的绝对的好主意&#xff0c;但最近有个也不错的营销开发的模式出现&#xff1a;微信平台固定域名服务器。 微信公众平台的运行模式不外两个: 一、机器人模式或称转发模式&#xff0c;将说话内容转发到服务器上完成&#xff0c;拿服务器的回复再一次转发&a…

QQ影音的网站已经关闭

近日&#xff0c;腾讯关闭了QQ影音的网站&#xff0c;用户访问该网站会提示“400 Bad Request”&#xff0c;这个视频播放器目前长期不进行更新&#xff0c;在Windows 10下无法关联视频文件&#xff0c;QQ旋风云播放功能也被关闭&#xff0c;目前看来&#xff0c;这个产品已经完…

你的网站安全吗?WEB应用安全总结

2019独角兽企业重金招聘Python工程师标准>>> 应用安全越来越重要 —— 互联网上看到的大多数安全事件基本都和应用安全&#xff0c;尤其是 WEB 应用安全有关(随便翻翻 wooyun 之类的就知道了)。最近几年的工作基本都和应用安全有关系&#xff0c;借着这个机会也总结…

Amazon AWS S3 部署静态网站 + 绑定顶级域名 + DNSPod

2019独角兽企业重金招聘Python工程师标准>>> Amazon AWS S3 部署静态网站 绑定顶级域名 DNSPod 什么是 Amazon AWS S3? Amazon AWS Amazon Web Services官方是这么解释的 (http://aws.amazon.com/cn/products/?nc2h_ql)&#xff1a; Amazon Web Services 提供一…