10: vue-router和单文件组件
1.1 vue-router路由基本使用
官网: https://router.vuejs.org/zh/api/#router-link
1、安装vue-router
bower info vue-router # 查看当前vue-router版本
cnpm install vue-route -S # 安装vue-router
安装后在:C:\Users\tom\node_modules\vue-router\dist 路径下会下载四个文件
2、使用Vue.js开发SPA(Single Page Application)单页面应用
1) mode:'history', //更改模式, url就不会出现 "#" 号了
2) linkActiveClass:'active' //更新活动链接的class类名
3) {path:'*', redirect:'/home'} //路由重定向
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>路由基本用法</title> <style> /* .router-link-active{ font-size:20px; color:#ff7300; text-decoration:none; } */ .active{ font-size:20px; color:#ff7300; text-decoration:none; } </style> <script src="js/vue.js"></script> <script src="js/vue-router.js"></script> </head> <body> <div id="itany"> <div> <!-- 使用router-link组件来定义导航,to属性指定链接url --> <router-link to="/home">主页</router-link> <router-link to="/news">新闻</router-link> </div> <div> <!-- router-view用来显示路由内容 --> <router-view></router-view> </div> </div> <script> //1.定义组件 var Home={ template:'<h3>我是主页</h3>' }; var News={ template:'<h3>我是新闻</h3>' }; //2.配置路由 const routes=[ {path:'/home',component:Home}, {path:'/news',component:News}, {path:'*',redirect:'/home'} //重定向 ]; //3.创建路由实例 const router=new VueRouter({ routes, //简写,相当于routes:routes mode:'history', //更改模式, url就不会出现 "#" 号了 linkActiveClass:'active' //更新活动链接的class类名 }); //4.创建根实例并将路由挂载到Vue实例上 new Vue({ el:'#itany', router //注入路由 }); </script> </body> </html>
1.2 路由嵌套、参数传递、路由结合动画
1、路由传参数的两种方法
<router-link to="/user/login?name=tom&pwd=123" tag="li">用户登陆</router-link>
<router-link to="/user/regist/alice/456" tag="li">用户注册</router-link>
2、获取路由传递的参数
var Login={ template:'<h4>用户登陆。。。获取参数:{{$route.query}},{{$route.path}}</h4>' }; var Regist={ template:'<h4>用户注册。。。获取参数:{{$route.params}},{{$route.path}}</h4>' };
1) {{$route.query}}: { "name": "tom", "pwd": "123" }
{{$route.path}}: /user/login
2) {{$route.params}}: { "username": "alice", "password": "456" }
{{$route.path}} : /user/regist/alice/456
3、添加路由和替换路由
注:添加路由和替换路由的区别是----替换路由不会显示历史
push(){
router.push({path:'home'}); //添加路由,切换路由
},
replace(){
router.replace({path:'user'}); //替换路由,没有历史记录
}
4、切换路由动画效果
<transition enter-active-class="animated bounceInLeft" leave-active-class="animated bounceOutRight"> <router-view></router-view> </transition>
1.3 单文件组件:.vue文件
1、.vue文件
1).vue文件,称为单文件组件,是Vue.js自定义的一种文件格式,一个.vue文件就是一个单独的组件,在文件内封装了组件相关的代码:html、css、js
2).vue文件由三部分组成:<template>、<style>、<script>
<template> html </template> <style> css </style> <script> js </script>
2、vue-loader
1)浏览器本身并不认为.vue文件,所以必须对.vue文件进行加载解析,此时需要vue-loader
2)类似的loader还有许多,如:html-loader、css-loader、style-loader、babel-loader等
3)需要注意的是vue-loader是基于webpack的
3、webpack
1)webpack是一个前端资源模板化加载器和打包工具,它能够把各种资源都作为模块来使用和处理
2)实际上,webpack是通过不同的loader将这些资源加载后打包,然后输出打包后文件
3)简单来说,webpack就是一个模块加载器,所有资源都可以作为模块来加载,最后打包输出
4)[官网](http://webpack.github.io/)
webpack版本:v1.x v2.x
webpack有一个核心配置文件:webpack.config.js,必须放在项目根目录下
1.4 手动创建一个vue项目步骤
1、项目目录结构
C:. │ .babelrc # 我们要使用ES6语法所以要配置babel │ App.vue # vue文件 │ index.html │ main.js # 入口文件 │ package.json # 工程文件(执行命令创建):npm init --yes │ webpack.config.js # webpack配置文件 │ └─components # 这个地方是放组件的目录 User.vue
2、安装相关模板
# 生成依赖 cnpm install vue -S # 开发依赖 cnpm install webpack -D # webpack就是一个模块加载器,识别.vue文件 cnpm install webpack-dev-server -D # webpack自己启动服务的一个服务器 # 加载各种模块的loader cnpm install vue-loader -D cnpm install vue-html-loader -D cnpm install css-loader -D cnpm install vue-style-loader -D cnpm install file-loader -D # 项目中使用的字体、字库加载 cnpm install babel-loader -D cnpm install babel-core -D cnpm install babel-preset-env -D # 根据配置的运行环境自动启用需要的babel插件 cnpm install vue-template-compiler -D # 预编译模板 合并:cnpm install -D webpack webpack-dev-server vue-loader vue-html-loader css-loader vue-style-loader file-loader babel-loader babel-core babel-preset-env vue-template-compiler
3、main.js
1. 使用ES6语法引入模板
2. 使用render函数渲染组件
/** * 使用ES6语法引入模板: main.js */ import Vue from 'vue' import App from './App.vue' new Vue({ el:'#app', render:function(h){ //使用render函数渲染组件 return h(App); } });
4、编写webpack.config.js
1. 配置入口文件
2. 配置入口文件输出位置
3. 配置模块加载器
module.exports={ //1、配置入口文件 entry:'./main.js', //2、配置入口文件输出位置 output:{ path:__dirname, //项目根路径 filename:'build.js' }, //3、配置模块加载器 module:{ rules:[ { test:/\.vue$/, //所有以.vue结尾的文件都由vue-loader加载 loader:'vue-loader' }, { test:/\.js$/, //所有以.js结尾的文件都由babel-loader加载,除了node_modules以外 loader:'babel-loader', exclude:/node_modules/ } ] } };
5、编写.babelrc
1. 预设值加载文件
{ "presets":[ ["env",{"module":false}] ] }
6、编写package.json
1. 修改package.json中测试脚本变成运行脚本
"scripts": {
"dev":"webpack-dev-server --open --hot --port 8800"
},
2. 参数的意思
webpack-dev-server 启动一个server
--open 打开一个浏览器
--hot 修改文件后热加载
--port 8800 监听端口号
{ "name": "webpack-demo", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "dev":"webpack-dev-server --open --hot --port 8800" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "vue": "^2.3.4" }, "devDependencies": { "babel-core": "^6.25.0", "babel-loader": "^7.1.1", "babel-preset-env": "^1.5.2", "css-loader": "^0.28.4", "file-loader": "^0.11.2", "vue-html-loader": "^1.2.4", "vue-loader": "^13.0.0", "vue-style-loader": "^3.0.1", "vue-template-compiler": "^2.3.4", "webpack": "^3.0.0", "webpack-dev-server": "^2.5.0" } }
7、其他文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"></div> <script src="build.js"></script> </body> </html>
<template> <div id="itany"> <h1>welcome</h1> <h2 @click="change">{{name}}</h2> <User></User> </div> </template> <script> //导入模块 import User from './components/User.vue' // console.log(111); export default { data(){ return { name:'tom' } }, methods:{ change(){ this.name='汤姆'; } }, components:{ User } } </script> <style> body{ background-color:#ccc; } </style>
<template> <div class="user"> <h2>用户列表</h2> <ul> <li v-for="value in users">{{value}}</li> </ul> </div> </template> <script> export default { data(){ return { users:['tom','jack','mike','alice'] } } } </script> <style scoped> /* scoped表示该样式只在当前组件中有效 */ h2{ color:red; } </style>
8、启动程序
npm run dev
9、效果图
作者:学无止境
出处:https://www.cnblogs.com/xiaonq
生活不只是眼前的苟且,还有诗和远方。