什么是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
<!--1.下载导入Vue.js -->
<script src="js/vue.js"></script>
2.创建Vue的实例对象,并指定Vue实例对象的控制区域
<body>
<!--3.指定Vue实例对象的控制区域-->
<div id="app">
<p>{{name}}</p>
</div>
<script>
//2.创建Vue的实例对象
let vue = new Vue({
//4.告诉Vue的实例对象,将来需要控制界面的上的哪个区域
el:"#app",
//5.告诉Vue的实例对象,被控制区域的数据是什么
data:{
name:"哑戏"
}
});
</script>
</body>
备注:"{{}}"是art-template 模板引擎 的标准语法:
<h2>{{user.name}}</h2>
定义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 指令在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。[注意点:v-model 会忽略所有表单元素的 value、checked、selected attribute 的初始值而总是将 Vue 实例的数据作为数据来源。但应该通过 JavaScript 在组件的 data 选项中声明初始值。]
<div id="app">
<input type="text" v-model="message" placeholder="edit me">
<textarea name="textarea" id="textarea" cols="30" rows="10" v-model="information" placeholder="edit me"></textarea>
<select name="select" id="select" v-model="news" placeholder="edit me">
<option value="1">option 1</option>
<option value="2">option 2</option>
<option value="3">option 3</option>
<option value="4">option 4</option>
</select>
</div>
<script>
let vue = new Vue({
el:"#app",
data:{
message:"" ,
information:"",
news:""
}
});
</script>
如图所示:
Vue中常用指令
v-mode: 在表单控件或者组件上创建双向绑定。仅限于<input>,<select>, <textarea>。
v-once: 只渲染元素和组件一次
<div id="app"> <p v-once>原始数据:{{name}}</p> <p>当前数据:{{name}}</p> </div> <script> let vue = new Vue({ el:"#app", data:{ name:"哑戏" } }); </script>
v-cloak:这个指令保持在元素上,会将该元素直接隐藏,直到关联实例准备结束后编译data中绑定的数据。 配合 CSS 规则: [v-cloak] { display: none } 一起使用。
v-text: 会覆盖掉原来的内容,但不会解析HTML。类似于:innerText
显示结果:<span v-text="msg">message</span> data:{ message:"<span>我是span</span>" }
- v-html:会覆盖掉原来的内容,也会解析HTML。类似于:innerHTML
显示结果:<span v-html="msg">message</span> data:{ message:"<span>我是span</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会创建或删除元素,频繁创建删除会导致性能不好<!--第一种从data中获取赋值--> <p v-if="show">我是true</p> <p v-if="conceal">我是false</p> <!--第二种直接赋值--> <p v-if="true">我是true</p> <p v-if="false">我是false</p> <!--第三种从data中满足条件的赋值--> <p v-if="age >= 18">我是true</p> <p v-if="age < 18">我是false</p> <!--第四种v-if和v-else表达式--> <p v-if="age >= 18">我是成年人</p> <p v-else>我是未成年人</p> <!--v-if,v-else-if和v-else表达式--> <p v-if="score >= 90">优秀</p> <p v-else-if="score >= 60">良好</p> <p v-else>差</p> data:{ show:true, conceal:false, age:17, score:100 }
- v-show: 和v-if指令相似,但v-show只创建一次元素,之后切换显示隐藏由display:none;来控制,避免了v-if由于频繁创建删除而导致的性能不好的问题。
<!--第一种从data中获取赋值--> <p v-show="show">我是true</p> <p v-show="conceal">我是false</p> <!--第二种直接赋值--> <p v-show="true">我是true</p> <p v-show="false">我是false</p> <!--第三种从data中满足条件的赋值--> <p v-show="age >= 18">我是true</p> <p v-show="age < 18">我是false</p> data:{ show:true, conceal:false, age:17, }
- v-for: 列表渲染,可以根据数据多次渲染元素,可以遍历数组,字符串,数字,对象。
结果:<ul> <li v-for="(value,index) in list">{{index}}---{{value}}</li> <li v-for="(value,index) in 'abcdefg'">{{index}}---{{value}}</li> <li v-for="(value,index) in 6">{{index}}---{{value}}</li> <li v-for="(value,index) in obj" >{{index}}---{{value}}</li> </ul> data:{ list:["张三","李四","王五","赵六"] , obj:{ name:"ansi", age:20, gender:"female", class:"Law" } }
注意点一:当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。
这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。
为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key attribute:
<div v-for="item in items" v-bind:key="item.id">
<!-- 内容 -->
</div>
建议尽可能在使用 v-for 时提供 key attribute,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。
注意点二:永远不要把 v-if 和 v-for 同时用在同一个元素上
- v-bind: 常用于给元素绑定动态地绑定一个或多个attribute,缩写【 :】;
<input type="text" v-bind:value="name"> <input type="text" :value="name"> <input type="text" :value="age + 1"> data:{ name:"ansi", age:20 }
注意点:v-bind指令在绑定 class 或 style attribute 时,支持其它类型的值,如数组或对象。
<style> .size{ font-size: 100px; } .color{ color: red; } .active{ background: skyblue; } </style> <!--利用v-bind给元素绑定类名的方法--> <p :class="['size','color','active']">我是段落</p> <!--利用v-bind给元素绑定类名,可以编写三目运算符来实现按需绑定--> <p :class="['size','color',flag ? 'active' : '']">我是段落</p> <!--利用v-bind给元素绑定类名,可以通过对象来决定是否需要绑定--> <p :class="['size','color',{'active' : true}]">我是段落</p> <!--利用v-bind给元素绑定类名,可以通过Model中的对象来代替数组--> <p :class="obj">我是段落</p> data:{ flag:false , obj:{ "size":true, "color":true, "active":true } }
<!--利用v-bind给元素绑定样式,如果样式中带-也必须用''包裹--> <p :style="{color:'red','font-size':'100px'}">我是段落</p> <!--利用v-bind给元素绑定样式,可以通过Model中的对象绑定样式--> <p :style="obj">我是段落</p> <!--利用v-bind给元素绑定样式,如果要绑定Model中的多个对象,可以通过[]包裹--> <p :style="[obj1,obj2]">我是段落</p> data:{ obj1:{ "color":"blue", "font-size":"100px" }, obj2:{ "background":"red" } }
归纳:给元素绑定数据的三种方式{{}},v-text ,v-html; 另外v-model只给<input>,<textarea>,<select>这三个标签动态的绑定 attribute;
<p>{{name}}</p> <p v-text="name"></p> <p v-html="name"></p> <input type="text" 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 } 模式添加侦听器<button v-on:click="myFn">我是按钮</button> <!--v-on指令的简写--> <button @click="myFn">我是按钮</button> let vue = new Vue({ el:"#app", data:{}, methods:{ myFn(){ alert('ansi') } } });
注意点:v-on指令监听的回调函数的名称后面可以加()也可以不加;添加()后,可以给回调函数传递原生的事件对象$event作为参数;如果想在监听是回调函数中使用data中的数据,必须在前面加上this;
自定义指令
1.自定义全局指令:在任何一个Vue控制的区域都能使用
<div id="app">
<input type="text" v-focus>
</div>
// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
// 当被绑定的元素插入到 DOM 中时,,该元素已经被渲染出来,在调用 inserted可以实现聚焦
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
结果:
钩子函数:指令会在不同的生命周期阶段执行
- bind:只调用一次,指令第一次绑定到元素时调用 (此时该元素还没有被渲染到界面上)
- inserted:被绑定元素插入父节点时调用 (此时该元素已经被渲染到界面上)
钩子函数的参数:
- el :表示指令所绑定的元素,可以用来直接操作 DOM。
- binding:一个对象,包含以下 property:
name:指令名,不包括 v- 前缀。
value:指令的绑定值
<div id="app">
<p v-color="'blue'">我是段落</p>
<p v-color="curColor">我是段落</p>
</div>
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实例中使用
<div id="app1">
<p v-color="'blue'">我是段落</p>
</div>
<div id="app2">
<p v-color="'red'">我是段落</p>
</div>
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;
}
}
}
});
结果: