指令

就是在vue中带有v-前缀的html特殊属性

语法:

写在html的开标签中 使用v-指令=”指令值”

作用:

在vue扩展了标签的功能

v-model

作用:在表单元素上进行数据的双向绑定

语法:v-model=”变量”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/_vue@2.6.14@vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <h1>v-model</h1>
        <!--
                双向绑定
                模型数据变化了  视图会自动变化
                试图变化了   模型数据也会随之改变
            -->
        <input type="text" v-model="xiaoyang">
        <h4>{{xiaoyang}}</h4>
        <h4>{{xiaoyang}}</h4>
        <h4>{{xiaoyang}}</h4>
        <h4>{{xiaoyang}}</h4>
        <h4>{{xiaoyang}}</h4>
    </div>

    <script>
        new Vue({
            el: "#box",
            data: {
                xiaoyang: "你好",
            }
        })
    </script>
</body>

</html>

双向绑定的原理:

双向绑定 就是数据劫持与发布者订阅者模式

数据劫持:数据拦截 通过object.defineProperty()方法 进行劫持 通过这个方法下的getter(读取) 与setter(修改) 因为数据被劫持了 那么当数据改变的时候 vm层就会通过数据拦截 来反向的告诉模型或者视图做出反应

发布者订阅者模式:就是一个一对多的关系 发布者改变了 所有订阅者也会随之改变

v-show

作用:控制元素的显示和隐藏(使用css的display来控制元素的显示和隐藏)

语法:v-show=“布尔值” true显示 false隐藏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/_vue@2.6.14@vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <h1>v-show</h1>
        <h1 v-show="bool">控制我的显示与隐藏</h1>
    </div>

    <script>
        new Vue({
            el: "#box",
            data: {
                bool: true
            }
        })
    </script>
</body>

</html>

v-on

作用: 给dom元素绑定事件

语法: v-on:事件=“函数” 鼠标左键单击事件 onclick vue中: v-on:click=””

​ 简写: 把v-on: 替换成@ v-on:click @click

函数写在哪?

在el data 同级位置使用methods来容纳函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/_vue@2.6.14@vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <h1>v-on</h1>
        <button v-on:click="fun()"></button>
    </div>

    <script>
        new Vue({
            el: "#box",
            data: {
                text: "我是变量"
            },
            methods: {
                fun() {
                    alert(this.text)
                }
            }
        })
    </script>
</body>

</html>

v-for

作用:遍历data中的数据,并且在页面进行内容的展示

语法:v-for=”(遍历的数据,遍历的下标) in 你要遍历的数据”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <ul>
            <li v-for="(v,i) in arr">
                {{v}}
            </li>
        </ul>
        <table border="1">
            <tr v-for="(v,i) in obj">
                <td>{{v.name}}</td>
                <td>{{v.age}}</td>
            </tr>
        </table>
    </div>
    <script>
        new Vue({
            el: "#box",
            data: {
                arr: ["c", "js", "python", "java"],
                obj: [{
                    name: "xixi",
                    age: 18
                }, {
                    name: "huanghuanng",
                    age: 32
                }, {
                    name: "lili",
                    age: 28
                }]
            }
        })
    </script>
</body>

</html>

v-bind

作用:给html的属性插入变量

语法: v-bind:html的属性=”属性值” 简写 :html的属性=”属性值”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <a v-bind:href="ahref">{{text}}</a>
        <a :href="ahref">{{text}}</a>
    </div>

    <script>
        new Vue({
            el: "#box",
            data: {
                text: "点我去百度",
                ahref: "http://www.baidu.com"
            },
            methods: {

            }
        })
    </script>
</body>

</html>

绑定多个属性怎么办?

逗号隔开

v-if全家桶

作用:对网页的dom内容进行添加和移除

v-if

语法:v-if=“布尔值” true 添加 false移除

v-show 与v-if的区别

1.v-if是对dom元素进行添加和删除从而完成的页面显示和隐藏 v-show是通过css的方式进行显示和隐藏

2.v-if 在初始化对页面的性能损耗低 v-show损耗高

