热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

在这个教程里面,我会通过一系列的代码和图片来学习怎么使用vue-router,以及vuex。本文假设读者手里有关于vue-router和Vuex的文档,并且对Vue-router和

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

首先看下这个网站的截图
《基于Vue,Vue-router,Vuex的简书网站模仿》

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

搭建项目

项目结构

本项目才用Vue-cli脚手架自动生成,这是一个Vue生态系统中一个伟大创举。这意味着我们不需要手动构建我们的项目,而它就可以很快地为我们生成。如图所示:
《基于Vue,Vue-router,Vuex的简书网站模仿》

  • 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)

首先分析页面结构(专题页面结构和首页一样,就不在单独赘述了,写到哪儿分析到哪儿)
《基于Vue,Vue-router,Vuex的简书网站模仿》

  • 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里面我们把两个侧边栏(绿色框和黄色框)写在这里边,因为这两个总是一直存在的

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

home.vue部分

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

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

不知道你看懂代码了没,没看懂不要紧,我来给你讲解,重点分析导航栏部分,为了让导航栏标签被选中时改变背景色,这里我使用了: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 = show
state.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


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


推荐阅读
  • 本文详细介绍了在 Vue.js 前端框架中集成 vue-i18n 插件以实现多语言支持的方法。通过具体的配置步骤和示例代码,帮助开发者快速掌握如何在项目中实现国际化功能,提升用户体验。同时,文章还探讨了常见的多语言切换问题及解决方案,为开发人员提供了实用的参考。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 在深入研究 React 项目的过程中,特别是在探索 react-router 源码时,我发现了其中蕴含的中间件概念。这激发了我对中间件的进一步思考与整理。本文将详细探讨 Redux 中间件的原理及其在实际项目中的应用,帮助读者更好地理解和使用这一强大工具。通过具体示例和代码解析,我们将揭示中间件如何提升应用的状态管理和异步操作处理能力。 ... [详细]
  • 深入解析 Vue 中通过 $route.params 实现参数传递的方法与技巧
    本文深入探讨了在 Vue 框架中利用 `$route.params` 进行参数传递的方法和技巧。通过详细解析 `$route.params` 的工作机制及其与 `$route.query` 的区别,帮助开发者更好地理解和应用这一功能。文章不仅涵盖了基本的使用方法,还提供了实际案例和最佳实践,以便读者能够灵活运用这些技术,提升开发效率和代码质量。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • MATLAB实现Sobel边缘检测算法
    图像边缘是指图像中灰度值发生显著变化的区域。Sobel算子是一种常用的边缘检测方法,通过计算图像灰度值的梯度来检测边缘。本文介绍了Sobel算子的基本原理,并提供了基于MATLAB的实现代码。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 命令模式是一种行为设计模式,它将请求封装成一个独立的对象,从而允许你参数化不同的请求、队列请求或者记录请求日志。本文将详细介绍命令模式的基本概念、组件及其在实际场景中的应用。 ... [详细]
  • 通过优化动态网络Cookies的全网互通机制,实现了用户在任意子站点的登录和注销操作均能同步至整个网络。具体实现涉及对三个关键文件的修改:首先,在`incDv_ClsMain.asp`中定位并调整`Response.Cookies`的相关设置;其次,更新`global.asa`以确保会话状态的一致性;最后,修改`login.asp`以支持跨域认证。这一改进不仅提升了用户体验,还增强了系统的安全性和可靠性。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • 理解和应用HTTP请求中的转发与重定向机制
    在HTTP请求处理过程中,客户端发送请求(通常简称为req),服务器进行相应处理后返回响应(通常简称为res)。理解和应用客户端的转发与重定向机制是前端开发的重要内容。这两种机制在Web开发中具有关键作用,能够有效管理和优化用户请求的处理流程。转发机制允许服务器内部将请求传递给另一个资源,而重定向则指示客户端向新的URL发起新的请求,从而实现页面跳转或资源更新。掌握这些技术有助于提升应用的性能和用户体验。 ... [详细]
  • 经过半年的精心整理,我们汇总了当前市场上最全面的Android面试题解析,为移动开发人员的晋升和加薪提供了宝贵的参考资料。本书详细涵盖了从基础到高级的各类面试题,帮助读者全面提升技术实力和面试表现。章节目录包括:- 第一章:Android基础面试题- 第二章:... ... [详细]
  • 2017年12月7日:React中实现不同组件间的路由导航
    在React应用中,实现从首页到不同组件的路由导航是常见的需求。本文介绍了如何通过配置路由来实现这一功能。具体步骤包括:1. 在首页设置路由链接,使其能够跳转到不同的目标组件;2. 确保目标组件正确配置,特别是在导入时使用默认导出(`default`),以确保路由能够正常工作。此外,文章还提供了详细的代码示例,帮助开发者更好地理解和实现这一功能。 ... [详细]
  • 这篇文章将揭示 Vue 和 React 组件库中五个鲜为人知的强大工具。这些工具均以纯 JavaScript 实现,功能卓越。其中,async-validator 是一个数据验证插件,不仅预置了 URL 和电子邮件的验证规则,还支持异步验证功能。 ... [详细]
author-avatar
mobiledu2502915347
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有