Vue学习笔记
目录
第一章 开始
1.1、Vue是什么?
一套用于构建用户界面的渐进式JavaScript框架。
创始人:尤雨溪
1.2、Vue的特点
采用组件化的模式,提高代码复用率、且让代码更好维护。
声明式编码,让编码人员无需直接操作DOM,提高开发效率。
第二章 下载安装
2.1、下载Vue环境
vue官网:https://v2.cn.vuejs.org/
下载地址:https://v2.cn.vuejs.org/v2/guide/installation.html
开发版本:包含了完整的警告和调试(学习版)
生产版本:删除了警告
2.2、下载浏览器开发者工具
https://github.com/vuejs/devtools#vue-devtools
2.3、引入
注意:只要是用到vue,都必须导入!!!
<script src="url"></script> //url就是vue的路径
2.4、关闭浏览器开发者提示:
当你使用开发版本而不是生产版本时,这个时候写vue代码,浏览器控制台(console)会提示警告信息。意思为“您正在开发模式下运行Vue。在进行生产部署时,请确保打开生产模式。更多建议请访问…”,这里可以直接修改Vue.config对象下的productionTip,默认开启true,false表示关闭生产提示。Vue.config 获取Vue的全局配置对象,可以在启动应用之前修改。
<script>
Vue.config.productionTip = false;
</script>
导入vue 和 修改vue配置,并没有使用vue,只是处于待命状态。
第三章 创建第一个Vue对象
3.1、创建vue实例:
3.1.1、模板语法
new Vue({ //只传一个对象参数【实例对象可以不用】
el:'#root', //el用于指定当前vue为哪一个元素使用,通常值为css选择器字符串。
data: { //data中的数据,只提供el中的选择器使用。值暂时可以写成对象
键: '值',
}
});
3.1.2、el的第二种写法:
构建出Vue实例,使用:实例.$mount(‘#root’);
let vm = new Vue({
data: {
键: '值',
}
});
vm.$mount('#root');
3.1.3、data的第二种写法:
data(){
return{
键: '值',
}
}
3.2、root容器里的代码被称为【Vue模板】
1、容器和vue实例一一对应。
2、真实开发中只有一个vue实例,并且会配合着组件一起使用。
3、如果data 中的数据发生改变,那么页面中到该函数的地方也会自动更新。
3.3、添加到HTML语法规范
3.3.1、插值法:
插值语法用于解析标签体内容
<div id="root">
<p>Hello JavaScript!我爱学</p> //正常写法
<p>Hello {{name}}!{{love}}</p> //插入vue数据的写法1
</div>
<script>
Vue.config.productionTip = false; //取消浏览器提示
new Vue({ //Vue对象
el: '#root',
data: {
name: 'JavaScript', //对应第二个p标签里的数据
lave: '我爱学'
}
});
</script>
{{ 键 }} 花括号内只要是一个JS表达式就可以。例如:{{1+2+3}}或{{name}}
3.3.2、指令语法:
指令语法用于解析标签(属性、内容、绑定事件等...)
v-bind:属性=“值”,v-bind可以简写成:
v-bind:属性 = “值” 等价于 :属性= “值”
多级数据可以使用 键.键 的形式逐层访问
<div id="box">
<a :href="url" :name="data2.naem">超链接标签{{apcdewy.name}}</a>
</div>
<script>
Vue.config.productionTip = false;
new Vue({
el:'#box',
data:{
name:'龙叔',
url:"www.baidu.com",
apcdewy:{
name:'渣渣灰',
}
}
});
</script>
第四章 数据绑定
4.1、单向数据绑定(v-bind:)
数据只能从data流向页面
详解 :vue下的data中的数据改变,就会影响页面的数据,而页面数据如果出现改变,不会影响data下的数据。
4.2、双向数据绑定(v-model:value)
数据可以从data流向页面,也能从页面流向data //只能应用在表单元素
v-model:value可以简写为v-model
详解:不管是data下的数据还是页面下的数据,一方改变,另一方更着改变。
第四章 MVVM模型简介
MVVM模型是一种架构框架,Vue虽然没有完全遵循 MVVM 模型,但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm 这个变量名表示 Vue 实例。
M => 模 型 => data中的数据
V => 视 图 => 模板代码
VM => 视图模型 => Vue实例
重点:
1、data中的所以属性都会成为vue实例的属性。
2、vue实例上的属于属性都可以直接使用。
第五章 数据代理
5.1、给对象添加属性而不直接修改对象的好处:
1、添加的属性拥有更多的选项
2、添加的属性可以与变量双向值绑定setter/getter
Object.defineProperty(实例对象,"键",{
value:值,
enumerable:true, //控制属性是否可以被枚举,默认false,迭代
writable:true, //控制属性是否可以被修改,默认false
configurable:true, //控制属性是否可以被删除,默认false
get(){return '';}, //当调用这个属性,get就会被调用。返回值就是value值
set(value){ 变量 = value;} //当修改这个属性,set就会被调用。用来修改值
});
例子:对象之间绑定,通过对象1可以操作修改对象2的属性。
5.2、vue实例基本原理:
实例化vue对象,将data添加到vue中_data属性下的对象里面,然后再把各个数据添加到新属性下,方便程序员访问,就不用每次都_data.键获取值了,每次获取或修改值都是通过getter/setter方法来进行,获取原data里面的数据。
第六章 事件处理
v-on:click = 方法名(
e
v
e
n
t
,参数列表)当这个元素被点击时触发。函数必须写在
v
u
e
实例下,
event,参数列表) 当这个元素被点击时触发。函数必须写在vue实例下,
event,参数列表)当这个元素被点击时触发。函数必须写在vue实例下,event是一个默认的参数。
简写:@click,没有参数省略括号,其他事件使用v-on:xxx
//不做数据代理,如果写在data里面会多出数据代理,因为方法一般情况只负责展示效果,不做修改,使用methods更方便。
methods:{
方法(event,参数列表){//当只有一个一个默认参数event的时候,可以省略掉。
//此处的this是vm,this可以访vm实现访问data里面的属性。
event.target.innerHTML = 456;
}
}
第七章 事件修饰符
与事件处理methods,@xxx配合使用
修饰符 | 意义 |
---|---|
trim | 去除前后空格 |
number | 输入的数据强转换为数值型,只能接收数字 |
lazy | 懒收集,只有文本框失去焦点才会收集信息 |
prevent | 阻止默认事件 (eg:a标签点击会跳转,表单提交等) |
stop | 阻止事件冒泡 |
once | 事件只触发一次 |
capture | 使用事件的捕获模式 |
self | 只有event.target是当前元素的情况下才触发事件。 |
passive | 事件的默认行为立即执行,无需等待事件回调执行完毕。(滚动事件) |
… | 事件修饰符可叠加使用 |
<body>
<div id="box1" @click="div1">
<div id="box2" @click="div2">
<!-- 阻止继续向上冒泡 -->
<div id="box3" @click.stop="div3">
<a :href="url" @click.prevent.stop="fun">{{name}}</a>
</div>
</div>
</div>
<script>
Vue.config.productionTip=false;
new Vue({
el:'#box1',
data:{
url:'https://www.baidu.com/',
name:'百度'
},
methods: {
fun(e) {
alert("a标签被点击了");
},
div1(e){
alert("div1被点击了");
},
div2(e){
alert("div2被点击了");
},
div3(e){
alert("div3被点击了");
}
},
});
</script>
</body>
第八章 键盘事件
键盘事件的修饰符:
回车:enter
删除:delete
退出:esc
空格:space
换行:tab(特殊,keydown使用)
上:up
下:down
左:left
右:right
系统修饰符:ctrl , alt , shift , meta,
可以通过输出event.keycode得到按键的编码。event.key得到按键的英文
多个英文使用小写中间使用横线分隔。
@keyup.event="show"
<body>
<input type="text" id="a1" @keyup.enter="name">
<script>
Vue.config.proproductionTip = false;
new Vue({
el:'#a1',
// data:{}
methods: {
name(e) {
// 这里写键盘事件触发后执行的代码
console.log(e.target.value);
}
},
});
</script>
</body>
name(e) {
// 这里写键盘事件触发后执行的代码
if(e.key != 'Enter') //或者 (e.keycode != 13)
return;
console.log(e.target.value);
}
第九章 计算属性
插值语法和指令语法中的值要写的简单明了,需要其他操作一般在Vue内部处理掉
methods:{}创建一个方法。//无缓存
computed:{}创建一个属性:{ get(){} }
<body>
<div id="a1">
<div>{{name1}}</div>
<div>{{name2}}</div>
<div>{{name3}}</div>
</div>
<script type="text/javascript">
Vue.config.productionTip = false;
new Vue({
el:'#a1', //绑定节点
data:{
name1:'zhang',
name2:'san'
}, //数据
computed: { //计算属性
name3: { //新创建的一个计算属性
get(){
console.log("被调用了");
return this.name1 + '-' + this.name2;
}
}
/*简写
name3(){
console.log("被调用了");
return this.name1 + '-' + this.name2;
}
*/
},
});
</script>
</body>
get()返回值就是属性的值。当读取属性的时候就会自动调用get,get不能直接调用,也可以设置setter,setter必须修改到具体属性才会修改,一般在computed中不写set。
定义:要通过已有的属性计算得来。
**computed会自动缓存,当初次使用或修改的时候才会调用重新缓存**
简写:(只考虑读取,不考虑修改才会考虑简写)
属性(){} //使用时不加括号!!
思考:在插入的是vm下的属性还是方法就能决定是加括号还是不加括号,目前只有methods属性下的方法才加括号。
第十章 侦听属性(监视属性)
10.1、侦听
<body>
<div id="root">
<div>{{a}}</div>
<div>{{b}}</div>
<!-- <input type="text" v-model:value="b"> -->
<button @click="name_a">改变a的值</button>
<button @click="name_b">改变b的值</button>
</div>
<script>
new Vue({
el:'#root',
data:{
a:1000,
b:100
},
methods: {
name_a() {
this.a++;
},
name_b() {
this.b++;
}
},
watch: {
a:{
handler(newValue, oldValue) {
console.log("修改了"+newValue+' '+oldValue);
}
},
b:{
handler(newValue, oldValue) {
console.log("修改了"+newValue+' '+oldValue);
}
}
},
});
</script>
</body>
watch:{
属性名:{
immediate: true, //初始化时让handler调用。
deep:true, //深度测试
handler(newValue,oldValue){
//当属性被修改时触发,会传来新值和旧值
}
}
}
监视属性必须存在才能被监视,不存在也不会报错。
10.2、监视属性的两种写法:
1、通过watch配置
2、通过实例对象,vm.$watch监视
vm.$watch(‘属性’, {。。。handler(x,y){}})
vm.$watch('a',{
handler(newValue, oldValue){
console.log("修改了"+newValue+' '+oldValue);
}
});
10.3、深度监视(侦听)属性 :
1、vue中的watch默认不监视对象内部的改变。
2、配置deep:true; 就可以监视对象内部的改变
watch中属性的写法其实需要引号括起来,只是简写省略了,如果需要访问属性对象下的属性,就必须加上引号。
watch:{
//第一种 只侦听对象内的某一个属性
'b.x':{
handler(newValue,oldValue){
console.log("x被改变了");
}
},
//第二章 侦听整个对象 对象里的某一个属性改变 都会被侦听到
b:{
deep:true,
handler(newValue,oldValue){
console.log("b被改变了");
}
}
}
10.4、侦听简写:
阉割了初始化调用handler和深度测试,但代码量减少了,方便编写
watch:{被监视属性(newValue, oldValue){… }}
watch:{
a(newValue,oldValue){
console.log("a被改变了");
}
}
vm.$watch('被监视属性', function(newValue, oldValue){})
10.5、computed VS watch 区别:
1、computed能完成的功能,watch也能实现,
2、watch能完成的功能,computed不一定能实现,例如watch可以进行异步操作。
10.6、vue 函数写法 两点原则:
1、所有被vue管理的函数,最好写成普通函数,这样this的指向就是vue 或 组件实例对象。
2、所有不被vue管理的函数(定时器的回调函数,ajax的回调,promise的回调),最好写成箭头函数。
这样this才能指向vm 或 组件实例对象。
第十一章 绑定样式
11.1、绑定class样式
11.1.1、绑定class样式:字符串写法
适用于:单个样式的类名不确定,需要动态指定
<style>
.a {
background-color: antiquewhite;
width: 100px;
height: 100px;
margin:50px auto;
}
.b {
background-color: aqua;
width: 100px;
height: 100px;
margin:50px auto;
}
</style>
<body>
<div id="root" :class="style1">
<button @click="fun">点击</button>
</div>
<script>
new Vue({
el:'#root',
data:{
name:'李明',
age:12,
style1:'a'
},
methods: {
fun() {
this.style1 = 'b';
}
},
});
</script>
</body>
11.1.2、绑定class样式:数组写法
适用于:样式个数多不确定,可以使用数组包含样式,在通过直接调用数组,可以选择全部调用或按下标单个选择调用。
new Vue({
el:'#root',
data:{
name:'李明',
age:12,
style1:['x','y','b'],
style2:['x','y','b']
},
methods: {
fun() {
i = ~~(Math.random()*3);
this.style1 = this.style2[i];
console.log(this.style2[i]+" "+i);
}
},
});
11.1.2、绑定class样式:对象写法
适用于:个数确定,名字确定,但是动态决定用不用。
<body>
<div id="root" class="a" :class="obj">
我爱我的祖国!
<button @click="funx">x</button>
<button @click="funy">y</button>
</div>
<script>
new Vue({
el:'#root',
data:{
name:'李明',
age:12,
obj:{
x:true,
y:true
}
},
methods: {
funx() {
this.obj.x = !this.obj.x;
},
funy() {
this.obj.y = !this.obj.y;
}
},
});
</script>
</body>
11.2、绑定style样式
11.2.1、对象写法
:style=“{fontSize:‘xxx’}”
把原来的样式属性改变成首字符不变,后面的单词首字母大写,省略掉横线。
eg:
(原:)background-color: red;
(改:)backgroundColor: ‘red’,
注意:单词写错也不会报错,也不会得到效果,在Vue里面写css编译器默认不会提示,所有可以使用在css块里面写好,复制到vue内,减小出错的概率。
func() {
this.sty = {
fontSize:'50px', //数据用引号括起来
color:'red'
}
}
11.2.1、数组写法
适用于:多个样式对象一起使用的情况。
:style="[sty, sty2]"
第十二章 条件渲染
12.1、v-show
语法:v-show=“表达式”
特点:隐藏元素
适用于:切换频率高的情况
<body>
<div id="root">
<p v-show="n === 1">这是一个{{name1}}</p>
<button @click="n++">按钮</button>
</div>
<script>
new Vue({
el:'#root',
data:{
name1:'段落1',
n:0,
},
});
</script>
</body>
12.2、v-if
12.2.1、v-if…v-else-if…v-else
语法:v-if=“表达式”…v-else-if=“表达式”…v-else=“表达式”
注意:v-if…v-else-if…v-else必须连续出现,v-if打头(和js选择结构一样)
特点:移除元素(需要注意其他交互,会失去元素焦点)
适用于:切换频率少的情况(主要是删除没有隐藏效率高)
<body>
<div id="root">
<p v-if="n === 1">这是一个{{name1}}</p>
<p v-else-if="n === 2">这是一个{{name2}}</p>
<p v-else="n === 3">这是一个{{name3}}</p>
<button @click="n++">按钮</button>
</div>
<script>
new Vue({
el:'#root',
data:{
name1:'段落1',
name2:'段落2',
name3:'段落3',
n:0,
},
});
</script>
</body>
12.2.2、template模板
template模板不影响结构,但只能和v-if 连用,不能和v-show使用
<body>
<div id="root">
<!-- <p v-if="n === 1">这是一个{{name1}}</p>
<p v-else-if="n === 2">这是一个{{name2}}</p>
<p v-else="n === 3">这是一个{{name3}}</p> -->
<template v-if="n != 0">
<p>这是一个{{name1}}</p>
<p>这是一个{{name2}}</p>
<p>这是一个{{name3}}</p>
</template>
<button @click="n++">按钮</button>
</div>
<script>
new Vue({
el:'#root',
data:{
name1:'段落1',
name2:'段落2',
name3:'段落3',
n:0,
},
});
</script>
</body>
第十三章 列表渲染
13.1、v-for 数组遍历
语法:v-for=“(i, index) in 数组” :key=“唯一标识”
i | 数组[i] |
---|---|
index | 下标 |
提示:index可以省略,括号可以省略,in老版本使用of同等功效,:key也可以省略
<body>
<div id="root">
<ul v-for="(i,index) in student" :key="i.id">
<li>
{{index}}-{{i.name}}-{{i.age}}
</li>
</ul>
</div>
<script>
new Vue({
el:'#root',
data:{
student:[
{id:'001',name:'张三',age:18},
{id:'002',name:'李四',age:19},
{id:'003',name:'王二',age:17}
],
}
});
</script>
</body>
13.2、遍历对象
value | 值 |
---|---|
key | 键 |
<body>
<div id="root">
<ul v-for="(value,key) in zhangsan" :key="key">
<li>
{{key}}-{{value}}
</li>
</ul>
</div>
<script>
new Vue({
el:'#root',
data:{
zhangsan:{
id:'202201',
name:'张三',
age:18,
}
}
});
</script>
</body>
13.3、遍历字符串
与遍历数组一样,只是i代表的是单个字符,下标和数组相同
13.4、固定遍历(极少使用)
数据改成固定整数,i的值是1到数据本身,index是0到数据-1。
13.5、key的原理
Vue原始数据,通过虚拟DOM,生成真实 DOM,更改数据后新Vue数据也会生成一个虚拟DOM,然后新虚拟DOM会和旧虚拟DOM,通过key进行比较,文本相同或者新元素相同的直接挪来使用。
也就是说,key决定了比较的结果,如果插入新元素会影响原顺序,那么就必须指定一直独一无的的key值,因为插入后index会更着改变,所以index不可靠,
如果不指定key,那么key的值默认就是index下标。
13.6、列表过滤
直接上代码:
13.6.1、监视属性版本:
<body>
<div id="root">
<input type="text" placeholder="输入数据" v-model:value="val">
<ul v-for="(i, index) in stu" :key="students.id" >
<li>
{{i.name}}-{{i.age}}-{{i.sex}}
</li>
</ul>
</div>
<script>
new Vue({
el:'#root',
data:{
val:'',
students:[
{id:01,name:'张一三',age:12,sex:'男'},
{id:02,name:'张一二',age:15,sex:'男'},
{id:03,name:'张二三',age:13,sex:'男'},
{id:04,name:'张二四',age:12,sex:'女'}
],
stu:[]
},
watch:{
val:{
immediate:true,
handler(va){
this.stu=this.students.filter((s)=>{
return s.name.indexOf(va) !== -1;
})
}
}
}
});
</script>
</body>
13.6.1、计算属性版本:
<body>
<div id="root">
<input type="text" placeholder="输入数据" v-model:value="val">
<ul v-for="(i, index) in fun" :key="students.id" >//因为fun返回的就是一些对象序列,所以直接在这里使用了,省去了一个容器。
<li>
{{i.name}}-{{i.age}}-{{i.sex}}
</li>
</ul>
</div>
<script>
new Vue({
el:'#root',
data:{
val:'',
students:[
{id:01,name:'张一三',age:12,sex:'男'},
{id:02,name:'张一二',age:15,sex:'男'},
{id:03,name:'张二三',age:13,sex:'男'},
{id:04,name:'张二四',age:12,sex:'女'}
],
},
computed: {
fun() {
return this.students.filter((s)=>{
return s.name.indexOf(this.val) != -1
})
}
},
});
</script>
</body>
13.7、列表排序
<body>
<div id="root">
<input type="text" placeholder="请输入" v-model="val">
<button @click="x=1">升序</button>
<button @click="x=2">降序</button>
<button @click="x=0">复原</button>
<ul v-for="(i,index) in fun" :key="students.id">
<li>
{{i.name}}-{{i.age}}-{{i.sex}}
</li>
</ul>
</div>
<script>
new Vue({
el:'#root',
data:{
val:'',
students:[
{id:01,name:'张一三',age:12,sex:'男'},
{id:02,name:'李一二',age:15,sex:'男'},
{id:03,name:'王二三',age:13,sex:'男'},
{id:04,name:'张二四',age:11,sex:'女'}
],
x:0
},
computed: {
fun() {
const arr = this.students.filter((s)=>{
return s.name.indexOf(this.val) !== -1
})
if(this.x){
arr.sort((a,b)=>{
return this.x == 1 ? a.age-b.age : b.age-a.age
})
}
return arr
}
},
});
</script>
</body>
13.8、Vue监视数据的原理
1、Vue会监视data中所以层次的数据。
2、如何监测对象中的数据:
通过setter实现监视,且要在实例化对象时就传入要检测的数据
(1).对象中后追加的属性,Vue默认不做响应式。
(2).想要有响应式,就必须使用如下API:
Vue.set(this.属性,‘key’,value)或
vm.$set(this.属性2,‘key’,value)
3、如何监测数组中的数据:
通过包裹数组更新元素的方法实现,push()、pop()、shift()、splice、sort()、reverse()
filter(),可以直接把全部进行赋值,新数组替换旧数组,达到过滤筛选的目的。
实例代码:
<body>
<div id="root">
<button @click="age++">年龄+1</button><hr>
<button @click="addSex">添加性别属性,默认男</button><hr>
<button @click="changeSex">修改性别</button><hr>
<button @click.once="addFriend">列表首位添加一个朋友</button><hr>
<button @click="changeOneFriendname">修改第一个朋友的名字为xxx</button><hr>
<button @click="addHobby">添加一个爱好</button><hr>
<button @click="changeOneHobby">修改第一个爱好</button><hr>
<h3>姓名:{{name}}</h1>
<h3>年龄:{{age}}</h1>
<h3 v-if="rests.sex">性别:{{rests.sex}}</h1>
<h3>爱好:</h1>
<ul v-for="i in hobby">
<li>
{{i}}
</li>
</ul>
<h3>朋友:</h1>
<ul v-for="i in friends">
<li>
{{i.name}}-{{i.age}}
</li>
</ul>
</div>
<script>
let vm = new Vue({
el: '#root',
data: {
name: '李四',
age: 20,
rests:{},
hobby: ['抽烟', '喝酒', '吃肥肉'],
friends: [{
name: '张三',
age: 18
},
{
name: '王二',
age: 21
},
{
name: '麻子',
age: 19
}
]
},
methods: {
addSex() {
vm.$set(this.rests,'sex','男')
},
changeSex(){
if(this.rests.sex == '男')
this.rests.sex = '女'
else
this.rests.sex = '男'
},
addFriend(){
this.friends.unshift({name:'旺财',age:2})
},
changeOneFriendname(){
this.friends[0].name = 'xxx'
},
addHobby(){
this.hobby.push('多和异性交朋友')
},
changeOneHobby(){
this.hobby.shift()
this.hobby.unshift('打球')
}
},
});
</script>
</body>
第十四章 收集表单数据
<body>
<div id="root">
<form action="" @submit.prevent="dome">
账号:<input type="text" v-model="username"><br>
密码:<input type="password" v-model="password"><br>
性别:男<input type="radio" name="sex" v-model="sex" value="nan">
<!-- v-model默认收集value,value的值默认为null -->
女<input type="radio" name="sex" v-model="sex" value="nv"><br>
年龄:<input type="number" v-model.number="age"><br>
爱好:打篮球<input type="checkbox" v-model="hobby" value="lanqiu">
踢足球<input type="checkbox" v-model="hobby" value="zuqiu">
跑步<input type="checkbox" v-model="hobby" value="paobu"><br>
所属校区:
<select v-model="school">
<option value="">请选择校区:</option>
<option value="sc">四川</option>
<option value="cq">重庆</option>
<option value="bj">北京</option>
<option value="sh">上海</option>
</select><br>
其他:
<textarea cols="30" rows="5" v-model.lazy="rests" placeholder="请输入其他信息"></textarea><br>
<input type="checkbox" value="tj" v-model="tj">阅读并接收<a href="#">《用户协议》</a>
<button>提交</button>
</form>
</div>
<script>
new Vue({
el: '#root',
data: {
username: '',
password: '',
age: undefined,
sex: 'nan', //默认勾选男
hobby: [],
school: 'sh',
rests: '',
tj: true
},
methods:{
dome(){
console.log(this._data);
}
}
});
</script>
</body>
第十五章 过滤器
定义:对要显示的数据进行特定格式化后在显示(适用于一些简单的逻辑处理)
语法:
1、注册过滤器:Vue。filter(name.callback)或new Vue{filters:{}};
2、使用过滤器:{{xxx|过滤名}}或v-bind:属性=”xxx" | 过滤器名“;
备注:
1、过滤器也可以接收额外参数、多个过滤器也可以串联;
2、并没有改变原来的数据,时产生新的对应的数据。
第十六章 内置指令
16.1、新学指令:v-text
用法:
<body>
<div id="root">
<p>{{name}}</p>
<p v-text="name">...</p> //这个里面的数据不会显示,只会显示name的数据
</div>
<script>
new Vue({
el:'#root',
data:{
name:'hello_world'
}
})
</script>
</body>
v-text 不能解析标签,会直接替换掉原有内容
16.2、新学指令:v-html
用法:
<body>
<div id="root">
<p>{{name}}</p>
<p v-text="name">...</p> //不支持结构的解析
<p v-html="name">...</p> //支持结构的解析
</div>
<script>
new Vue({
el:'#root',
data:{
name:'<h3>hello_world</h3>'
}
})
</script>
</body>
16.3、新学指令v-cloak
v-cloak 没有属性值,
v-cloak 属性指定的样式在被vue接管时就会消失
v-cloak 一般和属性选择器连用
<head>
<!-- <script src="vue.js"></script> -->
<style>
[v-cloak] { //属性选择器
display: none;
}
</style>
</head>
<body>
<div id="root">
<p v-cloak>{{name}}</p>
</div>
<script>
new Vue({
el:'#root',
data:{
name:'123'
}
})
</script>
</body>
16.4、新学指令v-once
v-once 没有属性值
第一次被显示到屏幕上后,vue数据改变,显示数据也不会发生改变。
<body>
<div id="root">
<p v-once>n的值是:{{n}}</p>
<p>n的值是:{{n}}</p>
<button @click="n++">n+1</button>
</div>
<script>
new Vue({
el:'#root',
data:{
n:1
}
})
</script>
</body>
16.5、新学指令v-pre
v-pre 没有参数
v-pre 的作用是:跳过Vue的编译过程,直接拿来使用,加快Vue编译速度。
<body>
<div id="root">
<p v-pre>{{x}}</p>
</div>
<script>
new Vue({
el:'#root',
data:{
x:123
}
})
</script>
</body>
16.6、学过的内置指令汇总
指令 | 意义 |
---|---|
v- bind | 单向数据绑定 |
v-model | 双向数据绑定 |
v- show | 条件渲染,隐藏元素 |
v-if…else | 条件渲染,移除元素(需要注意其他交互,会失去元素焦点) |
v- for | 数组,对象,字符串遍历输出 |
v-on | 绑定事件监听,简写@,例如@click |
v-text | 替换元素内容 ,不解析标签 |
v-html | 替换元素内容,解析标签 |
v-cloak | 不显示没有被Vue编译的元素(没有属性值) |
v-once | 将Vue编译的结果转为静态数据,不参与今后的改变 |
v-pre | 跳过Vue编译,提高Vue编译速度 |
第十七章 自定义指令
17.1、局部式
<body>
<div id="root">
<p>{{x}}</p>
<p v-text="x"></p>
<p v-big="x"></p> //自定义指令
</div>
<script>
new Vue({
el:'#root',
data:{
x:123
},
directives:{
big(element,binding){ //这里要省略v-,element是当前节点对象,binding是当前指令的值的对象
element.innerHTML = binding.value*10
}
}
})
</script>
</body>
<body>
<div id="root">
<p>{{x}}</p>
<p v-text="x"></p>
<p v-big="x"></p> //自定义指令
<button @click="x++">x+1</button>
<input type="text" v-big2="x"> //自定义指令
</div>
<script>
new Vue({
el:'#root',
data:{
x:123
},
directives:{
//这里要省略v-,element是当前节点对象,binding是当前指令的值的对象
big(element,binding){ //函数式
element.innerHTML = binding.value*10
},
// 自动获取焦点
big2:{ //对象式
bind(element,binding){
element.value = binding.value*10
},
inserted(element,binding){
element.focus()
},
update(element,binding){
element.value = binding.value*10
}
}
}
})
</script>
</body>
自定义指令函数式v-big调用情况:
1、指令与元素成功绑定时。
2、模板被解析,big就会被调用。
对象式v-big2调用情况:
1、成功绑定调用bind()
2、插入页面时调用inserted()
3、数据更新调用update()
17.2、全局式
<body>
<div id="root">
<p>{{x}}</p>
<p v-big="x"></p>
<button @click="x++">x+1</button>
<input type="text" v-big2="x">
</div>
<div id="root2">
<p>{{n}}</p>
<p v-big="n"></p>
<button @click="n++">x+1</button>
<input type="text" v-big2="n">
</div>
<script>
Vue.directive('big',function(element,binding){ //不加s
element.innerHTML = binding.value*10
})
Vue.directive('big2',{
bind(element,binding){
element.value = binding.value*10
},
inserted(element,binding){
element.focus()
},
update(element,binding){
element.value = binding.value*10
}
})
new Vue({
el:'#root',
data:{
x:123
},
// directives:{
// big(element,binding){
// element.innerHTML = binding.value*10
// },
// // 自动获取焦点
// big2:{
// bind(element,binding){
// element.value = binding.value*10
// },
// inserted(element,binding){
// element.focus()
// },
// update(element,binding){
// element.value = binding.value*10
// }
// }
// }
})
new Vue({
el:'#root2',
data:{
n:1
}
})
</script>
</body>
17.3、注意事项:
1、指令名
当不止一个单词的时候,必须使用xxx-xxx的格式,例如:big-number,
并且函数不能再简写,必须加引号’xxx-xxx’(){…}
2、directives下的函数this指向总是window
第十八章 生命周期
实现页面加载,字体便自动透明的下降,到0时回转到1重新降低,以此往复
<body>
<div id="root">
<h2 :style="{opacity}" @load="begin">你好!</h2>
</div>
<script>
new Vue({
el:'#root',
data:{
opacity:1
},
mounted() {
setInterval(()=>{
this.opacity -= 0.01
if(this.opacity <= 0){this.opacity = 1}
},10)
}
})
</script>
</body>
生命周期总结:
- 又名:生命周期回调函数、生命周期函数、生命周期钩子
- 是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数
- 生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的
- 生命周期函数中的this指向是vm 或 组件实例对象
重要的生命周期函数:
函数 | 调用时机 |
---|---|
mounted | 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等初始化操作 |
beforeDestroy | 清除定时器、解绑自定义事件、取消订阅消息等收尾工作 |
vm.$destroy() | 销毁vm实例对象 |
---|
注意:页面不会直接丢失,还存在最后销毁前加载成dom的页面,只是Vue没有了,也不能再通过Vue操作页面
基础篇完结
提示:这只是个人笔记,可能存在问题,建议直接前往b站观看尚硅谷老师的教程,真的嘎嘎细节嘎嘎棒,在这里也感谢老师的教程。