03, 指令上

# 03, 指令上

# 1.1, 什么是指令

  • 指令英文【directive】
  • Vue框架借鉴angular框架小技巧,指令概念。
  • Vue框架给咱们提供很多指令, Vue框架中的指令,实质就是给标签新增自定义属性,只不过指令【自定义属性】都是以v-xxxx
  • 自定义属性是指程序员自己瞎写、胡写、乱写人家官方没有提出的属性,称之为自定义属性

# 1.2, v-bind指令

  • v-bind: Vue框架提供的一个指令, 它主要的作用是,可以给标签绑定动态属性,可以简写成:
  • 动态地绑定一个或多个 attribute,或一个组件 prop 到表达式。
  • v-bind用于绑定一个或多个属性值,或者向另一个组件传递props值(这个学到组件时再介绍)
  • {{}}给标签绑定动态文本,v-bind给标签绑定动态属性
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app">
        <!-- {{}}只能写在文件节点处,不能写在属性节点处 -->
        <!-- <img src="{{url}}" alt=""> -->

        <!-- 这样写也不行,url是死的三个字母,并不是动态数据 -->
        <!-- <img src="url" alt=""> -->

        <!-- v-bind作用是用于把数据绑定到属性节点处 -->
        <!-- 如果写了v-bind "url"不再是字符串了  "url"是表达式了 -->
        <!-- <img v-bind:src="url" alt=""> -->

        <!-- v-bind可以简写成: -->
        <!-- <img :src="url" alt=""> -->

        <!-- "haha是字符串" -->
        <!-- <p title="haha"></p> -->

        <!-- <p :title="haha">我是一个P标签</p> -->

        <!-- <input type="text" :value="ok"> -->

        <a :href="name">{{name}}</a>
    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    url:"https://cn.vuejs.org/images/logo.svg",
                    haha:"lala",
                    ok:"ok666",
                    name:"wangcai"
                }
            }
        });
    </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

# 1.3, v-once指令(了解)

  • v-once用于指定元素或者组件只渲染一次
  • 当数据发生变化时,元素或者组件以及其所有的子元素将视为静态内容并且跳过
  • 该指令可以用于性能优化
  • 如果是子节点,也是只会渲染一次
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app"  v-once>
        <!-- v-once表示只会第一次渲染数据到模板中,后面数据变了,模板也不会刷新了 -->
        <!-- <h2 v-once>计数器:{{number}}</h2> -->
        <h2>计数器:{{number}}</h2>
        <button @click="increment">加1</button>
    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    number:0
                }
            },
            methods:{
                increment(){
                    this.number++
                }
            }
        });
    </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

# 1.4, v-text指令(了解)

  • 用于更新元素的 textContent:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app">
        <h2>{{msg}}</h2>
        <!-- "msg" 不是字符串,不是字符中,不是字符串,不是字符串 -->
        <!-- {{}}是v-text的语法糖,说白了,就是简写形式 -->
        <!-- 基本上不用,一般使用{{}} -->
        <h2 v-text="msg"></h2>

        <hr>

        <!-- v-text并不会解析标签 -->
        <div v-text="msg2"></div>
    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    msg:"hello vue",
                    msg2:"<p style='color:red;'>我是一个P标签</p>"
                }
            }
        });
    </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

# 1.5, v-html指令

  • 默认情况下,如果我们展示的内容本身是 html 的,那么vue并不会对其进行特殊的解析
  • 如果我们希望这个内容被Vue可以解析出来,那么可以使用 v-html 来展示;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app">
        <!-- 如果绑定的内容是html标签字符串,使用v-html会解析这个字符串 -->
        <!-- 解析html标签字符串,也是有安全隐患的,html标签字符串不是被信任的,不要使用v-html  -->
        <div v-html="msg2"></div>
    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    msg:"hello vue",
                    msg2:"<p style='color:red;'>我是一个P标签</p>"
                }
            }
        });
    </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

# 1.6, v-pre指令(了解)

  • v-pre用于跳过元素和它的子元素的编译过程,显示原始的Mustache标签
  • 跳过不需要编译的节点,加快编译的速度;
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>

<body>
    <!-- 定义的容器 -->
    <div id="app">
        <!-- v-pre是一个指令,了解,作用:跳过模板编译 -->
        <!-- 模板中有些标签,不需要编译,可以使用v-pre,跳过模板编译,性能就高了 -->
        <div v-pre>
            <h2>{{msg}}</h2>
            <p>{{count}}</p>
        </div>
    </div>

    <script>
        let vm = new Vue({
            el: "#app",
            data() {
                return {
                    msg: "hello vue",
                    count: 10
                }
            }
        });
    </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

# 1.7, v-cloak指令(了解)

  • 这个指令保持在元素上直到关联组件实例结束编译
  • 和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到组件实例准备完毕
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
    <style>
        [v-cloak]{
            display: none;
        }
    </style>
</head>

<body>
    <!-- 定义的容器 -->
    <div id="app">
        <!-- 需求:如果vm和模板没有关联好,不要去编译{{}} -->
        <h2 v-cloak>{{msg}}</h2>
    </div>

    <script>
        setTimeout(() => {
            let vm = new Vue({
                el: "#app",
                data() {
                    return {
                        msg: "hello vue"
                    }
                }
            });
        }, 3000);
    </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

# 1.8, v-if指令

  • 在某些情况下,我们需要根据当前的条件决定某些元素或组件是否渲染,这个时候我们就需要进行条件判断了
  • Vue提供了下面的指令来进行条件判断:
    • v-if
    • v-else
    • v-else-if
    • v-show

v-if、v-else、v-else-if用于根据条件来渲染某一块的内容

  • 这些内容只有在条件为true时,才会被渲染出来
  • v-if是惰性的
  • 当条件为false时,其判断的内容完全不会被渲染或者会被销毁掉
  • 当条件为true时,才会真正渲染条件块中的内容;
  • v-if每一次展示都是创建一个新的DOM, 每一次隐藏都需要移出、干掉DOM进行隐藏。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
    <style>
        button {
            margin-top: 100px;
            width: 400px;
            height: 50px;
        }
        .box{
            width: 400px;
            height: 200px;
            background: yellowgreen;
        }
    </style>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app">
        <!-- v-if后面也是写表达式 -->
        <!-- " true " 不是字符串,不是字符串,不是字符串 -->
        <!-- v-if后面如果是真,就渲染DOM元素或组件 -->
        <!-- <h1 v-if=" true ">今天是08月08号,再过一段时间就9月份了</h1> -->

        <!-- v-if后面表达式只要转化成真,DOM元素或组件就会渲染 -->
        <!-- <h1 v-if=" 1+1 ">今天是08月08号,再过一段时间就9月份了</h1> -->

        <!-- v-if后面如果转化成假,这个DOM元素或组件压根不会渲染 -->
        <!-- <h1 v-if=" 1-1 ">今天是08月08号,再过一段时间就9月份了</h1> -->

        <button @click="handle">让盒子显示或隐藏</button>
        <!-- v-if可以控制一个DOM元素创建或销毁 -->
        <!-- 频繁地创建或销毁一个DOM元素,性能也很低 -->
        <!-- 换句话说,如果一个DOM元素,需要频繁地显示或隐藏,建议不要使用v-if -->
        <!-- v-if是惰性的  如果判断值本身就是false,压根就不会创建 -->
        <!-- 每一次显示,都是创建出一个新的DOM元素,每一隐藏都是移除,销毁掉这个DOM元素 -->
        <div class="box" v-if="show"></div>
    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    // 响应式数据
                    show:true
                }
            },
            methods:{
                handle(){
                    this.show = !this.show
                }
            }
        });
    </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
58
59
60
61
62
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        div {
            width: 100px;
            height: 100px;
            margin: 20px 0px;
        }

        .pink {
            background: pink;
        }

        .skyblue {
            background: skyblue;
        }

        .gold {
            background: gold;
        }
    </style>
</head>

<body>
    <!-- 定义的容器 -->
    <div id="app">
        <div class="pink" v-if=" show==='pink' "></div>
        <div class="skyblue" v-else-if=" show=='skyblue' "></div>
        <!-- v-if|v-eles-if|v-else中间不要出现其它的标签,否则失效了,报警告了 -->
        <!-- <p>我是一个孤独的P标签</p> -->
        <div class="gold" v-else></div>
    </div>

    <script>
        let vm = new Vue({
            el: "#app",
            data() {
                return {
                    show:"gold"
                }
            }
        });
    </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

template元素

  • 因为v-if是一个指令,所以必须将其添加到一个元素上
  • 如果我们希望切换的是多个元素,此时我们渲染div,但是我们并不希望div这种元素被渲染,这个时候,我们可以选择使用template
  • template元素可以当做不可见的包裹元素,并且在v-if上使用,但是最终template不会被渲染出来,有点类似于小程序中的block
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>

<body>
    <!-- 定义的容器 -->
    <!-- <div id="app">
        <div v-if="number==1">
            <div>haha</div>
            <div>haha</div>
            <div>haha</div>
        </div>

        <div v-else-if="number==2">
            <div>xixi</div>
            <div>xixi</div>
            <div>xixi</div>
        </div>

        <div v-else>
            <div>hehe</div>
            <div>hehe</div>
            <div>hehe</div>
        </div>
    </div> -->

    <div id="app">
        <!-- template标签,也叫幽灵标签 -->
        <template v-if="number==1">
            <div>haha</div>
            <div>haha</div>
            <div>haha</div>
        </template>

        <template v-else-if="number==2">
            <div>xixi</div>
            <div>xixi</div>
            <div>xixi</div>
        </template>

        <template v-else>
            <div>hehe</div>
            <div>hehe</div>
            <div>hehe</div>
        </template>
    </div>

    <script>
        let vm = new Vue({
            el: "#app",
            data() {
                return {
                    number: 1
                }
            }
        });
    </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
58
59
60
61
62
63
64
65
66

v-show

  • v-show: 也是Vue框架提供一个指令, 可以让元素进行显示与隐藏?【功能与v-if类似】
  • v-show: 右侧属性一般需要的是布尔值|JS表达式
  • v-show是通过样式display实现元素的显示(block)与隐藏(none)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
    <style>
        *{
            margin: 0px;
            padding: 0px;
        }
        .box{
            width: 400px;
            height: 200px;
            margin: 150px 0px;
            background-color: gold;
            animation: donghua 2s linear 0s infinite;
        }
        /* 定义一个动画 */
        @keyframes donghua {
            from{
                transform: rotate(0deg);
            }
            to{
                transform: rotate(360deg);
            }
        }
    </style>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app">
        <button @click="handle">通过v-show控制元素的显示与隐藏</button>
        <!-- v-show后面不是字符串 -->
        <div class="box" v-show="show"></div>
    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    // 响应式数据
                    show:true
                }
            },
            methods:{
                handle(){
                    this.show = !this.show
                }
            }
        });

        // v-if和v-show的区别?
        //   v-if是控制元素的创建或销毁,每次创建出来的都是新的,创建或销毁DOM元素,很耗性能。
        //   v-if后面的条件是false,它是惰性的,DOM元素压根不会创建
        //   v-show后面的条件不管是true或false,DOM元素都会创建,它是通过display来控制元素的显示或隐藏
        //   v-show不支持template标签,v-if支持template标签
        //   v-if会导致浏览器的重排(重排一定会引起重绘),v-show导致浏览器的重绘。
        //   如果需要频繁控制元素的显示或隐藏,那么使用v-show,不频繁,也可以使用v-if,尽可能使用v-show
    </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
58
59
60
61
62
63
64
65

