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

news/2024/4/27 17:15:06/文章来源:https://blog.csdn.net/weixin_34308389/article/details/89288135

在这个教程里面,我会通过一系列的代码和图片来学习怎么使用vue-router,以及vuex。本文假设读者手里有关于vue-router和Vuex的文档,并且对Vue-router和Vuex有一定的了解。
没有文档也没关系,我这里有关于 Vue-router文档以及Vuex介绍,可以配合本文进行学习。由于才开始学习Vue,如有不当
之处,还请大家帮我斧正!!

首先看下这个网站的截图
图片描述

这里是网站的源码下载地址 Github Repo
部分代码已经更新为2.0 JianshuVue2
代码已经具有React版本 JianshuByReact
这里是Demo地址,在线感受vue的魅力

搭建项目

项目结构

本项目才用Vue-cli脚手架自动生成,这是一个Vue生态系统中一个伟大创举。这意味着我们不需要手动构建我们的项目,而它就可以很快地为我们生成。如图所示:
图片描述

  • components:包含所有的页面组件
  • vuex:包含vuex相关文件(action.js, store.js)
  • static:静态文件存放(图片和图标库等)
  • index.html:渲染的页面
  • main.js:应用入口点,包含根实例
  • App.vue:主页面组件

项目流程:

  • 安装Vue-cli(要有node与npm)
npm i -g vue-cli
  • 创建一个webpack项目,并且下载依赖
vue init webpack vue-demo-jianshu
cd vue-demo-jianshu
npm i
  • 安装Vue-router和Vuex
npm install vue-router vuex --save
  • 热加载打开页面(生产的时候运行npm run build)
npm run dev

项目的框架已经搭建好了,接下来就是为项目添砖加瓦。

添砖加瓦第一步(初始化main.js与App.vue)

首先分析页面结构(专题页面结构和首页一样,就不在单独赘述了,写到哪儿分析到哪儿)
图片描述

  • App.vue: 绿色框内的和黄色框内的就是每个页面都存在的,故写在App.vue里
  • home.vue: 紫色区域部分,由于文章区内文章会进行变化,故把文章区域单独写成组件
  • Article.vue: 棕色框部分

main.js部分

