Vue.js常用指令及事件修饰符介绍(二)

Vue常用指令

其他基础指令

Vue.js基础介绍及部分指令

v-model

用法:在表单控件或者组件上创建双向绑定。

v-model和v-bind之间的区别:
两者都可以绑定数据,但是v-bind指令只能是实现数据的单向绑定,即从M层自动绑定到V层,无法实现双向绑定,v-model指令可实现表单元素和M层中数据的双向绑定。

<div id="app">
<!-- v-model指令 -->
    <input type="text" name="" v-model='msg' id="">
    <p>{{msg}}</p>

</div>
<script>
    var vm=new  Vue({
        el:'#app',
        data:{
            msg:'爱吃烧烤、炸鸡、小龙虾'
        },
        methods: {
            
        },
    })
</script>

原始效果是这样:
在这里插入图片描述

当我们点击input框进行修改里面的数据时,发现只有在修改v-model指令绑定的数据框时,p标签中的{{msg}}才会跟着改变

在这里插入图片描述

利用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>
    <!-- 可以使用cdn链接 -->
    <script src="lib/vue-2.4.0.js"></script>
</head>
<body>
    <div id="app">
        <input type="text" name="" v-model='n1' id="">
        <select v-model='opt'>
            <option value="+">+</option>
            <option value="-">-</option>
            <option value="*">*</option>
            <option value="/">/</option>
        </select>
        <input type="text" name="" v-model='n2' id="">
        <input type="button" value="=" @click='calc'>

        <input type="text" name="" v-model='result' id="">
    </div>
    <script>
        // 创建vue实例 得到ViewModel
        new Vue({
            el:'#app',
            data:{
            //初始值为0 符号为+
                n1:0,
                n2:0,
                opt:'+',
                result:0
            },
            methods: {
            //计算的方法
                calc(){
                    switch (this.opt) {
                        case '+':
                            this.result=parseInt(this.n1)+parseInt(this.n2)
                            break;
                        case '-':
                            this.result=parseInt(this.n1)-parseInt(this.n2);
                            break;
                        case '*':
                            this.result=parseInt(this.n1)*parseInt(this.n2);
                            break;
                        case '/':
                            this.result=parseInt(this.n1)/parseInt(this.n2);
                            break;
                        default:
                            break;
                    }
                }
            },
        })
    </script>
</body>
</html>

利用指令添加CSS样式

第一种方法:直接传递一个数组(数组中存放类名)

<style>
    .red{
        color: red;
    }
    .thin{
        font-weight: 200;
    }
    
    .active{
        letter-spacing: 0.5em;
    }
</style>
<div id="app">
    <h1>这是一个标题标签,功能很强大</h1>
    <h1 :class="['thin','italic']">这是一个标题标签,功能很强大</h1>
</div>
<script>
    new Vue({
        el:'#app',
        data:{
        }
    })
</script>

需要注意的是,此时的class类需要v-bind指令绑定

在这里插入图片描述

第二种方法:在数组中使用三元表达式

<style>
    .red{
        color: red;
    }
    .thin{
        font-weight: 200;
    }
    
    .active{
        letter-spacing: 0.5em;
    }
</style>
<div id="app">
    <h1>这是一个标题标签,功能很强大</h1>
    <h1 :class="['thin','italic',flag?'active':'']">这是一个标题标签,功能很强大</h1>
</div>
<script>
    new Vue({
        el:'#app',
        data:{
        flag:true
        }
    })
</script>

在这里插入图片描述
第三种方法:数组中使用对象代替三元表达式,可提高代码可读性

<style>
    .red{
        color: red;
    }
    .thin{
        font-weight: 200;
    }
    
    .active{
        letter-spacing: 0.5em;
    }
</style>
<div id="app">
    <h1>这是一个标题标签,功能很强大</h1>
    <h1 :class="['thin','italic',{'active':flag}]">这是一个标题标签,功能很强大</h1>

</div>
<script>
    new Vue({
        el:'#app',
        data:{
        	flag:true
        }
    })
</script>