3.v-if在页面频繁切换的时候性能损耗高 v-show损耗低

v-else

必须配合v-if来使用 不能单独使用

当v-if不符合的时候显示v-else的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <h1 v-if="bool">请登录</h1>
        <h1 v-else>欢迎您</h1>
    </div>

    <script>
        new Vue({
            el: "#box",
            data: {
                bool: true
            }
        })
    </script>
</body>

</html>

v-else-if

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <h1 v-if="1==num">吃饭</h1>
        <h1 v-else-if="2==num">睡觉</h1>
        <h1 v-else-if="3==num">打豆豆</h1>
        <h1 v-else-if="4==num">写代码</h1>
        <h1 v-else>打游戏</h1>
    </div>
    <script>
        new Vue({
            el: "#box",
            data: {
                num: 1
            },
            methods: {

            }
        })
    </script>
</body>

</html>

v-text

作用:向网页中插入纯文本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <style>
        [v-cloak] {
            display: none;
        }
    </style>
</head>

<body>
    <div id="box" v-cloak>
        <h1>{{text}}</h1>
        <h1>{{text}}</h1>
        <h1>{{text}}</h1>
    </div>

    <script>
        new Vue({
            el: "#box",
            data: {
                text: "我是变量"
            }
        })
    </script>
</body>

</html>

扩展–屏幕闪烁

当用户网速较慢的时候 有可能会把花括号显示出来 然后等网络恢复 在显示正常 那么这个过程就是屏幕闪烁

1.v-text可以解决

2.v-cloak指令 用来保持元素直到被关联之后再进行编译

v-html

作用:把字符串标签渲染到页面上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        {{newhtml}}
        <div v-html="newhtml"></div>
    </div>

    <script>
        new Vue({
            el: "#box",
            data: {
                newhtml: "<i>我是i标签</i>"
            }
        })
    </script>
</body>

</html>

v-once

作用:变量一次性插值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <input type="text" v-model="text">
        <h1>{{text}}</h1>
        <h1 v-once>{{text}}</h1>
        <h1>{{text}}</h1>
        <h1>{{text}}</h1>
        <h1>{{text}}</h1>
        <h1>{{text}}</h1>
    </div>

    <script>
        new Vue({
            el: "#box",
            data: {
                text: "我是默认值"
            },
            methods: {

            }
        })
    </script>
</body>

</html>

watch监听属性

watch就是对vue实例中data属性的数据进行监听 当data属性发生改变的时候 watch就会触发 从而执行一些指定的逻辑

语法:写在与el data methods的同级位置

watch:{

​ 你要监听的data数据( 你监听的数据改变之后的结果,你监听的数据改变之前的结果){

​ 你的逻辑

​ }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/_vue@2.6.14@vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <input type="text" v-model="text">
        <h1>{{text}}</h1>
    </div>
    <script>
        new Vue({
            el: "#box",
            data: {
                text: "你好么么哒"
            },
            methods: {

            },
            //监听属性
            watch: {
                text(newval, oldval) {
                    console.log(`${newval}------${oldval}`);
                }
            }
        })
    </script>
</body>

</html>

扩展:watch在首次加载会触发吗?如果我想让他在首次加载就触发怎么办?

immediate:true

1
2
3
4
5
6
7
8
9
10
watch: {

    text: {
        handler(newval, oldval) {
              console.log(`${newval}------${oldval}`);
        },
           immediate: true
                }
      }
})

computed计算属性

计算属性:它是vue实例中的一个属性(是在vue中完成一些特殊功能)它是有一个计算功能的属性 计算属性可以处理data中的数据 通过计算属性的处理 从而对数据进行操作 计算属性也会根据它所处理的data数据的改变从而发生改变进行重新计算

语法:写在 el data methods watch 等同级位置

