常见 Vue.js 指令1

Vue.js 指令

什么是 Vue.js 指令

指令是带有 v- 前缀的特殊属性

Vue.js 指令的用途

它们作用于HTML元素,指令提供了一些特殊的特性,将指令绑定在元素上时,指令会为绑定的目标元素添加一些特殊的行为,我们可以将指令看作特殊的HTML属性(attribute)。

Vue.js 指令的书写规范

书写位置:任意 HTML 元素的开始标签内
注意:一个开始标签内可写入多个指令,多个指令间使用空格分隔

小结

  1. 指令概念:带有 v- 前缀的特殊属性
  2. 指令的用途:给元素添加特殊功能
  3. 书写位置:任意 HTML 元素的开始标签内

常见 Vue.js 指令

1. v-model 指令

  1. 作用:主要是用于表单上数据的双向绑定
  2. 语法:v-model = 变量
    注:v-model 指令必须绑定在表单元素上
    双向绑定
    Vue框架核心的功能就是双向的数据绑定。 双向是指:HTML标签数据 绑定到 Vue对象,另外反方向数据也是绑定的
    使用 v-model 指令来实现双向数据绑定 把视图数据与模型数据相互绑定
    代码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>v-model</title>
</head>
<body>
    <div id="demodiv">
      <!--   v-model指令,主要完成双向的绑定,数据的模型发生改变,视图随之发生改变,
        视图的数据改变了,模型的数据也随之改变 -->
        <input type="text" v-model="inputtext">
        <p>{{inputtext}}</p>
    </div>
</body>
</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el:"#demodiv",
        data:{
            inputtext:"你的名字"
        }
    })
</script>
双向绑定–原理数据劫持
  1. vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的
  2. 数据劫持:当我们访问或设置对象的属性的时候,都会触发Object.defineProperty()函数拦截(劫持),然后在返回(get)设置(set)对象的属性的值。并且当数据发生改变的时候做出反应。
双向绑定–原理发布者-订阅者模式
  1. vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的
  2. 发布者-订阅者模式:其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。

2. v-show 指令

  1. 作用:控制切换一个元素的显示和隐藏
  2. 语法:v-show = 表达式

根据表达式结果的真假,确定是否显示当前元素
true表示显示该元素,false(默认)表示隐藏该元素
元素一直存在只是被动态设置了display:none
代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="demodiv">
       <!--  v-show 指定控制元素的显示或者隐藏,true显示,false隐藏,
        v-show使用css的display来控制元素的显示和隐藏 -->  
        <p v-show="true">{{text}}</p>
        <p v-model="ckbool">{{ckbool?"你好":""}}</p>
        <input type="checkbox" v-model="ckbool">{{ckbool?"我被勾选了":"我被取消了"}}
        <h1 v-show="ckbool">控制我的显示</h1>
    </div>
</body>
</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el:"#demodiv",
        data:{
            text:"你好",
            ckbool:true
        }
    })
</script>

3. v-on 指令

  1. 作用:为 HTML 元素绑定事件监听
  2. 语法:v-on:事件名称=‘函数名称()’
  3. 简写语法:@事件名称=‘函数名称()’
    注:函数定义在 methods 配置项中
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>v-on</title>
</head>
<body>
    <div id="demodiv">
        <input type="button" value="点我弹出弹出框" v-on:click="fun()">
    </div>
</body>
</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el:"#demodiv",
        data:{
            text:"你好,么么哒"
        },
        methods: {
            fun(){
                //this指向vue的实例
                alert(this.text)
            }
        }
    })
    
</script>

使用 v-show、v-on、v-model 指令的小练习

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="demodiv">
        <p @click="fun()">{{text}}</p>
        <input type="text" v-model="text" v-show="bool">
    </div>
</body>

</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el:"#demodiv",
        data:{
            text:"hello word",
            bool:false
        },
        methods: {
            fun(){
                this.bool=!this.bool,
                this.text="hello word"
            }
        }
    })
</script>

4. v-for 指令

  1. 作用:遍历data中的数据,并在页面中展示
  2. 语法:v-for = ‘(item, index) in arr’
    item 表示每次遍历得到的元素
    index 表示item的索引,可选参数
    代码:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">
</head>

<body>
    <div id="demodiv">
        <!-- v-for 指定用来便利数据    v 就是便利出来的值   i就是便利出来的下标 -->
        <ul>
            <li v-for="(v,i) in arr">{{arr[i]}}</li>
            <li v-for="(v,i) in arr">{{v}}</li>
        </ul>
        
        <table class="table table-bordered table-hover">
            <thead>
                <tr>
                    <th>姓名</th>
                    <th>年龄</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(v,i) in obj">
                    <td>{{v.name}}</td>
                    <td>{{obj[i].age}}</td>
                </tr>
            </tbody>
        </table>
        
    </div>
</body>

</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el: "#demodiv",
        data: {
            arr: [1, 2, 3, 4, 5],
            obj: [
                {
                    name: "haha1",
                    age: 12
                },
                {
                    name: "haha1",
                    age: 12
                },{
                    name: "haha1",
                    age: 12
                },{
                    name: "haha1",
                    age: 12
                },{
                    name: "haha1",
                    age: 12
                }
            ]
        },
    })
</script>

5. v-bind 指令

  1. 作用:绑定HTML元素的属性
  2. 语法:v-bind:属性名 = ‘表达式’/ 简写 :属性名=‘表达式’
    绑定一个属性:< img v-bind:src=‘myUrl’ />
    *绑定多个属性(不能使用简写)====:< img v-bind=’{src:myUrl, title: msg}’ />*
    代码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .red{
            color:red;
        }
    </style>