在main.js中我们引入Vue,App,Vue-router,并且创建了一个Vue的实例(因为在router这行引入了App组件router.start(App, '#app'),上main.js代码:

import Vue from 'vue'
import App from './App'
import VueRouter from 'vue-router'import home from './components/Home.vue'
import topic from './components/Topic.vue'
import article from './components/Article.vue'
import bonus from './components/Bonus.vue'
import login from './components/Login.vue'
import topic_article from './components/Topic_article.vue'//注册VueRouter这个插件
Vue.use(VueRouter)const router = new VueRouter()//路由map
router.map({'/home': {component: home,subRoutes: {'/article': {component: article}}},'/topic': {component: topic,subRoutes: {'topic_article': {component: topic_article}}},'/bonus': {component: bonus},'/login': {component: login}
})
//路由重定向(访问不存在的页面时,重定向到这个页面)
router.redirect({'*':'/home/article'
})router.start(App,'app')//启动一个启用了路由的应用。创建一个 App 的实例并且挂载到元素 'app'
router.go('/home/article')//为了让页面打开的时候能看见文章,我把它导航到新路由

App.vue部分

App.vue里面我们把两个侧边栏(绿色框和黄色框)写在这里边,因为这两个总是一直存在的

<template>
<div class="container"><div class="sidebar"><ul class="dropdown"><li :class="{active: show === 'home'}"><a @click="show = 'home'" v-link="'/home/article'"><i class="fa fa-home"></i><span>&nbsp;&nbsp;首页</span></a></li><li :class="{active: show === 'topic'}"><a @click="show = 'topic'" v-link="'/topic/topic_article'"><i class="fa fa-th"></i><span>&nbsp;&nbsp;专题</span></a></li><li><a href="#"><i class="fa fa-mobile"></i><span>&nbsp;&nbsp;下载手机应用</span></a></li></ul><ul class="nav-user"><li><a href=""><i class="fa fa-font"></i><span>&nbsp;&nbsp;显示模式</span></a></li><li><a v-link="'/login'"><i class="fa fa-sign-in"></i><span>&nbsp;&nbsp;登录</span></a></li></ul></div><div class="home"><router-view transition = 'display' transition-mode = 'out-in'></router-view></div><div class="rightbar"><nav><a v-link="'/login'"><i class="fa fa-sign-in"></i>登录</a><a href="#"><i class="fa fa-user"></i>注册</a></nav></div>
</div>
</template>

添砖加瓦第二步(home.vue和article.vue)

home.vue部分

先讲home.vue,home.vue里面要放紫色框内(除了棕色框)的内容,分析这个界面紫色框内的左侧边栏是不变的,故可以写死,顶部导航也是不变的,也写死。关键就是在中部导航栏(热门,新上榜那块),棕色框内的内容会根据中部导航栏选中不同内容进行改变。那么该怎么实现这个呢?

首先写好需要写死的地方,如下图代码所示:

<template>
<div><div class="showbar"><div class="cover-image"></div><div class="text" style="text-shadow:1px 1px 1px #000000"><h1>简书</h1><h3>交流故事,沟通想法</h3><p>一个基于内容分享的社区</p><a href="#"><i class="fa fa-home"></i>提笔写篇文章</a></div></div><div class="article-page"><nav><span class="nav-text fir"><a href="#">发现</a></span><span class="nav-text"><a v-link="'../bonus'">2015精选</a></span><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="displayArticle('hot')"v-link="'/home/article'" >热门</a></li><li :class="{active: show === 'new'}"><a @click="displayArticle('new')"v-link="'/home/article'" >新上榜</a></li><li :class="{active: show === 'daily'}"><a @click="displayArticle('daily')"v-link="'/home/article'" >日报</a></li><li :class="{active: show === 'weekhot'}"><a @click="show = 'weekhot'"v-link="'/home/article'" >七日热门</a></li><li :class="{active: show === 'monthhot'}"><a @click="show = 'monthhot'"v-link="'/home/article'" >三十日热门</a></li><li :class="{active: show === 'reward'}"><a @click="show = 'reward'"v-link="'/home/article'" >有奖活动</a></li><li :class="{active: show === 'publish'}"><a @click="show = 'publish'"v-link="'/home/article'" >简书出版</a></li><li :class="{active: show === 'video'}"><a @click="show = 'vedio'"v-link="'/home/article'" >简书播客</a></li><li :class="{active: show === 'hotnews'}"><a @click="show = 'hotnews'"v-link="'/home/article'" >时事热闻</a></li><li :class="{active: show === 'choice'}"><a @click="show = 'choice'"v-link="'/home/article'" >专题精选</a></li></ul><router-view></router-view></div></div>
</div>
</template>

不知道你看懂代码了没,没看懂不要紧,我来给你讲解,重点分析导航栏部分,为了让导航栏标签被选中时改变背景色,这里我使用了:class="{active: show === 'hot'}" ,这是vue里v-bind:class的简写,如果你问我show从哪里来,我会告诉你show从天上来,哈哈,不开玩笑,show的来源也就是今天的另一个重点Vuex。看代码:
首先是store.js(我的理解是管理数据和操作数据的地方)

store.js部分

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const state = {articles:{fir: {author:'徐丹妮',title:'我不是学霸,只是比你努力一点而已',time:'大约6小时之前',read:'8498',comment:'248',like:'2342',pay:'2',src:'url(../../static/vue-demo-hot.jpg)'},sec: {author:'共央君',title:'爱美的女生们,六款超高性价比的变美神器你都有了吗?',time:'大约8小时之前',read:'2623',comment:'34',like:'191',pay:'2',src:'url(../../static/vue-demo-hot_1.jpg)'},thi: {author:'姜肥东',title:'毕业9年,我才学懂的道理',time:'大约6天之前',read:'6498',comment:'38',like:'242',pay:'2',src:'url(../../static/vue-demo-hot_2.jpg)'}},show:'hot'
}
const mutations = {DISPLAY_ARTICLE (state, show) {const article = {hot: {fir: {author:'徐丹妮',title:'我不是学霸,只是比你努力一点而已',time:'大约6小时之前',read:'8498',comment:'248',like:'2342',pay:'2',src:'url(../../static/vue-demo-hot.jpg)'},sec: {author:'共央君',title:'爱美的女生们,六款超高性价比的变美神器你都有了吗?',time:'大约8小时之前',read:'2623',comment:'34',like:'191',pay:'2',src:'url(../../static/vue-demo-hot_1.jpg)'},thi: {author:'姜肥东',title:'毕业9年,我才学懂的道理',time:'大约6天之前',read:'6498',comment:'38',like:'242',pay:'2',src:'url(../../static/vue-demo-hot_2.jpg)'}},new: {fir: {author:'阿俊',title:'Learn by doing',time:'大约6小时之前',read:'3398',comment:'258',like:'232',pay:'88',src:'url(../../static/vue-demo-new.jpg)'    },sec: {author:'阿猫',title:'Learn by doing',time:'大约6小时之前',read:'3398',comment:'258',like:'232',pay:'88',src:'url(../../static/vue-demo-new.jpg)'    },thi: {author:'阿狗',title:'Learn by doing',time:'大约6小时之前',read:'3398',comment:'258',like:'232',pay:'88',src:'url(../../static/vue-demo-new.jpg)'    }},daily:{fir: {author:'尸叔',title:'如何让你的自拍,惊爆朋友圈?看我是怎么设计的',time:'大约2小时之前',read:'3750',comment:'70',like:'190',pay:'0',src:'../../static/vue-demo-daily.jpg'                    },sec: {author:'尸爸',title:'如何让你的自拍,惊爆朋友圈?看我是怎么设计的',time:'大约2小时之前',read:'3750',comment:'70',like:'190',pay:'0',src:'../../static/vue-demo-daily.jpg'},thi: {author:'尸姐',title:'如何让你的自拍,惊爆朋友圈?看我是怎么设计的',time:'大约2小时之前',read:'3750',comment:'70',like:'190',pay:'0',src:'../../static/vue-demo-daily.jpg'}}}state.show = showstate.articles = article[show]}
}
export default new Vuex.Store({state,mutations
})

getters获取数据

这里面我采用的是模拟数据的方式(一个人没有后台 QAQ),可以看到show来自于state,我们在home.vue页面通过vuex的getters来获取数据show,代码如下:

import { displayArticle} from '../vuex/actions'
export default{vuex: {getters: {show: state => state.show},actions: {displayArticle}}
}

actions.js部分

在这里还引入一个action,它是做什么的呢?你答对了,这个displayArticle是用来分发事件的函数,它将更换文章区域内容的事件dispatch出去,然后在store.js里面完成内容的更换,下面是actions.js代码:

export const displayArticle = ({ dispatch },show) => {dispatch('DISPLAY_ARTICLE',show)
}

是不是感觉vuex很简单。中部导航栏我只给前三个弄了正确的点击事件,如需体验更多效果,自己动手,丰衣足食!!233
接下来是文章区域(棕色框部分)的代码:

Article.vue

<template><ul><li class='list' v-for="article in articles"><p class="list-top"><a href="#" class="author"><span>{{ article.author }}</span></a><span class="time"> - {{ article.time}}</span></p><h2 class="title"><a href="#">{{ article.title }}</a></h2><span class="small-text">阅读 {{article.read}} -</span><span class="small-text">评论 {{article.comment}} -</span><span class="small-text">喜欢 {{article.like}} -</span><span class="small-text">打赏 {{article.pay}}</span><span class="image" :style="{background:article.src,backgroundSize:'100%',backgroundRepeat:'no-repat'}"></span></li></ul>
</template>
<script>export default {vuex: {getters: {articles: state => state.articles}}}
</script>

Article.vue和home.vue里获取数据的方式一样,由于未知文章数量,这里采用vue的列表渲染(是不是感觉很方便,有了vue,妈妈再也不用担心我的学习啦)。简书的首页到这里就写完成了,由于电脑越写越卡,这篇就先发了,接下来开第二篇文章,简书的专题页面和推荐页面,如果你发现本文章的错误之除,还请您斧正。
参考文章:用 Vuex 构建一个笔记应用 Vue构建单页应用最佳实战

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

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

相关文章

php + nginx 网站并发压力测试及优化

一、测试工具&#xff1a; Apache 压力测试工具ab ab是针对apache的性能测试工具&#xff0c;可以只安装ab工具。 ubuntu安装ab apt-get install apache2-utils centos安装ab yum install httpd-tools ab的参数详细解释 格式&#xff1a; ./ab [options] [http://]hostname[:po…

dedecms 如何调用多个不同栏目的文章_百度搜索引擎SEO,如何处理同义词?

对于SEO人员而言&#xff0c;我们非常清楚&#xff0c;我们所撰写的一篇篇优质的文章&#xff0c;实际上&#xff0c;都是通过中文分词之后&#xff0c;针对整个关键词词库经过合理的算法排序&#xff0c;存储在搜索引擎索引库。当我们有相关查询需求的时候&#xff0c;搜索引擎…

解决内部元素onMouseOver/onMouseOut事件冒泡触发父元素的相应事件

前阵子为BS项目模板做了一个左侧滑动信息栏&#xff0c;效果类似于windows状态栏的自动隐藏效果&#xff0c;鼠标移进滑出&#xff0c;鼠标移出隐藏&#xff0c;浮动时不占用空间&#xff0c;也可以固定住占一块位置。做的过程中遇到一个问题&#xff0c;鼠标在信息栏内部移动时…

用WP Super Cache和七牛为你的WordPress网站加速

众所周知&#xff0c;WordPress一直都是博客建站的首选程序&#xff0c;而现在也有越来越多的企业网站都选择采用WordPress来搭建。 WordPress虽好但其过于臃肿且响应速度慢等缺点也为站长们所诟病&#xff0c;目前网上介绍为WordPress加速的方法五花八门&#xff0c;各有各的优…

《网站建设与网页设计从入门到精通Dreamweaver+Flash+Photoshop+HTML+CSS+JavaScript》——3.3 添加文本元素...

本节书摘来自异步社区《网站建设与网页设计从入门到精通DreamweaverFlashPhotoshop&#xff0b;HTMLCSSJavaScript》一书中的第3章&#xff0c;第3.3节&#xff0c;作者&#xff1a; 何新起 更多章节内容可以访问云栖社区“异步社区”公众号查看。 3.3 添加文本元素 网站建设与…

《大型网站服务器容量规划》一3.1 通过监控规划容量

本节书摘来异步社区《大型网站服务器容量规划》一书中的第3章&#xff0c;第3.1节&#xff0c;作者&#xff1a; 郑钢 责编&#xff1a; 张涛&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 3.1 通过监控规划容量 任何一家互联网公司都会有自己的运维系统…

Web层框架对网站中所有异常的统一处理

一个网站的异常信息作为专业的人士&#xff0c;是不会轻易暴露给用户的&#xff0c;因为那样狠不安全&#xff0c;显得你漏是一回事&#xff0c;只要还是考虑到网站的数据安全问题&#xff0c;下面给大家分享一下一些常见的web层框架是如何处理统一的异常。 之前都是在Struts2…

如何使用AppScan扫描大型网站

经常有客户抱怨&#xff0c;说AppScan无法扫描大型的网站&#xff0c;或者是扫描接近完成时候无法保存&#xff0c;甚至保存后的结果文件下次无法打开?&#xff1b;同时大家又都很奇怪&#xff0c;作为一款业界出名的工具&#xff0c;如此的脆弱&#xff1f;是配置使用不当还是…

当SEO/SEM与良知正面碰撞

先从这几天一直很火的大学生“魏则西之死”这篇文章说起&#xff0c;虽然这对死者很不敬&#xff0c;但如果可以让我们深刻反省的话也是值得的&#xff0c;从知乎到4.28号这篇文章在微信被疯狂转载之后火速占领各大新闻版块头条&#xff0c;首先我们来看一下消息的源头&#xf…

VS2005在开发网站时的一个编译BUG

这两天我在用C#做一个WEB网站&#xff0c;用的是VS2005&#xff0c;碰到一个编译问题&#xff0c;害我查了很长时间&#xff0c;终于找到原因了-_- 放上来&#xff0c;如果有碰到相同问题的兄弟正好看看。现象&#xff1a;编译时&#xff0c;当页面对应的cs文件有错误时&#…

Bootstrap相关网站中简单的等待提醒

一、在页面中加入如下代码 <div class"modal fade" tabindex"-1" role"dialog" id"waitingModal"><div class"modal-dialog" role"document"><div class"modal-content"><div cla…

服务器网站访问ftp设置,服务器网站访问ftp设置方法

服务器网站访问ftp设置方法 内容精选换一换公网域名解析是基于Internet网络的域名解析过程&#xff0c;可以把人们常用的域名(如www.example.com)转换成用于计算机连接的IP地址(如1.2.3.4)。公网域名解析支持通过直接在浏览器中输入域名&#xff0c;访问网站或Web应用程序。云解…

服务器启动文件夹,win10系统开机启动文件夹的路径是什么_网站服务器运行维护...

装 k8s 要先装 Docker 吗&#xff1f;_网站服务器运行维护装k8s是不需要先装Docker&#xff0c;两者之间是没有依赖关系的&#xff0c;都是可以独立运行&#xff0c;但是两者是可以配合使用的&#xff0c;Docker是一个独立的应用程序&#xff0c;可以安装在任何计算机上运行容器…

不蒜子实现网站访问量访客数统计

个人博客网站&#xff1a;http://zhangchuanjun.cn 或者&#xff1a;我个人网站 有许多网站分析工具&#xff0c;比如百度统计&#xff0c;谷歌分析等工具&#xff0c;这类工具虽然有不错的网站统计功能&#xff0c;但是都不能呈现在自己的网站上&#xff0c;都需要进入相应的后…

使用CDN为您的网站加速(一)

CDN(Content Delivery Network)翻译为内容分发网络&#xff0c;是通过在现有的 Internet 中增加一层新的网络架构&#xff0c;将网站的内容发布到最接近用户的网络 " 边缘 " &#xff0c;使用户可以就近取得所需的内容&#xff0c;解决 Internet 网络拥塞状况&#x…

Flask开发微电影网站(五)

后台管理页面是系统管理员登录后对网站进行管理的前端页面 后台登录页面&#xff0c;如下图所示 管理员登录后的页面&#xff0c;如下图所示 管理员登录后&#xff0c;在右上角显示的管理员信息&#xff0c;如下图所示 管理员登录后&#xff0c;在页面中间部分的左侧显示管理菜…

监控.net 网站 Glimpse

使用Nuget 安装Glimpse 安装好后&#xff0c;config会默认添加几个节点 安装好之后 只需要浏览器输入 网站/Glimpse.axd 再次进入网站 就可以查看&#xff08;ajax sql session 等&#xff09; 转载于:https://www.cnblogs.com/jayblog/p/9324672.html

本地搭建网站--PHP网站

背景&#xff1a;组内需要一个博客系统记录些文档、同时扫盲学习mysql、PHP、域名相关知识点、RFS学习演练 方案&#xff1a;phpnow emlog 一、PHPnow 提供PHP网站环境&#xff08; 服务器 数据库 主机空间&#xff09; 傻瓜式安装 主站&#xff1a;http://servkit.org/ 注&a…

在服务器上搭建多个WordPress博客网站教程(超级详细)

实验准备 一台阿里云服务器二个域名&#xff08;IP与域名已经建立解析关系&#xff09;Linux关于web架构的知识 实验步骤 1.用crt远程登录阿里云服务器 2.安装nginx&#xff0c;mysql&#xff0c;php 建议使用lnmp一键安装包安装&#xff0c;方便快捷 获取lnmp一键安装包链接 l…

网站建设指南之网站HTTPS化与证书

通常我们说的HTTPS就是HTTPSSL证书&#xff0c;简单的说就是HTTP的安全版。HTTP网站的数据传输都是以明文形式&#xff0c;比如用户密码等信息都没有加密&#xff0c;很容易造成信息泄露。绑定SSL证书后&#xff0c;可以实现网站HTTPS化&#xff0c;加密用户与网站之间的交互访…