computed:{

​ 你处理之后的结果变量() {

​ 必须要有return 你的处理逻辑

​ }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/_vue@2.6.14@vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <h1>{{text}}</h1>

        <!-- 下面的代码没有错  是可以对data中的数据进行处理的  并且页可以正常渲染
              但是视图层只是用来展示数据的  再里面写很多的逻辑不太好  不好维护
<h1>{{text.toUpperCase().substr(1,4)}}</h1>
        -->

        <h1>{{uptext}}</h1>

    </div>
    <script>
        new Vue({
            el: "#box",
            data: {
                text: "sdfghjksdfgh"
            },
            methods: {

            },
            watch: {

            },
            computed: {
                uptext() {
                    return this.text.substr(2, 9).toUpperCase()
                }
            }
        })
    </script>
</body>

</html>

计算属性与方法的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/_vue@2.6.14@vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <!--
            大家发现下面我们把计算属性和方法分别调用多次
            会知道
            计算属性无论被调用多少次只执行一次 因为计算属性走缓存(就是他会在第一次执行
完毕之后会把处理好的数据放在内存中 只要数据不变 那么一直就读取内存中的数据)
            方法  只要被调用就会执行  浪费性能
         -->
        <h1>方法:{{fun()}}</h1>
        <h1>{{fun()}}</h1>
        <h1>{{fun()}}</h1>
        <h1>{{fun()}}</h1>
        <h1>{{fun()}}</h1>
        <h1>{{fun()}}</h1>
        <h1>{{fun()}}</h1>
        <h1>计算属性:{{newtext}}</h1>
        <h1>{{newtext}}</h1>
        <h1>{{newtext}}</h1>
        <h1>{{newtext}}</h1>
        <h1>{{newtext}}</h1>
    </div>

    <script>
        new Vue({
            el: "#box",
            data: {
                text: "你好么么哒"
            },
            methods: {
                fun() {
                    console.log("我是函数");
                    return this.text.substr(1, 3)
                }
            },
            computed: {
                newtext() {
                    console.log("我是计算属性")
                    return this.text.substr(1, 3)
                }
            }
        })
    </script>
</body>

</html>

计算属性无论被调用多少次只执行一次 因为计算属性走缓存(就是他会在第一次执行完毕之后会把处理好的数据放在内存中 只要数据不变 那么一直就读取内存中的数据)

方法只要被调用就会执行 浪费性能

计算属性与watch的区别

计算属性:是依赖data的数据 当数据改变了 计算属性只会对依赖的数据重新计算返回新的结果

watch: 监听data的数据 当数据变了 他会调用一个函数从而完成其他的逻辑

事件对象

谁触发这个事件 事件对象就包含谁的信息 $event

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/_vue@2.6.14@vue/dist/vue.js"></script>
</head>

<body>
    <div id="box">
        <input type="text" @keyDown.ctrl="fun($event)">
    </div>

    <script>
        new Vue({
            el: "#box",
            data: {

            },
            methods: {
                fun(e) {
                    console.log("ctrl按下了");
                }
            }
        })
    </script>
</body>

</html>

修饰符

对事件操作进行一些细节的处理

语法:v-on:事件.修饰符=”函数()”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./node_modules/_vue@2.6.14@vue/dist/vue.js"></script>
    <style>
        .fu {
            width: 500px;
            height: 500px;
            background-color: aqua;
        }
       
        .zi {
            width: 200px;
            height: 200px;
            background-color: yellow;
        }
    </style>
</head>

<body>
    <div id="box">
        <div class="fu" @click="fu()">
            <div class="zi" @click.stop="zi()"></div>
        </div>
    </div>
    <script>
        new Vue({
            el: "#box",
            data: {

            },
            methods: {
                fu() {
                    console.log("fufufufufufufu");
                },
                zi() {
                    console.log("zizizizizizizi");
                }
            }
        })
    </script>
</body>

</html>

按键修饰符

为了解决键盘上的对应事件的复杂度提供了按键修饰符 来修饰指定按键的细节

.up .down .left .right .ctrl .space .enter

事件修饰符

阻止事件冒泡 :stop

阻止默认行为 :prevent

设置事件捕获: captrue

设置事件触发范围 在自己范围内生效不包含子元素范围 : self

只触发一次: once