</head>
<body>
    <div id="demodiv">
        <!-- v-bind可以缩写为: -->
        <a v-bind:class="isRed" :href="ahref">{{text}}</a>
        <div :class="{ red: isRed }"></div>
    </div>
</body>
</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el:"#demodiv",
        data:{
            ahref:"http://www.baidu.com",
            text:"百度一下下",
            isRed:"red"
        }
    })
</script>

6. v-if指令

  1. 作用:判断是否加载固定的内容
  2. 语法:v-if = 表达式
    根据表达式结果的真假,确定是否显示当前元素
    true表示加载该元素;false表示不加载该元素
    元素的显示和隐藏 是对Dom元素进行添加和删除
    代码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="demodiv">
        <input type="checkbox" v-model="bool">{{bool?"勾选了":"取消了"}}
        <h1 v-if="bool">{{title}}</h1>
    </div>
</body>
</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el:"#demodiv",
        data:{
            bool:true,
            title:"设置我的隐藏和显示"
        }
    })
</script>
v-show与v-if区别
  1. v-if有更高的切换消耗(安全性高)
  2. v-show有更高的初始化的渲染消耗(对安全性无要求选择)

7. v-else 指令

  1. 作用:必须配合v-if使用否则无效。当v-if条件不成立的时候执行
    代码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>v-else</title>
</head>
<body>
    <div id="demodiv">
        <input type="checkbox" v-model="bool">
        <p v-if="bool">我是v-if</p>
        <p v-else>我是v-else</p>
    </div>
</body>
</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el:"#demodiv",
        data:{
            bool:true
        }
    })
</script>

8. v-else-if 指令

  1. 作用:当有一项成立时执行。
    代码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>v-else-if</title>
</head>
<body>
    <div id="demodiv">
        <select v-model="text">
            <option value="苹果1">苹果1</option>
            <option value="苹果2">苹果2</option>
            <option value="苹果3">苹果3</option>
            <option value="苹果4">苹果4</option>
            <option value="苹果5">苹果5</option>
            <option value="苹果6">苹果6</option>
        </select>
        <h1 v-if="text=='苹果1'">选择苹果1</h1>
        <h1 v-else-if="text=='苹果2'">选择苹果1</h1>
        <h1>选择苹果1</h1>
        <h1>选择苹果1</h1>
        <h1>选择苹果1</h1>
        <h1>选择苹果1</h1>
        <h1>啥都没选.</h1>
    </div>
</body>
</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el:"#demodiv",
        data:{
            text:""
        }
    })
</script>

9. v-text指令和v-html指令

v-text指令
  1. 作用:操作网页元素中的纯文本内容。{{}}是他的简写
v-html指令
  1. 作用:双大括号会将数据解释为纯文本,而非 HTML 。为了输出真正的 HTML ,你需要使用 v-html 指令
  2. 语法:< p v-html=“text”>< /p>

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>v-text和v-html</title>
</head>
<body>
    <div id="demodiv">
        <p v-text="text"></p>
        <p v-html="texthtml"></p>
    </div>
</body>
</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el:"#demodiv",
        data:{
            text:"你好,Vue",
            texthtml:"<b>我是Vue</b>"
        }
    })
</script>

10. v-once 指令

  1. 作用:当数据改变时,插值处的内容不会更新(会影响到该节点上的所有属性)
  2. 语法:< p v-once>{{text}}< /p>
    代码:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

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

</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el: "#demodiv",
        data: {
            text:"我是Vue"
        }
    })
</script>

小结

  1. v-show:控制切换一个元素的显示和隐藏
  2. v-on:为 HTML 元素绑定事件监听
  3. v-model:将用户的输入同步到视图上
  4. v-for :遍历 data 中的数据,并在页面进行数据展示
  5. v-bind:绑定 HTML 元素的属性

案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">
    <style>
        .red {
            background-color: red;
        }
    </style>
</head>

<body>
    <!-- 1。基本的数据展示使用v-for -->
    <!-- 2.点谁谁变色 -->
    <!-- 2-1需要有一个变量来保存当前的内容是否要变色 需要在数据中声明一个变量来保存当前这个内容的 颜色是否改变 -->
    <!-- 2-2  并且在li中 使用v-bind 动态的绑定class-->
    <!-- 2-3 添加点击事件 并且让程序知道我点的是谁 -->
    <!-- 3.计算总价 可以根据数据的style来完成 -->
    <div id="demodiv">
        <h1>水果价格计算low爆版</h1>
        <table class="table table-bordered">
            <thead>
                <tr>
                    <th>水果</th>
                    <th>价格</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(v,i) in obj" v-bind:class="v.style?'red':''" v-on:click="fun(i)">
                    <td>{{v.title}}</td>
                    <td>{{v.pic}}</td>
                </tr>
            </tbody>
        </table>
        <p>共计:{{toto}}元</p>
    </div>
</body>

</html>
<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
    new Vue({
        el: "#demodiv",
        data: {
            obj: [{
                    title: "苹果",
                    pic: 5,
                    style: false
                },
                {
                    title: "香蕉",
                    pic: 6,
                    style: false
                },
                {
                    title: "菠萝",
                    pic: 4,
                    style: false
                },
                {
                    title: "葡萄",
                    pic: 8,
                    style: false
                },
                {
                    title: "甘蔗",
                    pic: 9,
                    style: false
                },
                {
                    title: "槟榔",
                    pic: 10,
                    style: false
                },
            ],
            toto:0
        },
        methods: {
            fun(i) {
                this.obj[i].style = !this.obj[i].style,
                this.toto = this.obj[i].style?this.toto+this.obj[i].pic:this.toto-this.obj[i].pic;
            }

        }
    })
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值