Loading

Vue.js------------------4vue指令

Vue指令

一挂载:

就像linux一样,硬盘是不允许直接操作而是给一个挂载点,你才能间接操作,vue一个意思。

一般是一个html区域,用div划分,挂载一个vue对象

可以发现,你根本不需要操作dom,vue将module和view进行了双向绑定,一旦View和Module有一个地方改动,vue都可以感知

然后通知另一方做出调整。

只需要------1:声明好data

     2:声明好view

        3:声明好vue对象

等等,反正只需要声明。

 

二:指令

指令:命令vue去做什么。

指令的形式:v-if   v-show为例

都是用来控制标签的隐藏和显示

v-if条件渲染

<p v-if="seen">条件徐</p>

后面跟的是变量,到绑定对象里面找此变量的bool值,true则渲染,反之不渲染。

这里要注意,这是前端渲染,与后端渲染有着本质区别。

前端渲染是js想怎么改就怎么改,不经过后端,就如条件渲染,直接将seen改为false,立刻就不渲染p标签。

后端徐然没有办法在不刷新页面的情况下又更新内容的,后端渲染必须重新发送请求,后端才会根据请求返回一个新的页面内容。

v-if隐藏标签后,会用注释代替,目的是告诉vue,这部分被我吃了,我怕你不知道,放个注释占个地方给你提醒。

v-show隐藏后,只是display:none,dom元素还是存在的,而v-if直接dom元素删除了。

语法

v-if/v-show="expression"

expression的结果为true,此标签就显示,为false就不显示。

v-else

只有v-if的话许多的逻辑无法处理

v-else找最近的v-if,如果上面还有一个v-else,在就继续找前面的v-if

v-else后面没有任何表达式,二者互斥总会显示一个,一定要注意二者中间不能有其他元素,必须跟在v-if或者v-show之后否则不起作用

<p v-if="showP">Hello Vue</p>
 <p v-else>Good Bye Vue</p>
View Code

v-else-if

用于 if  elseif  elseif  else的逻辑块中使用

例如:判断年龄时使用,跟逻辑表达式也可以。

<div id="app">
    <div v-if="type === 'A'">
      A
    </div>
    <div v-else-if="type === 'B'">
      B
    </div>
    <div v-else-if="type === 'C'">
      C
    </div>
    <div v-else>
      Not A/B/C
    </div>
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    type: 'C'
  }
View Code

v-show用法与v-if大致相同

区别在于,v-show的工作过程不同,v-show开始工作时,当后面的bool值为false,就像本标签的display属性值改为none。

开销低于v-if,因为v-if是直接将标签元素从dom中删掉,反复切换的话性能很低,要反复的渲染dom。

第一次打开页面如果v-if后面是false,那么连渲染都不渲染。

v-show无论bool值是什么,都会熏染在dom上,如果反复需要切换内容时,用v-show性能较好,因为dom没动,动的只是属性。

三:v-for

列表渲染,可以循环数组,可以循环json对象,二者无区别

