Vue 2.0+Vue-router构建一个简单的单页应用(附源码)


Posted in Javascript onMarch 14, 2017

一、介绍

vue.js 是 目前 最火的前端框架,vue.js 兼具 angular.js 和 react.js 的优点,并剔除它们的缺点,并且提供了很多的周边配套工具 如vue-router 、vue-resource 、vuex等等 ,通过他们我们可以很轻松的构建一个大型单页应用。

目前Vue版本为:Vue2.0

官网地址:http://vuejs.org.cn/

查看API文档:https://vuefe.cn/v2/api/

对比其他框架:http://vuejs.org.cn/guide/comparison.html

二、环境搭建

我们使用vue-cli脚手架工具构建

#安装 vue-cli

npm install -g vue-cli

#使用vue-cli初始化项目

vue init webpack vue-vuerouter-demo

#进到目录

cd vue-vuerouter-demo

#安装依赖 

npm install

#开始运行 

npm run dev

浏览器访问http://localhost:8080

构建完成之后基本目录结构如下:

Vue 2.0+Vue-router构建一个简单的单页应用(附源码)

流程说明:

     1、首先会打开首页 也就是我们看到的index.html文件

     2、使用webpack打包之后默认加载main.js文件并将其引入到index.html文件中

三、开发

我们在main.js文件中引入相关模块以及组件

import Vue from 'vue'
import App from './App'
import router from './router' //这里引入的是router目录,会默认识别里面的index.js文件(不能是其他名字)

// 引入并使用vue-resource网络请求模块
import VueResource from 'vue-resource'
Vue.use(VueResource)

实例化vue对象配置选项路由及渲染App组件

new Vue({
 el: '#app', //这里绑定的是index.html中的id为app的div元素
 router,
 render: h => h(App)

 // 这里的render: h => h(App)是es6的写法 
 // 转换过来就是: 暂且可理解为是渲染App组件
 // render:(function(h){
 //  return h(App);
 // });

})

App.vue文件是我们的组件入口,之后所有的开发在这里面进行

<template>
 <div id="app">
 <!-- <hello></hello> -->
 <div class="nav">
   <!-- 使用 router-link 组件来导航. -->
  <!-- 通过传入 `to` 属性指定链接. -->
  <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
  <ul>
   <li><router-link to="/home">Home</router-link></li>
   <li><router-link to="/about">About</router-link></li>
  </ul>
 </div>
  <div class="main">
 <!-- 路由匹配到的组件将渲染在这里 -->

  <router-view></router-view>
  </div>
 </div>
</template>

<script>
// import Hello from './components/Hello'

export default {
 name: 'app',
 components: {
 // Hello
 }
}
</script>

<style>
body{
 background-color: #f8f8ff;
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 color: #2c3e50;
}


.nav{
 position: fixed;
 width: 108px;
 left: 40px;
}
.nav ul{
list-style: none;
 margin: 0;
 padding: 0;
}
.nav ul li{
 width: 108px;
 height: 48px;
 line-height: 48px;
border:1px solid #dadada;
text-align: center;
}
.nav ul li a{
 text-decoration: none;
}

.main{
 height: 400px;
 margin-left: 180px;
 margin-right: 25px;
}

</style>

要使用路由我们首先要在router/index.js文件中创建路由并配置路由映射 ,并通过export输出router到main.js文件中

// 这里面负责写路由映射,便于管理


// 引入路由模块并使用它
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)



// 创建路由实例并配置路由映射 
// path:'*',redirect:'/home' 重定向到path是/home的映射
const router = new VueRouter({
 routes:[{
  path: '/home', component: require('../components/Home.vue')
 },{
  path: '/about', component: require('../components/About.vue')
 },{
  path:'*',redirect:'/home'
 }]
})


// 输出router
export default router;

上面配置了2个组件映射 分别Hme.vue组件和About组件,配置好之后我们就可以开始使用路由了

<!-- 使用 router-link 组件来导航. -->
  <!-- 通过传入 `to` 属性指定链接. -->
  <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
  <ul>
   <li><router-link to="/home">Home</router-link></li>
   <li><router-link to="/about">About</router-link></li>
  </ul>
