vue学习笔记(1): 大前端预备知识及vue基本语法的使用
前言:本文属于博主个人观看黑马程序员vue入门课程的学习笔记,博主也是小白。如果有不对的地方希望各位帮忙指出。本文主要还是我的学习总结,因为网上的一些知识分布比较零散故作整理叙述。如果有不对的地方,还请帮忙指正。本文不产生任何收益,如有出现禁止转载、侵权的图片,亦或者文字内容请联系我进行修改。
文章目录
相关参考:
黑马程序员vue前端基础教程-4个小时带你快速入门vue:链接: link.
爱吃肉的狮子:vue中v-model使用:链接: link.
a8892117 VueJs(6)—V-on指令:链接: link.
Vue.js官方文档:链接: link.
瓜皮唐 MV* 模式不得不说的故事:链接: link.
Cacra:前端构建工具简介:链接: link.
JeffreytheCoder【Vue简易入门】什么是Vue?:链接: link.
huwao:2018几大主流的UI/JS框架——前端框架:链接: link.
云奕:Sass和less的区别是什么?用哪个好链接: link.
提示:以下是本篇文章正文内容,下面案例可供参考
1. 什么是CSS预处理器?
CSS作为一个标记语言,本身不是编程语言,存在以下缺点:语法不够强大,无法进行嵌套书写;不可以自定义变量,缺少合理的复用机制;难以维护。
但CSS有一些扩展功能的写法,可以让CSS能支持一些编程语言才有的功能。但可扩展CSS语言中的写法是不能被浏览器解析的,所以这些扩展CSS的语言有预处理器,作用是把上面这段浏览器不认识的代码,还原做浏览器认识的CSS标准给浏览器解析。
我们也可以简单地理解,即用一种专门的编程语言来进行Web页面样式设计,再通过编译器转换成正常的CSS文件以供项目使用。
开发者可以使用CSS预处理器进行CSS编码工作。
常用的CSS预处理器:
- SASS:基于Ruby环境,服务端处理解析相对快,功能强大,学习难度也更大。
- LESS:基于Node.js环境,客户端处理解析相对慢,功能更简单,学习难度也更简单。
2. 常用前端框架介绍
使用前端框架可以很好的避免重复造轮子的问题,同时可以满足快速开发的需求,节约时间成本,其中JS框架注重的是网页逻辑的搭建,UI框架更像是一个设计师,提供很多已经设计好的风格供你使用。
2.1 JavaScript框架介绍
- jQuery:由John Resig创建于2006年的开源项目,具有轻量级,强大选择器,出色DOM操作封装,完善Ajax等优势。
- Angular:诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。AngularJS有着诸多特性,最为核心的是:MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。
- React:由facebook推出,轻量级框架具有灵活性和响应性,利用虚拟DOM,基于文档对象模型,允许浏览器友好地以HTML,XHTML或XML格式排列文档,但学习路线较为陡峭。
- Vue:Vue是由尤雨溪开发的一套用于构建用户界面的渐进式JavaScript框架,开发者可以由简单组件写起,渐渐搭建出一个复杂的前端平台,并且有了自己的独特功能-计算属性。形成Vue渐进式框架的核心概念为:组件化,MVVM,响应式,和生命周期。
- Axios:Axios关注通信,相当于Ajax,而Vue关注DOM,没有通信能力,所以vue需要搭配Ajax或是Axios来实现异步通信。
2.2 UI框架介绍
- Ant-Design: 阿里出品,基于React
- ElementUI: 饿了么出品,基于Vue
- BootStrap: Twitter出品,开源工具包
- AmazeUI: HTML5跨屏前端框架
3. 前端构建工具
3.1 什么是构建工具
构建工具是为了减少重复工作,实现自动化的工具。
构建其实是工程化、自动化思想在前端开发中的体现,将一系列流程用代码去实现,让代码自动化地执行这一系列复杂的流程。
构建可以实现如下内容:
- 代码转换:将 TypeScript/es6 编译成JavaScript、将 SCSS 编译成 CSS等。
- 文件优化:压缩JavaScript、CSS、HTML 代码,压缩合并图片等。
- 代码分割:提取多个页面的公共代码,提取首屏不需要执行部分代码让其异步记在。
- 模块合并:在采用模块化的项目里会有很多个模块和文件,需要通过构建功能将模块分类合并成一个文件。
- 自动刷新:监听本地源代码变化,自动重新构建、刷新浏览器。
- 代码校验:在代码被提交到仓库前需要校验代码是否符合规范,以及单元测试是否通过。
- 自动发布:更新代码后,自动构建出线上发布代码并传输给发布系统。
3.2 构建工具简单介绍
构建工具发展:Npm Scripts、Grunt、Gulp、FIS 3、Webpack、Rollup、Parcel
这里简单介绍Babel和WebPack:
1. Babel: JS编译工具,主要用于浏览器不支持的ES新特性,比如用于编译TypeScript。
2. WebPack:模块打包器,主要作用是打包、压缩、合并及按序加载。在Webpack里一切文件皆模块,通过 loader 转换文件,通过Plugin 注入钩子,最后输出由多个模块组合成的文件。Webpack 专注于构建模块化项目。
一切文件,如JavaScript、CSS、SCSS、图片、模板,对于Webpack 来说都是一个个模块,这样的好处是能清晰地描绘各个模块之间的依赖关系,以方便Webpack进行组合和打包,经过Webpack的处理,最终会输出浏览器能使用的静态资源。
(官网图片)
4. MV* 模式
4.1 MV*模式有哪些
- MVC:同步通信为主,Model-View-Controller 最早应用于后端开发,渐渐也应用在前端领域,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。具有低耦合、重用性高、部署快的优点。但由于模型和视图的分离,会给调试带来一定的困难。
- MVP:异步通信为主,Model-View-Presenter(呈现),是MVC架构的一种演变。MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。 MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。
各部分之间的通信,都是双向的。 View 与 Model 不发生联系,都通过 Presenter 传递。 - MVVM:异步通信为主,Model-View-ViewModel,是一种基于MVC的设计,开发人员在HTML上写一些Bindings,利用一些指令绑定,就能在Model和ViewModel保持不变的情况下,很方便的将UI设计与业务逻辑分离,从而大大的减少繁琐的DOM操作。实现了前后端更好的分离。
4.2 MVVM 模式
前后端分手大师,比起MVC更加彻底的实现了前后端分离,前端不应该做复杂的数据处理工作,只要请求后端对外接口得到返还数据即可,促进了前端开发与后端业务逻辑的分离,极大地提高了前端开发效率,使用接口来进行前后端数据通信,通过双向数据绑定视图与数据,数据传递是双向的,也就是说当数据改变时会导致视图改变,同理,视图改变时,数据也会发生改变。
ViewModel相当于观察者,即可观察数据变化,并对视图对应内容进行更新,也可监听视图变化,并能通知数据发生改变。Vue.js就是ViewModel层的实现者。
(图转)
5. Vue 基本语法介绍及使用示例
5.1 Vue实例
5.1.1 创建一个Vue实例
任何Vue应用都是通过用Vue函数创建一个Vue实例开始的。我们可以往实例中传入选项数据,诸如data(数据),methods(方法),computed(计算属性)等。完整选项数据可以参考Vue官网API文档。
<!--导入vue.js-->
<script src="http://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm = new Vue({
// 选项
})
</script>
5.1.2 数据与方法
当一个 Vue 实例被创建时,它将 data 对象中的所有的 property 加入到 Vue 的响应式系统中。当这些 property 的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。
<script>
// 我们的数据对象
var data = { a: 1 }
// 该对象被加入到一个 Vue 实例中
var vm = new Vue({
data: data
})
//你也可以直接写在一起
var vm=new Vue({
data:{a:1}
})
// 获得这个实例上的 property
// 返回源数据中对应的字段
vm.a == data.a // => true
// 设置 property 也会影响到原始数据
vm.a = 2
data.a // => 2
// ……反之亦然
data.a = 3
vm.a // => 3
</script>
当这些数据改变时,视图会进行重渲染。值得注意的是只有当实例被创建时就已经存在于 data 中的 property 才是响应式的。
如果新添加一个property
vm.b = 'hi'
那么,b的改动不会触发视图更新。观察左端{{data}},没有发生同步变化。
5.1.3 生命周期钩子
每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。
比如 created 钩子可以用来在一个实例被创建之后执行代码:
<script>
new Vue({
data: {
a: 1
},
created: function () {
// `this` 指向 vm 实例
console.log('a is: ' + this.a)
}
})
// => "a is: 1"
</script>
也有一些其它的钩子,在实例生命周期的不同阶段被调用,如 mounted、updated 和 destroyed。生命周期钩子的 this 上下文指向调用它的 Vue 实例。
5.1 v-bind
代码如下(示例):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.active{
border: 1px solid blue;
}
</style>
</head>
<body>
<div id="app">
<!-- 通过v-bind为元素绑定属性 v-bind:属性名 也可以简写 :属性名-->
<!-- <img v-bind:src="imgSrc">-->
<!-- <img v-bind:title="imgTitle">-->
<!-- 通过v-bind进行元素绑定时,把v-bind省略只写:也是可以的-->
<!-- <img :src="imgSrc">-->
<!-- <img :title="imgTitle+'!!!!!!'">-->
<!-- <br/>-->
<!-- 利用isActive做判断条件进行三元组判定的两种写法-->
<!-- 点击之后给图片加上边框-->
<!-- 只有isActive为真时,类名才为active,才能激活css修饰-->![在这里插入图片描述](https://img-blog.csdnimg.cn/20210622191917620.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzODE1ODY5,size_16,color_FFFFFF,t_70)
<img :class="isActive?'active':''" :src="imgSrc" :title="imgTitle" @click="imgClick">
<!-- <img v-bind:class="{active:isActive}">-->
</div>
</body>
<!--导入vue.js-->
<script src="http://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm=new Vue({
//el提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标。
//可以是 CSS 选择器,也可以是一个 HTMLElement 实例。
el:"#app",
data:{
imgSrc:"show.jpg",
imgTitle:"kouti",
isActive:false
},
//定义一个图片点击相应函数
methods:{
imgClick:function (){
//点击之后isActive取反
this.isActive=!this.isActive;
}
}
})
</script>
</html>
点击图片之后,出现css设定好的边框修饰,再点击消失。
.
5.2 v-if
v-if使用一般有两个场景:
- 多个元素通过条件判断展示或者隐藏某个元素。或者多个元素
- 进行两个视图之间的切换
下面演示的是情形1的实现。
代码如下(示例):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--v-if根据表达值的真假切换元素的显示和隐藏(操纵dom元素)-->
<div id="app">
<!--v-on 绑定点击事件 -->
<input type="button" v-on:click="toggleIsShow" value="click_show">
<!-- v-if 和v-show一个操作的样式一个操作dom 有速度快慢上的区别-->
<p v-if="isShow">v-if</p>
</div>
</body>
<!--导入vue.js-->
<script src="http://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm=new Vue({
el:"#app",
data:{
isShow:false
},
methods:{
toggleIsShow:function(){
this.isShow=!this.isShow;
}
}
})
</script>
</html>
.
5.3 v-show
作用与v-if类似。
代码如下(示例):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--v-show根据表达值的真假来切换元素的显示和隐藏-->
<div id="app">
<input type="button" value="切换显示状态" @click="changeIsShow">
<img v-show="isShow" src="show.jpg">
</div>
</body>
<!--导入vue.js-->
<script src="http://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm=new Vue({
el:"#app",
data:{
isShow:false
},
methods:{
changeIsShow:function (){
this.isShow=!this.isShow;
}
}
})
</script>
</html>
.
5.4 v-for
当需要将一个数组遍历或枚举一个对象循环显示时候,可以使用指令v-for结合着in 或者of来使用。
代码如下(示例):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<input type="button" value="add" @click="add">
<input type="button" value="remove" @click="remove">
<ul>
<!-- 利用v-for进行遍历,其中it为组内元素,index为元素索引 遍历对象为data中的arr数组 将会循环生成若干条li标签-->
<li v-for="(it,index) in arr">
<!-- v-for之后 可以直接引用it,index-->
{{index +1}}程序员校区:{{it}}
</li>
</ul>
<h2 v-for="(it,index) in vegetables" :title="it.name">
{{index}}素菜名字:{{it.name}}
</h2>
</div>
</body>
<!--导入vue.js-->
<script src="http://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm=new Vue({
el:"#app",
data:{
arr:["beijing","shanghai","guangzhou"],
vegetables:[
{name:"tomato"},
{name:"banana"}
]
},
methods:{
add:function (){
//这里没有连接数据库。我们模拟添加情况,要添加的时候,就给一个西瓜到数组里面,观察页面变化
this.vegetables.push({name:"suika"});
},
remove:function(){
//删除的时候,直接进行数组元素移除即可
this.vegetables.shift();
}
}
})
</script>
</html>
.
5.5 v-on
v-on是用来绑定事件监听器,用在普通元素上时,只能监听原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件。可以事件和按键进行绑定。
事件修饰符:
<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>
按键修饰符:
<!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -->
<input v-on:keyup.13="submit">
<!-- 记住所有的 keyCode 比较困难,所以 Vue 为最常用的按键提供了别名 -->
<!-- 同上 -->
<input v-on:keyup.enter="submit">
<!-- 缩写语法 -->
<input @keyup.enter="submit">
全部的按键别名:
.enter
.tab
.delete (捕获“删除”和“退格”键)
.esc
.space
.up
.down
.left
.right
代码如下(示例):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 绑定点击事件-->
<!-- <input type="button" value="v-on指令_click" v-on:click="changeFood">-->
<!-- <input type="button" value="monseenter" v-on:monseenter="fun3">-->
<!-- 绑定双击事件-->
<input type="button" value="dblclick" v-on:dblclick="fun1">
<!-- 你也可以将v-on写成@-->
<input type="button" value="v-on简写" @dblclick="fun1">
<h2 @click="changeFood">{{food}}</h2>
</div>
</body>
<!--导入vue.js-->
<script src="http://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm=new Vue({
el:"#app",
data:{
food:"西红柿"
},
methods:{
fun1:function (){
// 弹窗输出
alert("fun1");
},
changeFood:function (){
// 控制台输出
console.log(this.food);
// 点击之后字符串末尾加上‘好好吃’,越点越好吃
this.food+="好好吃";
},
},
})
</script>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--传递自定义参数,事件修饰符-->
<div id="app">
<input value="点我" type="button" @click="doIt(666,'good')">
<!-- 空格事件,点击键盘的空格会触发事件-->
<input type="text" @keyup="sayHi">
</div>
</body>
<!--导入vue.js-->
<script src="http://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm=new Vue({
el:"#app",
data:{
},
methods:{
doIt:function (p1,p2){
console.log("doIt");
// 通过形参来获取传递进来的参数
console.log(p1+p2);
},
sayHi:function (){
alert("Hi");
}
}
})
</script>
</html>
.
5.6 v-model
v-model用于表单数据的双向绑定,其实它就是一个语法糖,这个背后就做了两个操作:
1. v-bind绑定一个value属性
2. v-on指令给当前元素绑定input事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--利用v-model实现双向绑定-->
<!--v-model指令的作用是便捷的设置和获取表单元素的值-->
<!--绑定的数据会和表单元素值相关联-->
<div id="app">
<input type="button" value="修改信息" @click="setM">
<input type="text" v-model="message" @keyup="getM">
<h2>{{message}}</h2>
</div>
</body>
<!--导入vue.js-->
<script src="http://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm=new Vue({
el:"#app",
data:{
message:"vue入门"
},
methods:{
getM:function (){
alert(this.message);
},
setM:function (){
this.message="vue入土";
}
}
})
</script>
</html>
.
5.7 v-text
代码如下(示例):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 设置标签的文本值-->
<h2 v-text="message+'!'"></h2>
<h1 v-text="info"></h1>
<!-- 等价于-->
<h2>深圳{{message+"!"}}</h2>
</div>
</body>
<!--导入vue.js-->
<script src="http://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm=new Vue({
el:"#app",
data:{
message:"aaaaa",
info:"vue"
}
})
</script>
</html>
.
5.8 v-html
在v-html的运行中,它解析了HTML代码。而v-text并没有解析,它将msg原样输出。也就是说,v-htnl会把你接受到的文本内容看作html语句,而v-text是看作普通文本
代码如下(示例):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 会将content解析成html语句-->
<p v-html="content"></p>
<!-- 会以文本形式原封不动的输出出来-->
<p v-text="content"></p>
</div>
</body>
<!--导入vue.js-->
<script src="http://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
var vm=new Vue({
el:"#app",
data:{
selected:'aaaa',
content:"<a href='https://www.baidu.com/'>java是世界上最好的语言,不信baidu</a>"
}
})
</script>
</html>
.