day2

1 vue.js事件处理

   我们可以用 v-on 指令绑定一个事件监听器,通过它调用我们 Vue 实例中定义的方法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <button @click="counter += 1">{{counter}}</button>
        <button v-on:click="cl">测试1</button>
        <button @click="c('b')">测试2</button>
    </div>
    <script>
        var v = new Vue({
            el:"#app",
            data:{
                counter:0,
            },
            methods:{
                cl:function(){
                    alert("aaaaaaaaaaaaaaaa");
                },
                c:function(b){
                    alert("aaaa"+b);
                }
            }
        })
    </script>
</body>
</html>

可以看到分别点击页面中的三个按钮,结果如上图所示。每点一下第一个按钮按钮上的数字就会加一;点第二三个按钮后会弹出一个警告框。

1.1 事件修饰符

  • stop 阻止冒泡
  • prevent 阻止默认事件
  • once 只触发一次
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
        <button v-on:click="cl">{{message1}}</button>
        <button v-on:click.once="c2">{{message2}}</button>
        <a href="http://cnblogs.com" target="_blank">普通链接</a>
          <a @click.prevent href="http://cnblogs.com" target="_blank">取消默认行为</a>

    </div>
    <script>
        var demo = new Vue({
            el:'#demo',
            data:{
                message1: "hello",
                message2: "hello",
                counter:0,
            },
            methods:{
                cl(){
                    this.message1 = this.message1 + ' vue!';
                },
                c2(){
                    this.message2 = this.message2 + ' vue!';
                },
            }
        })
    </script>    
</body>
</html>

可以发现点击‘取消默认行为’后无法条撞到对应的链接了,因为prevent可以阻止默认事件。

1.2 鼠标修饰符

  • left 左键
  • right 右键
  • middle 滚轮
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
  <div id="demo">
     <button @mouseup.right="right" @mouseup.middle="middle" @mouseup.left="left">{{message}}</button>
    </div>
    <script>
        var demo = new Vue({
            el:'#demo',
            data:{
                message: "hello",
               text:'点我'
            },
            methods:{
                left(){
                  this.message = 'left'
                },
                right(){
                  this.message = 'right'
                },
                middle(){
                  this.message = 'middle'
                },
            }
        })
    </script>
</body>
</html>

分别点击鼠标左键,右键和滚轮时,会触发不同的事件。

1.3 键值修饰符

在监听键盘事件时,我们经常需要监测常见的键值。 Vue 允许为 v-on 在监听键盘事件时添加关键修饰符。

  • .enter
  • .tab
  • .delete (捕获 “删除” 和 “退格” 键)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
        <button v-on:keyup.enter="enter">{{message}}</button>
        <button @keyup.tab="tab">{{message}}</button>
        <button @keyup="show($event)">{{message}}</button> <!--获取事件对象-->
    </div>
    <script>
        var demo = new Vue({
            el:'#demo',
            data:{
                message: "hello",
            },
            methods:{
                enter(){
                    this.message = 'enter'
                },
                tab(){
                    this.message = 'tab'
                },
                show(e){
                    this.message = e.keyCode
                }
            }
        })
    </script>    
</body>
</html>

当事件聚焦到相应的按钮上的时候,按下键盘上相应的键就会执行相应的结果

1.4 表单事件

   在进行表单提交时,页面会刷新,导致我们绑定的表单提交事件执行出问题,会避免刷新,我们需要使用阻止修饰符。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <form method="GET" action="https://www.hao123.com" v-on:submit.prevent="ff">
            <input type="submit" value="提交">
        </form>
    </div>
    <script>
        var v = new Vue({
            el:"#app",
            data:{
                message:"123"
            },
            methods:{
                ff(){
                    alert("abc")
                }
            }
        })
        
    </script>
</body>
</html>

加入了阻止修饰符后页面就不会跳转了

2 vue.js之条件渲染指令