v-show和v-if的区别

  • v-show和v-if的用法看起来是一致的,也是根据一个条件决定是否显示元素或者组件:
  • v-show是不支持template
  • v-show元素无论是否需要显示到浏览器上,它的DOM实际都是有存在的,只是通过CSS的display属性来进行切换
  • v-if当条件为false时,其对应的原生压根不会被渲染到DOM中
  • v-if直接操作DOM创建与销毁,频繁的操作DOM,很耗性能的。
  • 如果我们的原生需要在显示和隐藏之间频繁的切换,那么使用v-show
  • 如果不会频繁的发生切换,那么使用v-if
  • v-if与v-show在控制元素的显示与隐藏的时候,尽可能使用v-show

为什么做元素的显示与隐藏的效果,使用v-show性能会优化一些那?

  • v-if:通过创建DOM、移出DOM完成元素的显示与隐藏,会导致浏览器重排。
  • v-show: 通过样式display实现元素的显示与隐藏,会导致浏览器重绘。
  • 虽然重绘、重排都消耗电脑的性能,但是重绘消耗的性能更少一些。
  • v-show与v-if选择的时候,尽可能使用v-show

# 1.9, v-model指令

表单提交是开发中非常常见的功能,也是和用户交互的重要手段

  • 比如用户在登录、注册时需要提交账号密码
  • 比如用户在检索、创建、更新信息时,需要提交一些数据

v-model可以用来收集表单中的数据

  • v-model指令可以在表单 input、textarea以及select元素上创建双向数据绑定
  • 它会根据控件类型自动选取正确的方法来更新元素
  • 尽管有些神奇,但 v-model 本质上不过是语法糖,它负责监听用户的输入事件来更新数据,并在某种极端场景下进行一些特殊处理
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app">
        <!-- 不使用v-model,实现双向绑定 -->
        <!-- <input type="text" :value="msg" @input="inputChange"> -->

        <!-- 在vue中,如果监听器中的代码就一行,可以写在模板中,不建议使用 -->
        <input type="text" :value="msg" @input="msg = $event.target.value">

        <hr>

        <!-- v-model就是一个语法糖: :value + @input -->
        <!-- <input type="text" v-model="msg"> -->

        <!-- 模拟登录 -->
        <label for="account">
            账号:<input type="text" id="account" v-model="account">
        </label>
        <label for="pwd">
            密码:<input type="password" id="pwd" v-model="pwd">
        </label>
        <button @click="loginClick">登录</button>
    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    msg:"i love vue",
                    account:"",
                    pwd:""
                }
            },
            methods:{
                inputChange(e){
                    this.msg = e.target.value
                },
                loginClick(){
                    console.log("用户名:",this.account);
                    console.log("密码:",this.pwd);
                    // axios
                    console.log("发送网络请求,实现登录....");
                }
            }
        });
    </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
58

v-model的原理

  • 官方有说到,v-model的原理其实是背后有两个操作
  • v-bind绑定value属性的值
  • v-on绑定input事件监听到函数中,函数会获取最新的值赋值到绑定的属性中
<input v-model="searchText" />
1

等价于:

<input :value="searchText" @input="searchText = $event.target.value" />
1

v-model绑定textarea

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app">
        <textarea cols="30" rows="10" v-model="content"></textarea>
        <p>输入的内容:{{content}}</p>
    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    content:""
                }
            }
        });
    </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

