Vue内部指令

1.v-if,v-else

v-if:是vue 的一个内部指令,指令用在我们的html中。v-if用来判断是否加载html的DOM,比如我们模拟一个用户登录状态,在用户登录后现实用户名称。
示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-if  v-else  v-show</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>v-if  v-else  v-show</h1>
    <hr>
    <div id="app">
        <div v-if="isLogin">登录成功</div>
        <div v-else>对不起你还没有登陆</div>
    </div>
    <script type="text/javascript">
        var app = new Vue({
            el:'#app',
            data:{
               isLogin:true
            }
        })
    </script>
</body>
</html>

因为在data对象中设置了isLogin:true,所以运行这个页面后会显示登陆成功,同样的如果改成isLogin:false,那么就会显示对不起你还没有登陆。

2.v-show

调整css中display属性DOM已经加载,只是CSS控制没有显示出来。例如:

<div v-show="isLogin">你好:JSPang</div>

注意v-if 和v-show的区别

  • v-if: 判断是否加载,可以减轻服务器的压力,在需要时加载。DOM不一定会加载。
  • v-show:调整css dispaly属性,可以使客户端操作更加流畅。DOM已经加载,只是被隐藏了。

3.v-for

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-for</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>v-for</h1>
    <hr>
    <div id="app">
        <ul>
            <li v-for="item in items">{{item}}</li>
        </ul>
        <hr>
        <ul>
            <li v-for="(student,index) in students">{{index}}:技术胖在{{student.age}}岁阶段的昵称是{{student.name}}</li>
        </ul>
    </div>
    <script type="text/javascript">
        var app = new Vue({
            el:'#app',
            data:{
                items:[
                    //"库里","汤普森","格林","伊戈达拉","杜兰特"
                    53,23,76,14,54,36,28
                ],
                students:[
                    {name:"Jspang",age:33,sex:"man"},
                    {name:"Panda",age:28,sex:"man"},
                    {name:"Panpan",age:33,sex:"man"},
                    {name:"King",age:13,sex:"man"},
                ]
            },
            computed:{
                items:function(){
                    return this.items.sort();
                }
            }
        })
    </script>
</body>
</html>

如果你想对数据进行排序等操作,可以使用computed方法,它会在数据渲染到页面上之前执行

computed:{
                items:function(){
                    return this.items.sort();
                }
            }

注意,Vue有一个数据保护机制,就是说如果你想对items里面的数据进行排序输出,上面的代码是错误的,为了保护data中的数据,这种机制不允许我们对items直接进行修改,需要重新定义变量并赋值,因此我们可以把items改成sortitems,当然在上面v-for中也要修改:

 <li v-for="item in sortitems">{{item}}</li>

这样改之后还是有一个小问题,但这不是Vue的BUG,所有javascript都有这个问题,就是上面的排序仅仅是根据第一位数字来排序的,就是说你把76改成7,它并没有到第一位去。因此还需要改进,可以自己自定义排序方法

function sortNumber(a,b){
            return a-b;
        }
computed:{
                sortitems:function(){
                    return this.items.sort(sortNumber);
                }
            }

对data中的students对象数组进行输出的语句如下,其中index就是索引,当然没有强制规定要用index。

<li v-for="(student,index) in students">{{index}}:技术胖在{{student.age}}岁阶段的昵称是{{student.name}}</li>

如果是数组对象排序:

...
<ul>
   <li v-for="(student,index) in sortStudents">{{index}}:技术胖在{{student.age}}岁阶段的昵称是{{student.name}}</li>
</ul>
...
sortStudents:function(){
      eturn sortByKey(this.students,'age');
}
...
//数组对象方法排序:
function sortByKey(array,key){
    return array.sort(function(a,b){
            var x=a[key];
            var y=b[key];
            return ((x<y)?-1:((x>y)?1:0));
     });
}
...

4.v-text,v-html

要在html中输出data中的值,我们一般用的是{{...}},但是这种情况也是有弊端的,就是当我们网速很慢或者javascript出错时,会暴露我们的{{xxx}}。因此v-text就可以用来解决这个问题。代码如下:

<span>{{message}}</span>
<span v-text="message"></span>

又例如当变量值中还含有HTML标签时dodo:'<h2>hello world</h2>',用{{}}的方式输出会把标签当作字符串给输出,这并不符合我们的要求,这个时候就需要用到v-html,代码如下:

<span>{{dodo}}</span><br/>
//{{}}方法
<span v-html="dodo"></span>
//v-html方法

但是在实际的项目开发中,v-html方法的安全性不够容易引起黑客的攻击,除非在保证页面安全的情况下,才能使用,尽量还是减少使用或者使用其他可以提高代码安全性的方法

5.v-on

v-on就是监听事件,可以用v-on指令监听DOM事件触发javascript代码
v-on实例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-on</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>v-on</h1>
    <hr>
    <div id="app">
        本场得分:{{score}}
        <p>
            <button v-on:click="faqiu">罚球加1分</button>
            <button v-on:click="zhongtou">中投加2分</button>
            <button v-on:click="sanfen">三分加3分</button>
            <button @click="jianfen">殴打裁判减1分</button><br/>
            <input type="text" v-on:keyup.enter="onEnter" v-model="addscore">
        </p>
    </div>
    <script type="text/javascript">
        var app = new Vue({
            el:'#app',
            data:{
                score:0,
                score2:1
            },
            methods:{
                faqiu:function(){
                    this.score+=1;
                },
                zhongtou:function(){
                    this.score+=2;
                },
                sanfen:function(){
                    this.score+=3;
                },
                jianfen:function(){
                    this.score-=1;
                },
                onEnter:function(){
                    this.score=this.score+parseInt(this.addscore);
                     //强制转换Int类型
                }
            }
        })
    </script>
</body>
</html>

其中,绑定用到的方法写在method里面,v-on:可以用@来代替,另外在input框中的v-on:keyup.enter="onEnter"中的enter代表着回车键,整句话也就是按下键盘回车键响应,当然enter可以用数字13来代替,下面是键盘的键值表(来源于网络):

键盘键值表

6.v-model

v-model绑定数据源指令,就是把数据绑定在特定的表单元素上,可以很容易的实现双向数据绑定。所谓双向数据绑定就是,通过v-model既能获得input框中的内容,又能将input框中的内容设置为v-model的值
示例代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-model</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>hello world</h1>
    <hr>
    <div id="app">
        <p>原始文本信息:{{message}}</p>
        <h3>文本框</h3>
        <p>v-model:<input type="text" v-model="message"></p>
        <p>v-model.lazy:<input type="text" v-model.lazy="message"></p>
        <p>v-model.number:<input type="text" v-model.number="message"></p>
        <p>v-model.trim:<input type="text" v-model.trim="message"></p>
        <hr>
        <h3>文本域</h3>
        <textarea cols="30" rows="10" v-model="message"></textarea>
        <hr>
        <h3>多选框绑定一个值</h3>
        <input type="checkbox" id="isTrue" v-model="isTrue">
        <label for="isTrue">{{isTrue}}</label>
        <hr>
        <h3>多选框绑定数组</h3>
            <p>
                <input type="checkbox" id="Curry" value="Curry" v-model="player_names">
                <label for="Curry">Curry</label>
                <input type="checkbox" id="Thompson" value="Thompson" v-model="player_names">
                <label for="Thompson">Thompson</label>
                <input type="checkbox" id="Durant" value="Durant" v-model="player_names">
                <label for="Durant">Durant</label>
            </p>
            <p>
                {{player_names}}
            </p>
        <hr>
        <h3>单选框绑定</h3>
        <p>
            <input type="radio" id="man" value="男" v-model="sex">
            <label for="man">男</label>
            <input type="radio" id="woman" value="女" v-model="sex">
            <label for="woman">女</label>
        </p>
        <p>你的性别是{{sex}},对吗?</p>
    </div>
    <script type="text/javascript">
        var app = new Vue({
            el:'#app',
            data:{
                message:"Hello World",
                isTrue:true,
                player_names:[],
                sex:'男'
            }
        })
    </script>
</body>
</html>

其中v-model="message"就是数据源绑定指令,
下面介绍一下v-model的三个修饰符:

  • v-model.lazy="message":加上了lazy属性之后,在文本框改变值,原始文本信息处不会改变,只有当我们鼠标焦点离开文本框时才会发生改变。如下图:

    v-model.lazy演示

  • v-model.number="message":当先输入数字再输入字母时,原始文本信息框不会被双向绑定。其它像先输入字母再数字,先字母再数字再字母都能正常双向绑定。如下图:

    v-model.number演示

  • v-model.trim="message"去掉前后的空格,具体效果如下图:

    v-model.trim演示