2.1 v-if

   v-if主要用来进行条件渲染。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
        <p v-if="message">message</p>
        <p v-if="infor">infor</p>
    </div>
    <script>
        var demo1 = new Vue({
            el:'#demo',
            data:{
                message:true,
                infor:false
            },
        })
    </script>    
</body>
</html>

可以看到值为false时,页面中不会渲染

2.2 v-else和v-else-if

   我们可以使用 v-else 指令来表示 v-if 的“else 块”,v-else 元素必须紧跟在 v-if 或者 v-else-if 元素的后面——否则它将不会被识别。而v-else-if则是充当 v-if 的“else-if 块”,可以链式地使用多次。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <div v-if="message">aaaaaaaaaaaaaaa</div>
        <div v-if="info">bbbbbbbbbbbbbbbb</div>
        <div>{{type}}</div>
        <div v-if="type === 1">111111</div>
        <div v-else-if="type === 2">22222222</div>
        <div v-else>66666</div>
        <button @click="b">计算</button>
    </div>
    <script>
        var v = new Vue({
            el:"#app",
            data:{
                message:true,
                info:false,
                type:0,
            },
            methods:{
                b:function(){
                    if(this.type > 3){
                        this.type = 1
                    }else{
                        this.type++
                    }
                }
            }

        })
    </script>
</body>
</html>

在上面的例子中,通过点击事件改变了type的值,从而改变了页面元素的渲染。
注意:type的值改变后上面的判断结果也会跟着改变

2.3 用 key 管理可复用的元素

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
        <span v-if="loginType === 'username'">
         <label>Username</label>
         <input placeholder="Enter your username" >
     </span>
     <span v-else>
         <label>Email</label>
         <input placeholder="Enter your email address" >
     </span>
     <button v-on:click="test">切换</button>
    </div>
    <script>
        var demo1 = new Vue({
            el:'#demo',
            data:{
                loginType: 'username'
            },
            methods:{
                test:function(){
                    if(this.loginType != 'username'){
                        return this.loginType = 'username'
                    }
                    return this.loginType = 'email'
                }
            }
        })
    </script>        
</body>
</html>

   在上面的例子中,首先显示的是用户名输入框,点击切换后显示的邮箱输入框,一切都很正常。但是当我们在用户名输入框中输入相应内容后再点击切换,会发现我们刚刚输入的用户名出现在了邮箱处:

   之所以会出现这种情况,是因为Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做,除了使 Vue 变得非常快之外,还有一些有用的好处。所以,在上面的代码中切换 loginType 将不会清除用户已经输入的内容。因为两个模版使用了相同的元素,<input> 不会被替换掉——仅仅是替换了它的 placeholder。
   虽然这样能高效快速的渲染元素,但是又很多实际情况是不希望元素被复用的,要解决上面的问题,除了将元素再进行包裹外,Vue 还提供了一种方式来声明“这两个元素是完全独立的——不要复用它们”。只需添加一个具有唯一值的 key 属性即可:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
        <span v-if="loginType === 'username'">
         <label>Username</label>
         <input placeholder="Enter your username" key='username-input'>
     </span>
     <span v-else>
         <label>Email</label>
         <input placeholder="Enter your email address" key='email-input'>
     </span>
     <button v-on:click="test">切换</button>
    </div>
    <script>
        var demo1 = new Vue({
            el:'#demo',
            data:{
                loginType: 'username'
            },
            methods:{
                test:function(){
                    if(this.loginType != 'username'){
                        return this.loginType = 'username'
                    }
                    return this.loginType = 'email'
                }
            }
        })
    </script>        
</body>
</html>

这样就可以按照实际运用情况来处理不希望被复用的元素了,需要注意的时,在这里<label> 元素仍然会被高效地复用,因为它们没有添加 key 属性。

2.4 v-if和v-show

   v-show也是根据条件展示元素的指令。带有 v-show 的元素始终会被渲染并保留在 DOM 中。v-show 是简单地切换元素的 CSS 属性 display 。

  • v-if
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
        <p v-if="message">message</p>
        <p v-if="infor">infor</p>
    </div>
    <script>
        var demo1 = new Vue({
            el:'#demo',
            data:{
                message:true,
                infor:false
            },
        })
    </script>    