第四种方法:使用v-bind绑定一个对象

<style>
    .red{
        color: red;
    }
    .thin{
        font-weight: 200;
    }
    
    .active{
        letter-spacing: 0.5em;
    }
</style>
<div id="app">
    <h1>这是一个标题标签,功能很强大</h1>
     <h1 :class="classObj">这是一个标题标签,功能很强大</h1>


</div>
<script>
    new Vue({
        el:'#app',
        data:{
        	flag:true,
        	classObj:{
                red:true,
                thin:true,
                italic:true,
                active:false
            }
        }
    })
</script>

在这里插入图片描述
第五种方法:直接绑定style标签,同样以数组方式传递,数组中为类名

<div id="app">
    <h1>这是一个h1标签</h1>
    <h1 :style="styleObj1">这是一个h1标签</h1>
    <h1 :style="[styleObj1,styleObj2]">这是一个h1标签</h1>
</div>
<script>
    new Vue({
        el:'#app',
        data:{
            styleObj1:{
                color:'red',
                'font-weight':200
            },
            styleObj2:{
                'font-style':'italic'
            }
        }
    })
</script>

在这里插入图片描述

v-for

用法:基于源数据多次渲染元素或模板块。
此指令之值,必须使用特定语法 alias in expression,为当前遍历的元素提供别名:

<div id="app">
    <p v-for='(val,key,i) in user'>
        值:{{val}}
        键:{{key}}
        索引:{{i}}
    </p>
</div>
<script>
    new Vue({
        el:'#app',
        data:{
            user:{
                id:1,
                name:'托尼老师',
                gender:'男'
            }
        }
    })
</script>

效果:

在这里插入图片描述

  • alias中有三个参数时,分别代表值、键、索引
  • alias中有两个参数时,分别代表值、索引
  • alias中有一个参数时,会输出所有数据

in后面可以放普通的数组、对象数组、对象、也可以放数字

<div id="app">
    <p v-for='count in 10'>
        {{count}}
    </p>
</div>
<script>
    new Vue({
        el:'#app',
        data:{
        }
    })
</script>

在这里插入图片描述

注意事项

如果使用v-for 有问题 在使用v-for的同时,指定唯一的字符串或者数字类型:key值

  • key在使用的时候 必须使用v-bind指令绑定的形式 指定key的值
  • v-for循环的时候, key属性只能使用 Number或者String类型

v-if 与 v-show

v-if用法:根据表达式的值的 truthiness 来有条件地渲染元素。在切换时元素及它的数据绑定 / 组件被销毁并重建。如果元素是 template,将提出它的内容作为条件块。
v-show用法:根据表达式之真假值,切换元素的 display CSS property。

<div id="app">
    <input type="button" value="toggle" @click='flag=!flag'>


    <h3 v-if='flag'>这是用v-if控制的元素</h3>
    <h3 v-show='flag'>这是用v-show控制的元素</h3>
    
</div>
<script>
    new Vue({
        el:'#app',
        data:{
            flag:false
        },

    })
</script>

当我们点击toggle按钮时,显示元素
在这里插入图片描述
再次点击时,隐藏该元素
在这里插入图片描述

两者之间的区别

  1. v-if的特点:每次都会重新删除或者创建元素
    v-show的特点 :每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none的样式
  2. v-if 有较高的切换性能消耗 v-show有较高的初始渲染消耗
  3. 如果元素涉及到频繁的切换,最好不要使用v-if,而是推荐v-show
    如果元素可能永远也不会被显示出来 被用户看到,则推荐 v-if

事件修饰符

  • .stop:等同于JavaScript中的event.stopPropagation(),防止事件冒泡
  • .prevent:等同于JavaScript中的event.preventDefault(),防止执行预设的行为(如果事件可取消,则取消该事件,而不停止事件的进一步传播)
  • .capture:与事件冒泡的方向相反,事件捕获由外到内
  • .self:只会触发自己范围内的事件,不包含子元素
  • .once:只会触发一次

.stop 防止事件冒泡