<!-- 路由匹配到的组件将渲染在这里 -->
  <router-view></router-view>

点击home和about导航会映射到对应的组件,然后将组件渲染在</router-view>这里面

到此,整个流程我们已经走通了。

接下来我们使用vue-resource网络插件动态加载数据并显示出来

1、先在main.js文件中引入并使用vue-resource网络请求模块

import VueResource from 'vue-resource'
Vue.use(VueResource)

2、创建Home.vue组件

我们需要在created钩子函数中去请求网络,这里我们使用豆瓣的API去请求电影列表数据,请求成功之后我们将其数据显示到页面中

<template>
 <div class="home">
 <h1>{{ msg }}</h1>
 <ul>
  <li v-for="article in articles">
  
   <div class="m-img inl-block"><img v-bind:src="article.images.small"/></div>
  <div class="m-content inl-block">
   <div>{{article.title}}</div>
  <div>年份:{{article.year}}</div>
   <div>类型:{{article.subtype}}</div>
  </div>
  </li>
 </ul>
 </div>
</template>

<script>

// mounted 钩子函数 这里去请求豆瓣数据

export default {
 name: 'home',
 data () {
 return {
  msg: '电影列表',
  articles:[]
 }
 },
 created:function(){ //这里mounted和created生命周期函数区别
  this.$http.jsonp('https://api.douban.com/v2/movie/top250?count=10', {}, {
  headers: {

  },
  emulateJSON: true
 }).then(function(response) {
  // 这里是处理正确的回调
  console.log(response);
  this.articles = response.data.subjects
  // this.articles = response.data["subjects"] 也可以

 }, function(response) {
  // 这里是处理错误的回调
  console.log(response)
 });
 }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
ul{
 list-style: none;
 margin: 0;
 padding: 0;
}
ul li{
border-bottom: 1px solid #999;
padding: 10px 0;
}

.inl-block{
display: inline-block;
}

.m-img{
 
}
.m-content{
margin-left: 20px;
}
</style>

3、最后我们运行npm run dev命令查看页面显示效果

Vue 2.0+Vue-router构建一个简单的单页应用(附源码)

OK,可以看到我们的数据成功加载出来了,可以点击左侧的导航来进行导航内容切换

总结

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
ExtJS 2.0实用简明教程之应用ExtJS
Apr 29 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
Jul 08 Javascript
jquery实现弹出窗口效果的实例代码
Nov 28 Javascript
js中事件的处理与浏览器对象示例介绍
Nov 29 Javascript
js控制分页打印、打印分页示例
Feb 08 Javascript
JS留言功能的简单实现案例(推荐)
Jun 23 Javascript
javascript观察者模式实现自动刷新效果
Sep 05 Javascript
web前端vue实现插值文本和输出原始html
Jan 19 Javascript
jQuery 操作 HTML 元素和属性的方法
Nov 12 jQuery
小程序测试后台服务的方法(ngrok)
Mar 08 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
Aug 26 Javascript
webpack常用构建优化策略小结
Nov 21 Javascript
vuejs响应用户事件(如点击事件)
Mar 14 #Javascript
微信小程序 在线支付功能的实现
Mar 14 #Javascript
JS和canvas实现俄罗斯方块
Mar 14 #Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
Mar 14 #Javascript
canvas实现刮刮卡效果
Mar 14 #Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
Mar 14 #Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
Mar 14 #Javascript
You might like
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
PHP中大于2038年时间戳的问题处理方案
2015/03/03 PHP
php获取错误信息的方法
2015/07/17 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
JavaScript CSS 修改学习第四章 透明度设置
2010/02/19 Javascript
HTML Dom与Css控制方法
2010/10/25 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
jQuery中的pushStack实现原理和应用实例
2015/02/03 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
2020/07/28 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
JavaScript鼠标悬停事件用法解析
2020/05/15 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
python进程类subprocess的一些操作方法例子
2014/11/22 Python
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
python读取几个G的csv文件方法
2019/01/07 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
python Django的web开发实例(入门)
2019/07/31 Python
网络管理员岗位职责
2015/02/12 职场文书
英文慰问信
2015/02/14 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书