另外,关于文本域,多选框绑定一个值,多选框绑定数组,单选框绑定等这些的运行结果以及演示如下图:


v-model其它应用演示

7.v-bind

v-bind用来绑定标签上的属性值,包括src,url,class,style等等
示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>v-bind</title>
    <script type="text/javascript" src="../assets/js/vue.js"></script>
</head>
<body>
    <h1>v-bind</h1>
    <hr>
    <div id="app">
        <p><img v-bind:src="imgSrc"/></p>
        <p><a :href="webUrl" target="_biank">百度</a></p>
        <hr>
        <div :class="className">1.绑定Class</div>
        <div :class="{classA:isOK}">2.绑定Class中的判断</div>
        <div :class="[classA,classB]">3.绑定Class中的数组</div>
        <div :class="isOK?classA:classB">3.绑定Class中的三元运算符</div>
        <hr>
        <div>
            <input type="checkbox" id="isOK" v-model="isOK"/>
            <label for="isOK">isOK={{isOK}}</label>
        </div>
        <hr>
        <div :style="{color:red,fontSize:font}">5.绑定style属性</div>
        <div :style="styleObject">5.绑定style整个对象</div>
    </div>
    <style>
        .classA {
            color:red;
        }
        .classB {
            font-size: 150%;
        }
    </style>
    <script type="text/javascript">
        var app = new Vue({
            el:'#app',
            data:{
                imgSrc:"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1587446420529&di=c4de567967c1c44964c47460f3de1f5a&imgtype=0&src=http%3A%2F%2Fp2.ifengimg.com%2Fweb%2F2017_23%2Ffb591b2c273c135_w300_h300.jpg",
                webUrl:"http://www.baidu.com",
                className:"classA",
                isOK:true,
                classA:"classA",
                classB:"classB",
                red:"red",
                font:"20px",
                styleObject:{
                    color:"green",
                    fontSize:"24px"
                }
            }
        })
    </script>
</body>
</html>

最终实现效果如下:


v-bind演示

图片的地址可以自己找一个短一点的,这里我也是随便找的,上面的代码中通过data中的某个值来判断特定的地址是什么,特定的属性是否要添加上去等等。另外还有一个注意避免踩坑💣💥的点:在Vue中,class样式的属性名不支持-,例如font-size这样的写法是会报错的,必须写成fontSize

8.v-pre,v-cloak,v-once

先上代码(部分代码,其它的都跟helloworld.html一样,懒得复制了不然文章太长le🙄🙄🙄):

...
<div id="app">
        <span>{{message}}</span>
        <span v-text="message"></span>
![v-once.gif](https://upload-images.jianshu.io/upload_images/21727303-74ff5eadbca76478.gif?imageMogr2/auto-orient/strip)
        <span v-pre>{{message}}</span>
        <span v-cloak>
            渲染完成后才显示
        </span>
        <div v-once>{{message}}</div>
        <div><input type="text" v-model="message"/></div>
        <div>{{message}}</div>
    </div>
...

页面实现效果如下:


v-once演示

1.v-pre

作用:输出标签中的文本内容,不取data中的值,也就是原模原样输出{{message}}。

2.v-cloak

作用:渲染完成后才显示,不过渲染速度很快这里看不出来,知道原理就行。

3.v-once

作用:只渲染一次,避免后面当改变message时同步发生变化。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 内部指令 v-text 读取文本不能读取html标签,解析文本使用{{XXX}}这种情况是有弊端的,当我们网速...
    九瀺阅读 230评论 0 0
  • 指令( Directives )是 Vue 模板中最常用的一项功能,它带有前缀 v-,能帮我们快速完成DOM操作,...
    苦瓜_6阅读 295评论 0 0
  • 1.v-if/v-else/v-show 2.v-for 3.v-text/v-html 4.v-on监听事件绑定...
    PZcoder阅读 147评论 0 0
  • 本节知识点 内部知识点汇总 内部指令 v-if="xxx" v-else v-for="(内容,序号) in 数组...
    我拥抱着我的未来阅读 205评论 0 0
  • 五格数理 笔画数以康熙字典笔画为准!大家可以下载康熙字典!仅供参考,不能作为唯一。 五格数理(81数理)是日本人熊...
    姜明江阅读 5,156评论 0 2