什么是Vue? 框架和库的区别是什么?
Vue是一套构建用户界面的“框架”,框架对于项目的入侵性都比较大,如果想要更换一个项目里的框架,就需要重构这个项目。
库(插件)提供一个小的功能,对项目的入侵性小,比如:jQuery,Swiper,Zepto,Bootstrap,Iscroll,Animate.css,wow.js,fullpage(zepto是针对移动的js库,侧重于js方面,bootstrap对响应式开发做了相应的处理,这处理过的界面可以在移动端大放光彩bootstrap侧重于html,css方面,然后bootstrap依赖jq有相应的插件支持),如果某个库没完成需求,可以很容易切换到其他的库。
Vue的优势(又称为两大核心概念)?
核心概念一:通过数据驱动界面更新,无需操作DOM来更新界面。使用Vue只需要关心如何获取数据,如何处理数据,如何编写逻辑代码即可,然后只需要将处理好的数据交给Vue,Vue就能自动将处理好的数据渲染在界面上。
核心概念二:组件化开发,可以将一个完整的网页拆分成一个个独立的组件编写,然后将封装好的组件拼接成一个完整的网页。
Vue的基本使用:
1.利用传统下载并导入使用Vue.js
2.创建Vue的实例对象,并指定Vue实例对象的控制区域
{{name}}
备注:"{{}}"是art-template 模板引擎 的标准语法:
{{user.name}}
定义WebStorm模板:
1.将需要定义为模板的代码复制->>按下Ctrl+Alt+S打开设置->>搜索live->>找到 Live Templates中的HTML\XML 并点击右上角加号,选中Live Templates,在输入框内粘贴已经复制好的模板代码
2.模板代码复制完成后,在Abbreviation中填入快捷键->>点击Change选中HTML->>最后点击OK,完成自定义WebStorm模板
Vue中数据的双向传递
默认情况下,Vue只会单向传递数据M-VM-V(从实例对象的data->>经Vue实例对象->>到被控制区域div)。但由于Vue基于MVM设计模式,所以也就提供法律双向传递的能力。
可以用 v-model 指令在表单 、
如图所示:
Vue中常用指令
v-mode: 在表单控件或者组件上创建双向绑定。仅限于,
v-once: 只渲染元素和组件一次
原始数据:{{name}}
当前数据:{{name}}
v-cloak:这个指令保持在元素上,会将该元素直接隐藏,直到关联实例准备结束后编译data中绑定的数据。 配合 CSS 规则: [v-cloak] { display: none } 一起使用。
v-text: 会覆盖掉原来的内容,但不会解析HTML。类似于:innerText
显示结果:message data:{ message:"我是span" }
- v-html:会覆盖掉原来的内容,也会解析HTML。类似于:innerHTML
显示结果:message data:{ message:"我是span" }
- v-if: 条件渲染,如果v-if的取值是true就渲染,如果不是就不会创建该元素。v-if接受直接赋值true/false,或间接赋值(通过data传递要绑定的值),另一种间接赋值是v-if接受赋的值可以是表达式。另外,v-if和v-else是可以搭配使用的。
注意点一:v-fi和v-else搭配使用时,中间不能出现其他内容。v-else不能单独使用。
注意点二:用指令v-if切换true/false会创建或删除元素,频繁创建删除会导致性能不好
我是true
我是false
我是true
我是false
我是true
我是false
我是成年人
我是未成年人
优秀
良好
差
data:{ show:true, conceal:false, age:17, score:100 }
- v-show: 和v-if指令相似,但v-show只创建一次元素,之后切换显示隐藏由display:none;来控制,避免了v-if由于频繁创建删除而导致的性能不好的问题。
我是true
我是false
我是true
我是false
我是true
我是false
data:{ show:true, conceal:false, age:17, }
- v-for: 列表渲染,可以根据数据多次渲染元素,可以遍历数组,字符串,数字,对象。
结果:
data:{ list:["张三","李四","王五","赵六"] , obj:{ name:"ansi", age:20, gender:"female", class:"Law" } }
- {{index}}---{{value}}
- {{index}}---{{value}}
- {{index}}---{{value}}
- {{index}}---{{value}}
注意点一:当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。
这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。
为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key attribute:
建议尽可能在使用 v-for 时提供 key attribute,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。
注意点二:永远不要把 v-if 和 v-for 同时用在同一个元素上
- v-bind: 常用于给元素绑定动态地绑定一个或多个attribute,缩写【 :】;
data:{ name:"ansi", age:20 }
注意点:v-bind指令在绑定 class 或 style attribute 时,支持其它类型的值,如数组或对象。
我是段落
我是段落
我是段落
我是段落
data:{ flag:false , obj:{ "size":true, "color":true, "active":true } }
我是段落
我是段落
我是段落
data:{ obj1:{ "color":"blue", "font-size":"100px" }, obj2:{ "background":"red" } }归纳:给元素绑定数据的三种方式{{}},v-text ,v-html; 另外v-model只给,
{{name}}
- v-on: 专门用于给元素绑定监听事件,缩写:@;
参数:event;
修饰符:
.stop - 调用 event.stopPropagation(),阻止事件冒泡行为。
.prevent - 调用 event.preventDefault(),通知 Web 浏览器不要执行与事件关联的默认动作。
.capture - 添加事件侦听器时使用 capture 模式。
.self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
.{keyCode | keyAlias}- 只当事件是从特定键触发时才触发回调。
.native - 监听组件根元素的原生事件。
.once - 只触发一次回调。
.left - (2.2.0) 只当点击鼠标左键时触发。
.right - (2.2.0) 只当点击鼠标右键时触发。
.middle - (2.2.0) 只当点击鼠标中键时触发。
.passive - (2.3.0) 以 { passive: true } 模式添加侦听器let vue = new Vue({ el:"#app", data:{}, methods:{ myFn(){ alert('ansi') } } });
注意点:v-on指令监听的回调函数的名称后面可以加()也可以不加;添加()后,可以给回调函数传递原生的事件对象$event作为参数;如果想在监听是回调函数中使用data中的数据,必须在前面加上this;
自定义指令
1.自定义全局指令:在任何一个Vue控制的区域都能使用
// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
// 当被绑定的元素插入到 DOM 中时,,该元素已经被渲染出来,在调用 inserted可以实现聚焦
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
结果:
钩子函数:指令会在不同的生命周期阶段执行
- bind:只调用一次,指令第一次绑定到元素时调用 (此时该元素还没有被渲染到界面上)
- inserted:被绑定元素插入父节点时调用 (此时该元素已经被渲染到界面上)
钩子函数的参数:
- el :表示指令所绑定的元素,可以用来直接操作 DOM。
- binding:一个对象,包含以下 property:
name:指令名,不包括 v- 前缀。
value:指令的绑定值
我是段落
我是段落
Vue.directive('color', {
//指令第一次绑定到元素时调用,此时该元素还没有被渲染出来
bind:function (el,binding) { //el就是被绑定指令的那个元素,binding对象用于保存传递的参数
el.style.color = binding.value;
}
});
let vue = new Vue({
el:"#app",
data:{
curColor:"green"
},
methods:{
}
});
结果:
2.自定义局部指令:只能在自定义的那个Vue实例中使用
我是段落
我是段落
let vue1 = new Vue({
el:"#app1",
data:{},[图片上传中...(D(Z0PDWPW73{TE(5_NJ7NNW.png-bbfbcd-1594645667487-0)]
methods:{}
});
let vue2 = new Vue({
el:"#app2",
data:{},
methods:{},
//注册一个局部自定义指令
directives:{
"color":{
//指令第一次绑定到元素时调用,此时该元素还没有被渲染出来
bind:function (el,binding) { //el就是被绑定指令的那个元素,binding对象用于保存传递的参数
el.style.color = binding.value;
}
}
}
});
结果: