<!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> 复制代码
属性名 | 类型 | 做用 |
---|---|---|
el |
类型: string | HTMLElement | 决定Vue实例会管理哪个DOM |
data |
类型: Object | Function (组件当中data必须是一个函数) | Vue实例对应的数据对象 |
methods |
类型: { [key: string]: Function } | 定义属于Vue的一些方法, 能够再其余地方调用, 也能够在指令中使用 |
数据绑定最多见的形式就是使用 “Mustache” 语法(双大括号)的文本插值。例如:javascript
<span>Message: {{ msg }}</span> 复制代码
Mustache 标签将会被替代为对应数据对象上 msg 属性(msg定义在data对象中)的值。css
不管什么时候,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会自动更新。html
语法 | {{}} JavaScript 表达式支持 |
---|---|
普通表达式 | {{ number + 1 }} |
三元表达式 | {{ ok ? 'YES' : 'NO' }} |
三元表达式 | {{ name == 'smyhvae' ? 'true' : 'false' }} |
调用方法 | {{ message.split('').reverse().join('') }} |
该指令后面不须要跟任何表达 该指令表示元素只渲染一次,不会随着数据的改变而改变。前端
<h2 v-once>{{message}}</h2>
复制代码
解析数据中的html代码,渲染到页面中vue
<h2 v-html="url"></h2>
复制代码
v-text做用和Mustache比较类似:都是用于将数据显示在界面中, 不一样的是 v-text 是写在属性中 v-text一般状况下,接收一个string类型java
<h2 v-text="text"></h2>
复制代码
v-pre用于跳过这个元素和它子元素的编译过程,用于显示本来的Mustache语法。web
<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> 复制代码
style
和
class
:
绑定class有两种方式npm
对象语法 数组语法
:class
后面跟的是一个
对象。
<!-- 用法一:直接经过{}绑定一个类 -->
<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
后面跟的是一个
数组。
<!-- 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> 复制代码
咱们能够利用v-bind:style来绑定一些CSS内联样式数组
绑定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
中定义方法, 以供
@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很是类似,也用于决定一个元素是否渲染
<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
属性。
Diff
算法有关系。
使用
v-for
更新已渲染的元素列表时,默认用就地复用策略; 若是列表数据修改的时候, 它会根据key值去判断某个值是否修改, 若是修改, 则从新渲染这一项, 不然复用以前的元素; 咱们在使用的使用常常会使用index
(即数组的下标)来做为key
,但其实这是不推荐的一种使用方法;
Vue.set(vm.items, indexOftem, newValue)
vm.$set(vm.items ,indexOften,newValue)
当它们处于同一节点,
v-for
的优先级比v-if
更高,这意味着
v-if
将分别重复运行于每一个v-for
循环中。避免
v-if
和v-for
用在一块儿
v-model指令
来实现表单元素和
数据的双向绑定
v-model
这个属性。
v-bind
: 只能实现数据的单向绑定, 从M自动绑定到v。
v-model
: 只有
v-model
才能实现双向数据绑定。注意,
v-model后
面不须要跟冒号
v-model
只能运用在表单元素中, 或者用于自定义组件。常见的表单元素包括:
input(radio,text,address,email...) ,select, checkbox, textarea.
<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(); } } } 复制代码
侦听器的应用场景
数据变化时执行 异步
或开销较大的操做
![]()
image-20200511180435528
注意: 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
,而只是改变渲染的结果,并返回过滤后的版本![]()
image-20200511204822969
全局注册时是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> 复制代码
事物从出生到死亡的过程
Vue实例从建立到销毁的过程,这些过程当中会伴随着一些函数的自调用。咱们称这些函数为钩子函数
主要阶段
挂载(初始化相关属性)
更新(元素或组建的变动操做)
销毁(销毁相关属性)
钩子函数 | 过程 |
---|---|
beforeCreate | 在实例初始化以后, 数据观测和事件配置以前被调用此时data和methods以及页面的DOM结构都没有初始化什么都作不了 |
created | 在实例建立完成后被当即调用此时data 和 methods已经可使用可是页面尚未渲染出来 |
beforeMount | 在挂载开始以前被调用此时页面上还看不到真实数据只是一个模板页面而已 |
mouted | el被新建立的vm.$el替换, 并挂载到实例上去以后调用该钩子。数据已经真实渲染到页面上在这个钩子函数里面咱们可使用一些第三方的插件 |
beforeUpdate | 数据更新时调用,发生在虚拟DOM打补丁以前。 页面上数据仍是旧的 |
update | 因为数据更改致使的虚拟DOM从新渲染和打补丁, 在这以后会调用该钩子。页面上数据已经替换成最新的 |
beforeDestroy | 实例销毁以前调用 |
destroyed | 实例销毁后调用 |