</body>
</html>
页面结构
  • v-show
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
        <p v-show="message">message</p>
        <p v-show="infor">infor</p>
    </div>
    <script>
        var demo1 = new Vue({
            el:'#demo',
            data:{
                message:true,
                infor:false
            },
        })
    </script>    
</body>
</html>
页面结构

   也就说,虽然第二个p元素没有显示出来,但是页面渲染时是存在的,只是多了一个隐藏属性。
   通过上面的例子,我们不难发现两者的不同:

  • v-if是真正的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
  • v-if是惰性的,只有当条件为true时才会渲染,如果条件为false则什么都不做
  • v-if有很高的切换开销,适用于条件不太容易改变的时候
  • v-show不管条件是true还是false都会进行渲染。并且只是简单地基于 CSS 进行切换
  • v-show有很高的初始渲染开销,适用于非常频繁地切换

3 vue.js之循环指令

   vue.js 的循环渲染是依赖于 v-for 指令,它能够根据 vue 的实例里面的信息,循环遍历所需数据,然后渲染出相应的内容。它可以遍历数组类型以及对象类型的数据,js 里面的数组本身实质上也是对象,这里遍历数组和对象的时候,方式相似但又稍有不同。

  • 对象遍历
    value 是遍历得到的属性值,key 是遍历得到的属性名,index 是遍历次序,这里的 key/index 都是可选参数,如果不需要,这个指令其实可以写成 v-for="value in me";
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
          <ul>   
              <li v-for="value in object">
                {{ value }}
              </li>
        </ul>
    </div>
    <script>
        var demo = new Vue({
            el:'#demo',
            data:{

                object: {
                      firstName: 'John',
                      lastName: 'Doe',
                      age: 30
                }
            }
        })
    </script>    
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
         <div  v-for="(value, key,index) in object">
         {{ index }} : {{ key }} : {{ value }}
        </div>
    </div>
    <script>
        var demo = new Vue({
            el:'#demo',
            data:{

                object: {
                      firstName: 'John',
                      lastName: 'Doe',
                      age: 30
                }
            }
        })
    </script>    
</body>
</html>
  • 数组遍历
    数组遍历和对象遍历相类似,最大的不同点在于对象的 “key” 和 “index” 是一致的,所以这里我们只需要取一个 index 即可。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
         <ul>
            <li v-for="(item, index) in items" v-on:click="onclick(index)">{{index}}:{{item}}</li>
        </ul>
    </div>
    <script>
        var demo = new Vue({
            el:'#demo',
            data:{
                items: ['apple', 'tomato', 'banana', 'watermelon']
            },
            methods:{
                onclick(index){
                    alert(index);
                }
            }
        })
    </script>    
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="demo">
        <ul>
             <li v-for="todo in items">
                    {{ todo.message}}   
              </li>
        </ul>
         <ul>
             <li v-for="(item, index) in items">
                    {{ parentMessage }} - {{ index }} - {{ item.message }}
              </li>
        </ul>
    </div>
    <script>
        var demo = new Vue({
            el:'#demo',
            data:{
                parentMessage: 'Parent',
               items: [
                      { message: 'Foo' },
                      { message: 'Bar' }
                ],
            }
        })
    </script>    
</body>
</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 1. Vue 实例 1.1 创建一个Vue实例 一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实...
    王童孟阅读 1,021评论 0 2
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,209评论 0 6
  • day2 自定义指令 参数说明 1.指令id可由程序员自行定义,注意和系统指令名称有所区别,例如:focus,在某...
    小浅_阅读 589评论 0 2
  • vue.js 从基础到实战 Vue.js 介绍 什么是vue vue一词是法语,同英语中的view。vue.js是...
    记忆的时间差阅读 2,214评论 1 25
  • 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: 实例生命周期钩子 每个 Vue 实例...
    Timmy小石匠阅读 1,380评论 0 11