Vue框架
TARGET
- 基本用法
- 模板语法
- 常用特性
- 基于Vue实现案例效果
Vue概述
优势
- 渐进式JavaScrip框架
- 声明式渲染->组件系统->客户端路由->集中式状态管理->项目构建
- 易用、灵活、高效(20KB运行大小,超快虚拟DOM)
Vue基本使用
步骤
- 需要提供标签用于填充数据
- 引入Vue.js库文件
- 可以使用Vue的语法开发功能
- 把vue提供的数据填充到标签里面
实例参数分析
- el: 元素的挂载位置(css选择器或者DOM元素)
- data: 模型数据(值是一个对象)
插值表达式
- 将数据填充到HTML标签中
- 插值表达式支持基本的计算操作
运行原理
- 编译过程(Vue语法->原生语法)
Vue模板语法
前端渲染
- 把数据填充到HTML标签中
渲染方式
- 原生JS拼接字符串
- 使用前端模板引擎 (没有专门提供事件机制)
- 使用vue特有的模板语法
- 插值表达式
- 指令
- 事件绑定(处理)
- 属性绑定
- 样式绑定
- 分支循环结构
指令
什么是指令
- 什么是自定义属性
- 指令的本质就是自定义属性
- 指令的格式: 以v-开始(v-cloak)
v-cloak指令用法
- 插值表达式存在的问题:”闪动”
- 使用v-cloak解决
- 原理:先通过样式隐藏内容,在内存中进行值的替换,替换好值之后再显示最终的值
1. 提供样式 [v-cloak] { display: none; } 2. 在插值表达式所在的标签中添加v-cloak指令
数据绑定指令
- v-text 填充纯文本指令(不存在闪动问题)
- 相比于插值表达式更简洁
- v-html 填充HTML片段
- 存在安全问题(XSS攻击)
- 本网站内部数据可以使用,第三方数据不能用
- v-pre 填充原始数据
- 显示原始信息,跳过编译过程(分析编译过程)
数据响应式
- 如何理解响应式
- HTML5中的响应式(屏幕尺寸的变化导致样式的变化)
- 数据响应式(数据的变化导致页面内容的变化)
- 什么是数据绑定
- 将数据填充到标签中
- v-once只编译一次
- 显示内容之后不再具有响应式功能
- 使用v-once可以提高性能
双向数据绑定
- 什么是双向数据绑定
- 数据与页面内容互相影响
- 双向数据绑定分析
- v-model=’modelName’
- MVVM设计思想(分而治之)
- M(Model)(Plain JavaScript Objects)
- V(view)(DOM)
- VM(View-Model)(DOM Listeners/Data Bindings)
- v<—–>V(DOM Listeners)M(Data Bindings)<—–>M
事件绑定
- Vue如何处理事件
- v-on指令用法:官网链接v-on
<input type="button" v-on:click='num++'/> <input type="button" @click='num++'/>
- v-on指令用法:官网链接v-on
- 事件函数的调用方式
- 直接绑定函数名称
<button @click='handle'>点击handle</button>
- 调用函数
<button @click='handle()'>点击handle()</button>
- 直接绑定函数名称
- 事件函数的参数传递
- 普通参数和事件对象
<button v-on:click='say("hi".$event)'>Say hi</button>
- 如果事件直接绑定函数名称,会默认传递事件对象作为函数的第一个参数
- 若事件绑定函数调用,那么事件对象必须作为最后一个参数显式传递,事件对象的名称必须是$event
- 普通参数和事件对象
- 事件修饰符link
- .stop阻止冒泡
<a v-on:click.stop="handle">跳转</a>
- .prevent阻止默认行为
<a v-on:click.prevent="handle">跳转</a>
- 既阻止冒泡又阻止默认行为
<button @click.stop.prevent='handle0'>阻止冒泡</button>
- 顺序不同,有差异
- .stop阻止冒泡
- 按键修饰符link
- .enter回车键
<input v-on:keyup.enter='submit'>
- .delete删除键
<input v-on:keyup.delete='handle'>
- .enter回车键
- 自定义按键修饰符
//自定义按键修饰符名字是自定义的,但是对应的值必须是按键对应的值 Vue.config.keyCodes.f1 = 112
综合案例计算器
- 通过v-model指令实现数值的绑定
- 给计算按钮绑定计算实践,实现计算逻辑
- 将计算结果绑定到对应位置
属性绑定
Vue如何动态处理属性
v-bind
<a v-bind:href='url'>跳转</a>
缩写
<a :href='url'>跳转</a>
v-model的底层实现原理
//使用输入域中最新的数据覆盖原来的数据
<input v-bind:value='msg' v-on:input='msg=$event.target.value'>
样式绑定
class样式处理
- 对象语法 ```html
+ 数组语法
```html
<div v-bind:class="{activeClass, errorClass}"></div>
- 语法细节
1. 对象绑定,数组绑定可以结合操作 [activeClass, errorClass, {test: isTest}] 2. class绑定的值可以简化操作 v-bind:class='arrClass' v-bind:class='objClass' arrClass: ['active', 'error'] objClass: { active: true, error: true } 3. 默认的class怎么处理 默认class会保留
分支循环结构
分支结构
- v-if
- v-else
- v-else-if
- v-show
- 控制元素样式是否显示 display: none;
v-if/v-show区别
- v-if控制元素是否渲染:改变比较少,DOM元素的增加和删除,性能开销很大。
- v-show控制元素是否显示(已经渲染到页面):频繁显示和隐藏
循环结构
- v-for遍历数组
<li v-for='item in list'></li> <li v-for='(item, index) in list'> + '---' + </li>
- key的作用:帮助Vue区分不同的元素,从而提高性能
<li :key='item.id' v-for='(item,index) in list'> + '----' + </li>
- v-for遍历对象
<div v-for='(value, key, index) in object'></div>
- v-if和v-for结合使用
<div v-if='value==12' v-for='(value, key, index) in object'></div>
Tab选项卡案例
- 实现静态UI效果
- 用传统的方式实现标签结构和样式
- 基于数据重构UI效果
- 将静态的结构和样式重构为基于Vue模板的语法
- 处理事件和js控制逻辑
- 声明式编程
- 模板的结构和最终显示的效果基本一致
常用特性
- 表单操作
- 自定义指令
- 计算属性
- 过滤器
- 侦听器
- 生命周期
表单操作
基于Vue的表单操作
- input
- textarea
- select
- radio
- checkbox
- 案例-vue-form
表单域修饰符
- number:准华为数值
- trim:去掉开始和结尾的空格
- lazy:将input事件切换为change事件(失去焦点的时候触发事件)
<input v-model.number='age' type="number" />
自定义指令
钩子函数
- bind
- 只调用一次,指令第一绑定到元素时调用.可以进行一次性的初始化
- inserted
- 被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)
自定义指令语法规则(获取焦点元素)
Vue.directive('focus' {
inserted: function(el) {
//获取焦点元素
el.focus();
}
})
<input type="text" v-focus>
带参数的自定义指令(改变元素背景色)
Vue.directive('color', {
inserted: function(el, binding) {
el.style.backgroundColor = binding.value.color;
}
})
<input type="text" v-color='{color: "orange"}'>
局部指令(只能运用在本组件中)
directives: {
focus: {
inserted: function(el) {
el.focus();
}
}
}
计算属性
- 计算属性使模板更简洁
计算属性的用法
computed: {
reverseMessage: function() {
return this.msg.split(')reverse().join('');
}
}
计算属性与方法的区别
- 计算属性是基于他们的依赖(data中的数据)进行缓存的
- 方法不存在缓存
侦听器
- 监听数据变化(侦听器绑定方法)
- 数据变化是执行异步或开销较大的操作
侦听器的用法
watch: {
firstName: function(val) {
// val表示变化后的值
this.fullName = val + this.lastName;
}
lastName: function(val) {
this.fullName = this.firstName + val;
}
}
侦听器应用场景
- 验证用户名是否可用
- 输入框中输入姓名
- 失去焦点时验证是否存在
- 若已存在,提示重新输入,若不存在,提示可以使用
- v-model实现数据绑定
- 提供提示信息
- 侦听器坚挺输入信息的变化
- 需要修改触发的事件
过滤器
过滤器作用
- 格式化数据,将字符串格式化为首字母大写,日期格式化为指定的格式
自定义过滤器
Vue.filter('name', fucntion(value) {
//
})
<div></div>
<div></div>
<div v-bind:id="id | formatId"></div>
局部自定义过滤器
filters: {
upper: function(val) {
return val.charAt(0).toUpperCase() + val.slice(1);
}
},
带参数的过滤器
Vue.filter('format', function(value, args) {
//
})
<div></div>
使用过滤器格式化日期
Vue.filter('format', function(value, arg) {
function dateFormat(date, format) {
if(typeof date === 'string') {
var mts = date.match(/(\/Date\((\d+)\)\/)/);
if(mts && mts.length >= 3) {
date = parseInt(mts[2]);
}
}
date = new Date(date);
if(!date || date.toUTCString() == "Invalid Date") {
return "";
}
var map = {
"M": date.getMonth() + 1,
"d": date.getDate(),
"h": date.getHours(),
"m": date.getMinutes(),
"s": date.getSeconds(),
"q": Math.floor((date.getMonth() + 3) / 3),
"S": date.getMilliseconds()
};
format = format.replace(/([yMdhmsqS])+/g, function(all, t) {
var v = map[t];
if(v !==undefined) {
if(all.length > 1) {
v = '0' + v;
v = v.substr(v.length - 2);
}
return v;
} else if(t === 'y') {
return (date.getFullYear() + '').substr(4 - all.length);
}
return all;
});
return format;
}
return dateFormat(value, arg);
});
生命周期(钩子函数)
- 主要阶段
- 挂载(初始化相关属性)
- beforeCreate
- created
- beforeMount
- mounted(el被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子) + 更新(元素或组件的变更操作)
- beforeUpdate
- updated + 销毁(销毁相关属性)
- beforeDestroy
- destroed
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。
如果你觉得本文海星,不妨请我喝杯咖啡
赏