Vue是一个<font color='red'>渐进式框架</font>, 什么是渐进式的呢?css
Vue有不少特色和Web开发中常见的高级功能html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--一、导入Vue的包--> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script> </head> <body> <!--这个div区域就是MVVM中的 View--> <div id="app"> {{message}} </div> </body> <script> // 二、建立一个Vue的实例 var app = new Vue({ el: '#app', //用于挂载要管理的元素 data: {// 定义数据 message: '学习Vue.js' } }); </script> </html>
View层前端
Model层vue
VueModel层算法
属性名 | 类型 | 做用 | |
---|---|---|---|
el |
<font color='blue'>类型: string \ | HTMLElement</font> | 决定Vue实例会管理哪个DOM |
data |
<font color='blue'>类型: Object \ | Function (组件当中data必须是一个函数)</font> | Vue实例对应的数据对象 |
methods |
<font color='blue'>类型: { [key: string]: Function }</font> | 定义属于Vue的一些方法, 能够再其余地方调用, 也能够在指令中使用 |
数据绑定最多见的形式就是使用 “Mustache” 语法(双大括号)的文本插值。例如:npm
<span>Message: {{ msg }}</span>Mustache 标签将会被替代为对应数据对象上 msg 属性(msg定义在data对象中)的值。 数组
不管什么时候,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会自动更新。浏览器
语法 | {{}} JavaScript 表达式支持 |
---|---|
普通表达式 | {{ number + 1 }} |
三元表达式 | {{ ok ? 'YES' : 'NO' }} |
三元表达式 | {{ name == 'smyhvae' ? 'true' : 'false' }} |
调用方法 | {{ message.split('').reverse().join('') }} |
该指令后面不须要跟任何表达
该指令表示元素<font color='red'>只渲染一次</font>,不会随着数据的改变而改变。
<h2 v-once>{{message}}</h2>
解析<font color='red'>数据中的html</font>代码,渲染到页面中
<h2 v-html="url"></h2>
v-text做用和Mustache比较类似:都是用于将<font color='red'>数据显示在界面</font>中, 不一样的是 v-text 是写在属性中
v-text一般状况下,接收一个string类型
<h2 v-text="text"></h2>
v-pre用于跳过这个元素和它子元素的编译过程,用于<font color='red'>显示本来的Mustache</font>语法。
<h2 v-pre>{{message}}</h2>
在某些状况下,咱们浏览器可能会直接显然出未编译的Mustache标签。
v-cloak指令和CSS 规则一块儿用的时候,可以解决插值表达式闪烁的问题(即:能够隐藏未编译的标签直到实例准备完毕)
<!-- 在vue解析以前, div中有一个属性v-cloak 在vue解析以后, div中没有一个属性v-cloak --> <div id="app" v-cloak> <h2>{{message}}</h2> </div>
做用:能够给html元素或者组件动态地绑定一个或多个特性,例如动态绑定style
和class
缓存
这个时候,咱们可使用v-bind指令:服务器
:
绑定class有两种方式
- 对象语法
- 数组语法
对象语法
:class
后面跟的是一个<font color='red'>对象</font>。<!-- 用法一:直接经过{}绑定一个类 --> <h2 :class="{'active': isActive}">Hello World</h2> <!-- 用法二:也能够经过判断,传入多个值 --> <h2 :class="{'active': isActive, 'line': isLine}">Hello World</h2> <!-- 用法三:和普通的类同时存在,并不冲突 --> <!--注:若是isActive和isLine都为true,那么会有title/active/line三个类--> <h2 class="title" :class="{'active': isActive, 'line': isLine}">Hello World</h2> <!-- 用法四:若是过于复杂,能够放在一个methods或者computed中 --> <!--注:classes是一个计算属性 --> <h2 class="title" :class="classes">Hello World</h2>
数组语法
:class
后面跟的是一个<font color='red'>数组</font>。<!-- 1. ['active','news'] 当字符串使用 --> <h2 class="title" :class="['active','news']">{{message}}</h2> <!-- [active, new] 当变量使用 --> <h2 class="title" :class="[active,news]">{{message}}</h2> <!-- 3. 函数返回值使用 --> <h2 class="title" :class="getClasses()">{{message}}</h2>
绑定class有两种方式
对象语法
style
后面跟的是一个对象类型key
是css属性名value
是具体赋的值, 能够来自data
中的属性:style="{color: currentColor, fontSize: fontSize + 'px'}"
数组语法
style
后面跟的是一个数组类型, 多个值以 , 分隔<div v-bind:style="[baseStyles, fontColor]"></div> /* js */ baseStyle: {background: 'lime'}, fontSize: {fontSize: '80px'}
在某些状况,咱们可能须要对数据进行一些转化后再显示,或者须要将多个数据结合起来进行显示
firstName
和lastName
两个变量,咱们须要显示完整的名称。{{firstName}} {{lastName}}
将上面代码转换成计算属性
/* html */ <h2>{{fullNmae}}</h2> /* js */ computed: { fullNmae: function () { return this.firstNmae + ' ' + this.lastNmae; } }
每一个计算属性都包含一个getter
和一个setter
getter
来读取。methods和computed区别
methods
里面的数据无论发没发生变化, 只要调用了都会执行函数(有的时候数据没发生变化咱们不但愿调用函数)computed
计算属性会进行缓存, 若是数据没发生变化,函数只会被调用一次(数据发生变化才会调用函数)总结:
methods
无论数据发没发生变化都会调用函数computed
只有在依赖数据发生变化时才回调函数在前端开发中,咱们须要常常和用户交互
v-on 介绍
@
methods
中定义方法, 以供@click
调用时, 须要注意参数问题状况一: 若是该方法不须要额外参数, 方法后()
能够省略
event
参数传递进去event
时, 能够经过$event
传入事件v-on
提供了不少事件修饰符来辅助实现一些功能。事件修饰符有以下修饰符 | 做用 | |
---|---|---|
.stop | 阻止冒泡。本质是调用 event.stopPropagation() | |
.prevent | 阻止默认事件行为 本质是调用 event.preventDefault() | |
.{keyCode \ | keyAlias } | 当事件是从特定键触发时才触发回调 |
.once | 事件只触发一次 |
<h2 v-if="score>=90">优秀</h2> <h2 v-else-if="score>=80">良好</h2> <h2 v-else-if="score>=60">及格</h2> <h2 v-else>不及格</h2>
v-if-else-if
一个问题: 涉及到了Vue底层, 虚拟DOM virtual DOM
点击切换表单后,input的value值并无被清空,为何?
input
表单时, 咱们输入上的value
, 点击按钮切换表单时会发现value
值还存在, 可是input
元素确实切换了, 这是由于什么呢?<span v-if="isUser"> <label for="user">用户名</label> <input type="text" placeholder="用户名" id="user" key="user"> </span> <span v-else> <label for="email">邮箱</label> <input type="text" placeholder="邮箱" id="email" key="email"> </span> <button @click="isUser=!isUser">切换类型</button> <script> const app = new Vue({ el: '#app', data: { isUser: true } }) </script>
缘由:
解决方案
Vue
出现相似重复利用的问题, 能够给对应的 input
添加 key
key
不一样, 这样 vue
就会建立一个全新 input
元素v-show的用法和v-if很是类似,也用于决定一个元素是否渲染
v-if 和 v-show对比
开发中如何选择呢?
<h2 v-show="isShow">{{message}}</h2>
v-for="(item, index) in items"
<ul> <!-- item: 是每一项元素 index: 下标/索引 --> <li v-for="(item, index) in name"> {{index+1}}.{{item}} </li> </ul>
v-for="(value, key, index) in items"
<ul> <!-- value:属性值 key:属性名 index:下标/索引 --> <li v-for="(value, key, index) in info"> {{index+1}}.{{value}} </li> </ul>
v-for
时,给对应的元素或组件添加上一个:key
属性。为何须要这个key属性呢(了解) ?
Diff
算法有关系。当某一层有不少相同的节点时,也就是列表节点时,咱们但愿插入一个新的节点
因此咱们须要使用key来给每一个节点作一个惟一标识
使用v-for
更新已渲染的元素列表时,默认用<font color='red'>就地复用</font>策略; 若是列表数据修改的时候, 它会根据key值去判断某个值是否修改, 若是修改, 则从新渲染这一项, 不然复用以前的元素; 咱们在使用的使用常常会使用index
(即数组的下标)来做为key
,但其实这是不推荐的一种使用方法;
Vue中包含了一组观察数组编译的方法, 使它们改变数组也会触发更新视图
Vue.set(vm.items, indexOftem, newValue)
vm.$set(vm.items ,indexOften,newValue)
当它们处于同一节点,v-for
的优先级比v-if
更高,这意味着
v-if
将分别重复运行于每一个v-for
循环中。避免
v-if
和v-for
用在一块儿
缘由
使用计算属性的好处
Vue中使用v-model指令
来实现表单元素和<font color='red'>数据的双向绑定</font>
引出:
v-model
这个属性。区别:
v-bind
: 只能实现数据的单向绑定, 从M自动绑定到v。v-model
: 只有v-model
才能实现双向数据绑定。注意, v-model后
面不须要跟冒号注意
v-model
只能运用在表单元素中, 或者用于自定义组件。常见的表单元素包括: input(radio,text,address,email...) ,select, checkbox, textarea.
v-model实际上是一个语法糖, 他背后本质是包含两个操做
<input type="text" v-model="message"> <!-- 等同于下面的代码 --> <input type="text" :value="message" @input="message = $event.target.value">
v-model
指令来实现表单元素和数据的双向绑定案例解析:
v-model
表单类型 | 单选/多选状况 | 绑定的值 |
---|---|---|
v-model: radio |
多个单选框时 | 绑定的值是value |
v-model: checkbox |
单个勾选框 | v-model即为布尔值 |
多个复选框 | 选中多个, 对应的data 属性是一个数组 |
|
v-model: select |
单选 | v-model 绑定的是一个值 |
多选 | v-model 绑定的是一个数组 |
动态的给value
赋值而已
value
中的值, 都是在定义input中直接给定的v-bind:value
动态的给value绑定值修饰符 | 做用 |
---|---|
.lazy |
当表单失去焦点 或按下回车 时,data 中的数据才会更新 |
.number |
输入的内容转换为number 数据类型 |
.trim |
过滤内容的两侧空格 |
为什么须要自定义指令
- 内置指令不知足需求
Vue.directive('focus', { inserted: function (el) { el.focus()// 获取元素的焦点 } }) // 使用自定义指令 <input type="text" v-focus>
Vue.directive('color', { // bind声明周期, 只调用一次,指令第一次绑定到元素时调用。在这里能够进行一次性的初始化设置 // el 为当前自定义指令的DOM元素 // binding 为自定义的函数形参 经过自定义属性传递过来的值 存在 binding.value 里面 bind: function(el, binding){ // 根据指令的参数设置背景色 // console.log(binding.value.color) el.style.backgroundColor = binding.value.color; } }); // 使用带参数自定义指令 <input type="text" v-color='msg'>
directives
的选项 用法和全局用法同样directives: { focus: { inserted: function(el) { el.focus(); } } }
侦听器的应用场景
- 数据变化时执行
异步
或开销较大的操做
- 注意: watch 中的属性 必定是data 中 已经存在的数据
// 当data中的: firstName属性或lastNames属性改变时, 会自动触发对应的watch watch: { firstName(val) { // val: 表示变化后的值 this.fullName = val + ' ' + this.lastName; }, lastName(val) { this.fullName = this.firstName + ' ' + val; } }
- 概念: Vue.js容许咱们自定义过滤器,可被用做一些常见的
文本格式化/处理
。- 过滤器能够用在两个地方: mustache插值表达式、v-bind表达式。
- 过滤器应该被添加在JavaScript表达式的尾部,由“管道”符指示。
- 过滤器不改变真正的
data
,而只是改变渲染的结果,并返回过滤后的版本
- 全局注册时是filter,没有s的。而局部过滤器是filters,是有s的
- 支持级联操做(对前一个过滤的数据再次进行过滤处理)
Vue.filter()
自定义一个全局过滤器。这样的话,每个Vue的对象实例(每个VM实例
)均可以拿到这个过滤器。它接收两个参数
: 过滤器的名称
、过滤器函数
。<div>{{msg | upper}}</div> <div>{{msg | upper | lower}}</div> <div :class="msg | upper"></div> <!-- 带参数过滤 --> <div>{{date | format('yyyy-MM-dd')}}</div> <script> // 1.全局过滤器 Vue.filter('upper', (val) => { // val就是要处理的数据 return val.charAt(0).toUpperCase() + val.slice(1); }) // 2.处理带参数过滤器 Vue.filter('format', (date, arg) => { // arg: 传递的参数 if (arg === 'yyyy-MM-dd') { return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate(); } }) </script>
当前vue对象
的el指定的监管区域
有用。<!-- 管道符前面的price: 要把price这段文本进行过滤 --> <!-- 管道符后面的showPrice: 是经过showPrice这个过滤器来进行操做 --> <td>{{price | showPrice}}</td> <script> const app = new Vue({ filters: { showPrice(price) { return '¥' + price.toFixed(2); } } }) </script>
挂载(初始化相关属性)
更新(元素或组建的变动操做)
销毁(销毁相关属性)
钩子函数 | 过程 |
---|---|
beforeCreate | 在实例初始化以后, 数据观测和事件配置以前被调用此时data和methods以及页面的DOM结构都没有初始化什么都作不了 |
created | 在实例建立完成后被当即调用此时data 和 methods已经可使用可是页面尚未渲染出来 |
beforeMount | 在挂载开始以前被调用此时页面上还看不到真实数据只是一个模板页面而已 |
mouted | el被新建立的vm.$el替换, 并挂载到实例上去以后调用该钩子。数据已经真实渲染到页面上在这个钩子函数里面咱们可使用一些第三方的插件 |
beforeUpdate | 数据更新时调用,发生在虚拟DOM打补丁以前。 页面上数据仍是旧的 |
update | 因为数据更改致使的虚拟DOM从新渲染和打补丁, 在这以后会调用该钩子。页面上数据已经替换成最新的 |
beforeDestroy | 实例销毁以前调用 |
destroyed | 实例销毁后调用 |