<!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="../bower/bower_components/vue/dist/vue.min.js"></script>
</head>
<body>
    <div id="app">
        <ul>
            <li v-for="val in array">{{val}}</li>
        </ul>
        <ul>
            <li v-for="(val,index) in array">val={{val}},index={{index}}</li>
        </ul>
        <!-- 循环json,默认拿的value -->
        <ul>
            <li v-for="val in json">{{val}}</li>
            <li v-for="(val,key,index) in json">key={{key}},val = {{val}},index={{index}}</li>
        </ul>
    </div>

    <script >
        var m = {
            array : ["北京","shanghai","shandong"],
            json: {
                name: "zhansgan",
                age: 18,
                school: "weihaiyizhong"
            }
        };
        var vm = new Vue({
            el: "#app",
            data: m,
            methods: {

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

 

写在谁身上就循环谁,可见指令后面的字符串仿佛代码,其实vue拿到字符串就是类似去执行了exec方法

四:v-model

用于控件和model的双向绑定,前面做的基本是拿控件触发事件调用函数去改变data

v-model是将控件里面的value与data底层的变量的值进行了绑定。

底层data变了,那么控件的value也变

控件的value值被用户动了,底层data也会改变,假如还是加空间+事件来控制的话会很麻烦

v-model将控件的value底层的data绑定起来

原来要在代码里面产生一个html标记以及类似的东西,现在全部扔到了html当中,用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="../bower/bower_components/vue/dist/vue.min.js"></script>
</head>
<body>
    
    <div id="app">
        <input type="text" value="abc">
        <input type="text" v-model="thval">
    </div>
    <script >
        var m = {
            thval: "hello world",
            
        };
        var vm = new Vue({
            el: "#app",
            data: m,
            methods: {

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

五:v-bind

v-if v-show v-else用来控制是否显示

v-for控制循环

v-model用来将控件的value与data里面的数据进行关联

v-bind将标签的属性值和data里面的变量值绑定。

语法:

v-bind:argument="expression"

原来是src=""./img/meinv.img""

例如v-bind:src="imgUrl",vue认识v-bind就到model的data中找到imgUrl这个变量将变量值替换变量名。

由于v-bind用的是非频繁,所有有语法糖,可以直接用一个冒号  :src

imgUrl是data里面的变量,对应着一个具体路径。

用的组频繁的是class和style属性       

1-class属性对应的值往往会比较多

方式一:当字符串控制(不推荐)

<!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>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js"></script>
    <style>
        .red{
            width: 200px;
            height: 200px;
            background-color: red;
        }
        .border{
            border:10px solid black;
        }
    </style>
</head>
<body>
    
    <div id="app" >
        <input @click="addBorder()" type="button" value="添加边框"></input>
        <div :class="divClass"></div>
    </div>
    
    <script>
        var vm=new Vue({
            el:'#app',
            data:{
                divClass: "red"
            },
            methods:{
                addBorder: function(){
                    console.log(1);
                    
                    if (this.divClass.indexOf("border") < 0){
                        this.divClass=this.divClass+" border";
                    }
                }
            },
        })
    </script>
</body>
</html>
View Code

方式二:当数组来控制

<!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>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js"></script>
    <style>
        .red{
            width: 200px;
            height: 200px;
            background-color: red;
        }
        .border{
            border:10px solid black;
        }
    </style>
</head>
<body>
    
    <div id="app" >
        <input @click="addBorder()" type="button" :value="cont"></input>
        <div :class="divClassArray"></div>
    </div>
    
    <script>
        var vm=new Vue({
            el:'#app',
            data:{
                // divClass: "red"
                divClassArray: ["red"],
                cont: "添加边框"
            },
            methods:{
                addBorder: function(){
                    console.log(1);
                    
                    if (this.divClassArray.indexOf("border")<0){
                        this.divClassArray.push("border");
                        this.cont = "取消边框"
                    }else{
                        this.divClassArray.pop("border");
                        this.cont = "添加边框"
                    }
                }
            },
        })
    </script>
</body>
</html>
View Code

 方式三:当JSON来控制(最推荐)

前两种都需要indexof来控制,多数情况都是以已经准备好或者写好了样式

只需要控制样式的开关即可,当样式对应的value是false的时候就不渲染,当value是true时才渲染。用bool值来当做开关

这样子做就可以在看html源码的时候就知道哪些样式是挂在这个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>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js"></script>
    <style>
        .red{
            width: 200px;
            height: 200px;
            background-color: red;
        }
        .border{
            border:10px solid black;
        }
    </style>
</head>
<body>
    
    <div id="app" >
        <input @click="addBorder()" type="button" :value="cont"></input>
        <div :class="{red:isRed,border:hasBorder}"></div>
    </div>
    
    <script>
        var vm=new Vue({
            el:'#app',
            data:{
                isRed: true,
                hasBorder: false,
                
                cont: "添加边框"
            },
            methods:{
                addBorder: function(){
                    if(this.hasBorder){
                        this.hasBorder=false;
                        this.cont = "取消边框";
                    }else{
                        this.hasBorder=true
                        this.cont = "添加边框";
                    }
                }
            },
        })
    </script>
</body>
</html>
View Code

2-style属性

行间样式,一般很少用,都是外链的方式引入,但是后面组件化开发的时候会用到

例如导航栏封装为一个组件,单独封装到一个.vue文件中,然后这个组件就可以复用了,而不是替换class,因为style的权重高于class的权重,因此用style直接可以替换

当用户点击了另一个页面时,导航栏还是那个组件的,但是希望颜色进行修改,此时就用到了style属性,还可能图标由原来的点变成了正方形

还可能根据周几来变换颜色,那么这个变量不是写死的而是服务器传到前端动态渲染的。

此时的key为属性名:value为属性值来绑定,3.0版本之后属性名font-size和fontSize都支持了,以前的版本只有驼峰式才支持。

:style="{fontSize:50px}"运行会报错,因为把50px当成了变量

:style="{fontSize:‘50px’}"才行

对于key不论是否加单引号,都视为字符串,而value在vue中不加单引号视为变量。

<!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>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js"></script>
    <style>
        .red{
            width: 200px;
            height: 200px;
            background-color: red;
        }
        .border{
            border:10px solid black;
        }
    </style>
</head>
<body>
    
    <div id="app" >
        <input @click="addBorder()" type="button" :value="cont"></input>
        <div :class="{red:isRed,border:hasBorder}" :style="{backgroundColor:bgcol}"></div>
        <button @click="modifyColor()">{{msg}}</button>
    </div>
    
    <script>
        var vm=new Vue({
            el:'#app',
            data:{  
                isRed: true,
                hasBorder: false,
                msg: "黄色",
                cont: "添加边框",
                bgcol: "red"
            },
            methods:{
                addBorder: function(){
                    if(this.hasBorder){
                        this.hasBorder=false;
                        this.cont = "添加边框";
                    }else{
                        this.hasBorder=true
                        this.cont = "取消边框";
                    }
                },
                modifyColor: function(){
                    if(this.bgcol == "red"){
                        this.bgcol="yellow";
                        this.msg = "红色";
                    }else{
                        this.bgcol="red";
                        this.msg = "黄色";
                    }
                }
            },
        })
    </script>
</body>
</html>
View Code

这个实例的vue用的是2.0版本的版本

backgroundColor不能写成background-color否则就会报错。

六:自定义指令

<!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>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js"></script>
</head>
<body>
    <div id="app">
        <button @click="addCount()">++</button>
        {{count}}
        <button @click="subCount()">--</button>
        <p v-wangshushu="count">大于0</p>
    </div>
    
    <script>
        var vm=new Vue({
            el:'#app',
            data:{
                count: 1,
            },
            methods:{
                addCount:function(){
                    this.count++;
                },
                subCount: function(){
                    this.count--;
                }
            },
            directives:{
                //自动找v-后面的指令
                //el,bindings都是缺省已经有的,叫做hook钩子
                //有那么几个事我会在固定的时间调用,你可以hook上去
                //当我走到这里的时候我叫你
                //非常像事件,在js中叫事件,而不在html元素上面的叫做 hook
                wangshushu: {
                    //浏览器熏染完之后,vue开始工作,发现认识的指令,就开始调用钩子函数
                    //绑定时调用,自动传给你两个参数,el指被绑定的dom,可以操作这个element
                    //此时就是js的操作了,可以把它变没有
                    //bindings是object,里面定义了三个函数
                    //这个对象也是vue帮你封装的
                    //只有第一次调用bind
                    //第二次就调用update
                    bind: function(el, bindings){
                        console.log(el,bindings);
                        if (bindings.value>0){
                            el.setAttribute("style","display:block");
                        }else{
                            el.setAttribute("style","display:none");
                        }
                        
                    },
                    //后面的表达式或者变量,值只要变化了就会调用update
                    update: function(el, bindings){
                        if (bindings.value>0){
                            el.setAttribute("style","display:block");
                        }else{
                            el.setAttribute("style","display:none");
                        }
                    },
                    //解绑时调用
                    unbind:function(el,bindings){

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

 

posted @ 2020-06-24 10:03  浅忆尘  阅读(223)  评论(0编辑  收藏  举报