v-model绑定checkbox

  • v-model绑定checkbox:单个勾选框和多个勾选框
  • 单个勾选框:v-model即为布尔值
  • 此时input的value属性并不影响v-model的值
  • 多个复选框: 当是多个复选框时,因为可以选中多个,所以对应的data中属性是一个数组
  • 当选中某一个时,就会将input的value添加到数组中
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app">
        <!-- checkbox可以作为一个是否同意的单选框 -->
        <label for="agree">
            <!-- 单个选框(是否同意按钮) v-model的值是布尔值 -->
            <input type="checkbox" id="agree" v-model="isAgree"> 同意xxx协议
        </label>
        <h2>单选框:{{isAgree}}</h2>

        <hr>

        <!-- checkbox多选框:v-model绑定的就是一个数组了 -->
        <!-- 每一个input上,必须有一个value -->
        <div class="hobbies">
            <h2>请选择你的爱好:</h2>
            <label for="sing">
                <!-- 单个选框(是否同意按钮) v-model的值是布尔值 -->
                <input type="checkbox" id="sing" v-model="hobbies" value="sing"> 唱歌
            </label>
            <label for="coding">
                <input type="checkbox" id="coding" v-model="hobbies" value="coding"> 打代码
            </label>
            <label for="basketball">
                <input type="checkbox" id="basketball" v-model="hobbies" value="basketball"> 打篮球
            </label>
        </div>

        <h2>爱好:{{hobbies}}</h2>
    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    isAgree:false,
                    hobbies:[]
                }
            }
        });
    </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

v-model绑定radio

  • v-model绑定radio,用于选择其中一项
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app">
        <div class="gender">
            <label for="male">
                <!-- v-model收集的也是value值 -->
                <input id="male" name="sex" type="radio" v-model="gender"  value="male"></label>
            <label for="female">
                <input id="female" name="sex" type="radio" v-model="gender" value="female"></label>
            <h2>性别: {{gender}}</h2>
        </div>
    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    gender:"female"
                }
            }
        });
    </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

v-model绑定select

  • 和checkbox一样,select也分单选和多选两种情况
  • 单选:只能选中一个值,v-model绑定的是一个值
  • 多选:可以选中多个值,v-model绑定的是一个数组
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app">
        <!-- select的单选 -->
        <!-- v-model需要写在select身上 -->
        <select v-model="fruit">
            <option value="apple">苹果</option>
            <option value="orange">橘子</option>
            <option value="banana">香蕉</option>
        </select>
        <h2>单选:{{fruit}}</h2>

        <hr>

        <!-- multiple 多选 -->
        <!-- size=3 表示可视区中显示几个选项 -->
        <!-- 收集多个,v-model绑定的就是一个数组 -->
        <select multiple size="3" v-model="fruit2">
            <option value="apple">苹果</option>
            <option value="orange">橘子</option>
            <option value="banana">香蕉</option>
        </select>
        <h2>多选:{{fruit2}}</h2>
    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    fruit:"banana",
                    fruit2:["apple"]
                }
            }
        });
    </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

# 2.0, v-model修饰符

lazy

  • 默认情况下,v-model在进行双向绑定时,绑定的是input事件,那么会在每次内容输入后就将最新的值和绑定的属性进行同步
  • 如果我们在v-model后跟上lazy修饰符,那么会将绑定的事件切换为 change 事件,只有在提交时(比如回车)才会触发

number

  • 将绑定的字符串类型,转换为数字类型

trim

  • 自动过滤用户输入的首尾空白字符,可以给v-model添加 trim 修饰符
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- 引入Vue.js,人家向外暴露一个Vue类  new Vue -->
    <script src="../lib/vue2.7.8.js"></script>
</head>
<body>  
    <!-- 定义的容器 -->
    <div id="app">
        <!-- lazy 把input事件切换成change事件 -->
        <input type="text" v-model.lazy="msg">
        <h2>msg:{{msg}}</h2>

        <hr>

        <input type="text" v-model.number="number">
        <h2>number:{{number}} --- {{ typeof number }}</h2>

        <hr>

        <input type="text" v-model.trim="str">
        <h2>str:{{str}} --- {{ typeof str }}</h2>

        <hr>

        <!-- 多外修改符是可以连用的 -->
        <input type="text" v-model.lazy.number.trim="str">
        <h2>str:{{str}} --- {{ typeof str }}</h2>

    </div>

    <script>
        let vm = new Vue({
            el:"#app",
            data(){
                return {
                    msg:"I love Vue~",
                    // 数据  ==>  状态
                    number:0,
                    str:"hello vue"
                }
            }
        });
    </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
Last Updated: 12/25/2022, 10:02:14 PM