冒泡事件:嵌套两三层父子关系,然后所有都有点击事件,点击子节点,就会触发从内至外(子节点---->父节点)的点击事件

<div id="app">
    <div class="inner" @click='divHandler'>
        <input type="button" value="戳他" @click.stop='btnHandler'>
    </div>

</div>
<script>
    // 创建vue实例
    var vm= new Vue({
        el:'#app',
        data:{
            
        },
        methods: {
            divHandler(){
                console.log('点击了父元素div');
            },
            btnHandler(){
                console.log('点击了子元素input');
            },
        },
    })
</script>

未添加.stop事件修饰符时,点击按钮
在这里插入图片描述
添加.stop事件修饰符时,点击按钮
在这里插入图片描述

.prevent 阻止默认行为

点击超链接a标签会直接跳转至其他页面,但是添加.prenvent事件修饰符之后,会阻止它跳转

<div id="app">
    <div class="inner" @click='divHandler'>
        <input type="button" value="戳他" @click.stop='btnHandler'>
        <!-- 阻止默认和阻止事件冒泡 -->
        <a href="http://www.baidu.com" @click.prevent.stop='linkClick'>有问题,找百度</a>
    </div>

</div>
<script>
    // 创建vue实例
    var vm= new Vue({
        el:'#app',
        data:{
            
        },
        methods: {
            divHandler(){
                console.log('点击了父元素div');
            },
            btnHandler(){
                console.log('点击了子元素input');
            },
            linkClick(){
                console.log('点击了超链接a');
            }

        },
    })
</script>

在这里插入图片描述

.capture 捕获事件

捕获事件:嵌套两三层父子关系,然后所有都有点击事件,点击子节点,就会触发从外至内(父节点---->子节点)的点击事件

<div id="app">
    <div class="inner" @click.capture='divHandler'>
        <input type="button" value="戳他" @click='btnHandler'>
    </div>

</div>
<script>
    // 创建vue实例
    var vm= new Vue({
        el:'#app',
        data:{
            
        },
        methods: {
            divHandler(){
                console.log('点击了父元素div');
            },
            btnHandler(){
                console.log('点击了子元素input');
            },

        },
    })
</script>

在这里插入图片描述

.self

只会阻止自己身上冒泡行为的触发, 并不会正真的阻止冒泡行为,即只会触发自己范围内的事件,不会包含子元素。

    <style>
        .outer{
            border: 2px solid black;
            width: 100px;
            height: 100px;
        }
        .middle{
            border: 2px solid red;
            width: 50px;
            height: 50px;
            margin: 0 auto ;
            
        }

    </style>
<div id="app">

       <div class="outer" @click.self="divHandler">
        <div class="middle" @click.self="div">
            <button @click.stop="btnHandler">戳他</button>
          </div>
      </div>
<script>
    // 创建vue实例
    var vm= new Vue({
        el:'#app',
        data:{
            
        },
        methods: {
            divHandler(){
                console.log('点击了父元素div');
            },
            div(){
                console.log('点击了中间div')
            },
            btnHandler(){
                console.log('点击了子元素btn');
            },


        },
    })
</script>

在这里插入图片描述

.once

如果我们在@click事件上添加.once修饰符,只要点击按钮只会执行一次。比如点击a标签,只会跳转一次,再次点击不会执行事件。

<div id="app">
    <!-- 使用.once只触发一次事件处理函数 -->
    <a href="http://www.baidu.com" @click.prevent.once='linkClick'>有问题,找百度</a>
</div>
<script>
    // 创建vue实例
    var vm= new Vue({
        el:'#app',
        data:{
            
        },
        methods: {

            linkClick(){
                console.log('点击了超链接a');
            }

        },
    })
</script>

框架和库的区别

框架是一套完整的解决方案,对项目的入侵性比较大,项目如果需要更换框架,则需要重新架构整个项目
比如nodeJS 中的 Express 、koa2

库(插件): 提供某一个小的功能,对项目的入侵性比较小,如果某个库无法完成需求,可以很容易的切换其他的库
query===>Zepto
EJS 切换到 art-template

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值