赞
踩
vue是什么
Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合
vue的优点
体积小
压缩后33K
更高的运行效率
基于虚拟dom,一种可以预先通过JavaScript进行各种计算,把最终的DOM操作计算出来并优化的技术,由于这个DOM操作属于预处理操作,并没有真实的操作DOM,所以叫做虚拟DOM
双向数据绑定
即当数据发生变化的时候, 视图也就发生变化, 当视图发生变化的时候,数据也会跟着同步变化
生态丰富、学习成本低
市场上拥有大量成熟、稳定的基于vue.js的ui框架、常用组件!拿来即用实现快速开发!
对初学者友好、入门容易、学习资料多;
<!-- 对于制作原型或学习,你可以这样使用最新版本 -->
<script src="https://unpkg.com/vue@next"></script>
访问该网址可以看到vue的源码,可以jiang’ta
引入CDN后可以使用vue语法实现以下一个简单的小功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--view层,模板--> <div id="app"> {{message}} </div> <!--1.导入Vue.js--> <script src="https://unpkg.com/vue@next"></script> <script type="text/javascript"> /*vue变量*/ var vm = new Vue({ /*与Html中的元素绑定*/ el:"#app", /*Model:数据*/ data:{ message:"hello,vue!" } }); </script> </body> </html>
el
:标记被挂载的元素
data
:数据对象
Question1:Vue实例的作用范围是什么呢?
Vue会管理el选项命中的元素及其内部的后代元素
Question2:是否可以使用其他的选择器?
可以使用其他的选择器,但是建议使用ID选择器
Question3:是否可以设置其他的dom元素呢?
可以使用其他的双标签,不能使用HTML和BODY
v-text
读取vue实例变量并显示
demo
<div id="text">
<!--这里还涉及到字符串拼接操作-->
<h1 v-text="showtext+'我是被拼接的字符串'"></h1>
<h2>show {{showtext}} </h2>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:"#text",
data:{
showtext:"Hello,Vue"
}
})
</script>
结果
v-html
设置元素的innerHTML,内部的标签会被解析
demo
<div id="test">
<p v-html="showtest"></p>
<p v-text="showtest"></p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el:"#test",
data:{
showtest:"<a href=\"www.baidu.com\">百度一下</a>"
}
})
</script>
结果
v-on
作用:
1、为元素绑定事件,绑定的方法定义在
methods
属性中2、传递自定义参数,事件修饰符
事件
demo
<div id="test"> <input type="button" value="v-on指令" v-on:click="dolt"> <input type="button" value="v-on指令简写" @click="dolt"> <input type="button" value="双击事件" @dblclick="dolt"> <!-- 事件绑定可以传形参 --> <input type="button" value="v-on指令简写" @click="doit(p1,p2)"> <!--事件修饰符--> <!--按回车键时,触发该事件--> <input type="button" value="v-on指令简写" @keyup.enter="methods中的方法名,说明按回车时触发什么事件"> <p @click="thisfunc">{{msg}}</p> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script type="text/javascript"> var vm = new Vue({ el: "#test", data: { msg: "this代表当前vm对象" }, methods: { dolt: function () { alert("事件绑定出发"); }, thisfunc: function () { this.msg+="被调用" }, } }) </script>
结果
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>loki</title> </head> <body> <div id="test"> <button @click="sub">-</button> <span v-text="count"></span> <button @click="add">+</button> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script type="text/javascript"> var vm = new Vue({ el: "#test", data: { count: 1 }, methods: { add: function () { if (this.count < 5) this.count++; else alert("最小值") }, sub: function () { if (this.count > 0) this.count--; else alert("最小值") } }) </script> </body> </html>
v-show
通过判断条件切换元素的显示状态
原理是修改元素的display属性
指令后面的内容最终都会被解析为布尔值,值为true显示,为false隐藏
demo
<div id="test">
<!--p标签中的内容会根据这个布尔值来判断是否显示-->
<p v-show="true">正常显示</p>
<p v-show="age<18">不显示</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: "#test",
data: {
istrue: true,
age:17
}
})
</script>
v-if
& v-else
原理:与v-show修改元素的display属性不同,v-if直接操作dom
效果与v-if一致
频繁切换的元素用v-show指令,反之用v-if
v-bind
设置HTML元素的属性
demo
<!--V-bind的简写 : -->
<img v-bind:class="isActive?'active':''" :src="imgSrc" :title="title">
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
el: "#test",
data: {
isActive: true,
title: "标题传参",
imgSrc: "../static/img/1.jpg"
}
})
</script>
v-for
<ul>
/*index指下标*/
<li v-for="(item,index) in arr">
{{index+1}} 号: {{item}}
</li>
</ul>
v-model
可以用
v-model
指令在表单、及元素上创建双向数据绑定,实现数据与视图同步变化
demo
<div id="test"> <select v-model="selected"> <option value="" disabled>请选择</option> <option>A</option> <option>B</option> <option>C</option> </select> <span >{{selected}}</span> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script type="text/javascript"> var vm = new Vue({ el: "#test", data: { selected:"" } }) </script>
组件是可复用的Vue
实例, 说白了就是一组可以重复使用的模板, 跟JSTL
的自定义标签、Thymeleal
的th:fragment
等框架有着异曲同工之妙,通常一个应用会以一棵嵌套的组件树的形式来组织:
例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。
自定义组件
使用
props
属性传递参数
<div id="app"> <!--组件:传递给组件中的值:props--> <loki v-for="item in items" v-bind:diyloki="item"></loki> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script type="text/javascript"> //定义组件 Vue.component("loki",{ props:['diyloki'], template:'<li>{{diyloki}}</li>' }); var vm = new Vue({ el:"#app", data:{ items:["java","Linux","前端"] } }); </script>
v-for="item in items"
:遍历Vue实例中定义的名为items的数组,并创建同等数量的组件v-bind:diyloki="item"
:将遍历的item项绑定到组件中props定义名为item属性上;= 号左边的panh为props定义的属性名,右边的为item in items 中遍历的item项的值Axios是一个开源的可以用在浏览器端和Node JS的异步通信框架, 主要作用就是实现AJAX异步通信,其功能特点如下
由于Vue.js
是一个视图层框架并且作者(尤雨溪) 严格准守SoC(关注度分离原则)所以Vue.js
并不包含AJAX的通信功能,所以Axios的出现就是为了解决解决通信问题(也可以用jQuery.ajax()实现通信)
<!DOCTYPE html> <html lang="en" xmlns:v-binf="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title> <!--v-cloak 解决闪烁问题--> <style> [v-cloak]{ display: none; } </style> </head> <body> <div id="vue"> <div>地名:{{info.name}}</div> <div>地址:{{info.address.country}}--{{info.address.city}}--{{info.address.street}}</div> <div>链接:<a v-binf:href="info.url" target="_blank">{{info.url}}</a> </div> </div> <!--引入js文件--> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script type="text/javascript"> var vm = new Vue({ el:"#vue", //data:属性:vm data(){ return{ info:{ name:null, address:{ country:null, city:null, street:null }, url:null } } }, mounted(){//钩子函数 axios .get('data.json') .then(response=>(this.info=response.data)); } }); </script> </body> </html>
测试数据
{ "name": "Loki", "url": "oliverloki.github.io", "page": 1, "isNonProfit": true, "address": { "street": "含光门", "city": "陕西西安", "country": "中国" }, "links": [ { "name": "bilibili", "url": "https://space.bilibili.com/95256449" }, { "name": "vue", "url": "https://cn.vuejs.org/v2/guide/index.html" }, { "name": "百度", "url": "https://www.baidu.com/" } ] }
在
Vue.js
中我们使用<slot>
元素作为承载分发内容的出口,作者称其为插槽,可以应用在组合组件的场景中
vue-cli官方提供的一个脚手架,用于快速生成一个vue的项目模板;
预先定义好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个骨架项目,这个估计项目就是脚手架,我们的开发更加的快速;
需要的基础环境
Node.js:http://nodejs.cn/download/
Git:https://git-scm.com/doenloads
安装教程
# -g 就是全局安装
npm instal1 vue-cli-g
ps:可能因为网络问题下载失败,可以寻找镜像下载
新建一个空文件夹,在当前目录下执行
vue init webpack lokivue //这个是你的项目名称
//这里会配置一大堆
webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler) 。当webpack处理应用程序时, 它会递归地构建一个依赖关系图(dependency graph) , 其中包含应用程序需要的每个模块, 然后将所有这些模块打包成一个或多个bundle.
//安装打包工具
npm install webpack -g
//安装客户端
npm install webpack-cli -g
验证是否安装成功
webpack -v
用webpack打包自己的文件
创建 webpack.config.js
配置文件
entry:入口文件, 指定Web Pack用哪个文件作为项目的入口
output:输出, 指定WebPack把处理完成的文件放置到指定路径
module:模块, 用于处理各种类型的文件
plugins:插件, 如:热更新、代码重用等
resolve:设置路径指向
watch:监听, 用于设置文件改动后直接打包
module.exports = {
entry:"",
output:{
path:"",
filename:""
},
module:{
loaders:[
{test:/\.js$/,;\loade:""}
]
},
plugins:{},
resolve:{},
watch:true
}
webpack打包Demo
项目结构
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--第一步:暴露一个方法:sayHi exports.sayHi = function () { document.write("<h1>我被main.js引入,然后被webpack打包了</h1>") } --> <!--第二步:require 导入一个模块,就可以调用这个模块中的方法了 var hello = require("./hello"); hello.sayHi() --> <!--第三步:使用webpack打包,自动导出dist/js/bundle.js--> <!--前端模块化开发--> <script src="dist/js/bundle.js"></script> </body> </html>
vue-router是一个插件包,是Vue.js官方的路由管理器。它和Vue.js的核心深度集成, 让构建单页面应用变得易如反掌
vue-router是一个插件包, 所以还是需要用npm进行安装的
//当前项目目录下以管理员身份运行
npm install vue-router --save-dev
如果在一个模块化工程中使用它,必须要通过Vue.use()明确地安装路由功能
main.js
import Vue from 'vue'
import VueRouter from "vue-router"
//显示声明使vue-router
Vue.use(VueRouter)
安装路由,在src目录下,新建一个文件夹:router
,专门存放路由,配置路由index.js,如下
前端工程中,习惯性将当前项目的主配置文件命名为index
项目结构
index.js
//需要的组件需要在路由中配置 import Vue from 'vue' //导入路由组件 import Router from "vue-router" //导入自定义组件 import Content from "../components/Content"; import Main from "../components/Main"; //安装路由 Vue.use(Router); //配置导出路由 export default new Router({ routes:[ { //路由路径 @RequestMapping path:'/content', //路由名称 name:'content', //跳转的组件 component:Content }, { //路由路径 path:'/Main', name:'Main', //跳转的组件 component:Main } ] });
main.js
import Vue from 'vue' import App from './App' import VueRouter from "vue-router" //导入上面创建的路由配置目录 import router from './router' //自动扫描里面的路由配置 //来关闭生产模式下给出的提示 Vue.config.productionTip = false; //显示声明使vue-router Vue.use(VueRouter) new Vue({ el: '#app', //配置路由 router, components: { App }, template: '<App/>' })
app.vue
<template> <div id="app"> <!--实现界面跳转--> <router-link to="/main">首页</router-link> <router-link to="/content">内容页</router-link> <!--这行代码是为了页面展示--> <router-view></router-view> </div> </template> <script> export default { name: 'App' } </script> <style> </style>
import ...
export default new Router({
routes: [
{
//登录页
path: '/main',
component: Main,
/*子路由*/
children: [
{path:'/user/profile',component:UerProfile},
{path:'/user/list',component:UerList}
]
}
]
})
#进入工程目录
cd hello-vue
#安装vue-routern
npm install vue-router --save-dev
#安装element-ui
npm i element-ui -S
#安装依赖
npm install
# 安装SASS加载器
cnpm install sass-loader node-sass --save-dev
#启功测试
npm run dev
template中的所有文本都需要在标签内
html
<router-link v-bind:to="{name: '/submit',params:{username:loki}">提交</router-link>
router–index.js
{
path: '/submit/:username',
component: Login
}
import ...
export default new Router({
routes: [
{
//登录页
path: '/main',
component: Main,
/*子路由*/
children: [
{path:'/user/profile',component:UerProfile},
{path:'/user/list',component:UerList}
]
}
]
})
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。