美文网首页
vue指令合集

vue指令合集

作者: 张浩琦 | 来源:发表于2020-01-31 13:46 被阅读0次

    注意:

    1、所谓指令,其实就是元素的属性

    2、所有的指令,前提是在js中声明了是Vue对象

    3、参数

    1、静态参数:一些指令能够接收一个“参数”,在指令名称之后以冒号表示。例如,v-bind 指令可以用于响应式地更新 HTML attribute:

    <a v-bind:href="url">...</a>

    此处的href是参数

    <a v-on:click="doSomething">...</a>

    v-on 指令,它用于监听 DOM 事件,在这里参数是监听的事件名

    2、动态参数:可以用方括号括起来的 JavaScript 表达式作为一个指令的参数:例如:(动态参数不是太理解)

    <a v-bind:[attributeName]="url"> ... </a>

    这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。例如,如果你的 Vue 实例有一个 data 属性 attributeName,其值为 "href",那么这个绑定将等价于 v-bind:href。

    同样的你可以使用动态参数为一个动态的事件名绑定处理函数:

    <a v-on:[eventName]="doSomething"> ... </a>

    在这个示例中,当 eventName 的值为 "focus" 时,v-on:[eventName] 将等价于 v-on:focus。

    实例:  点击会有弹窗的出现

        <a href="" id="add" v-on:[whos]="tanChuang">{{message}}</a>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    message: "张浩琦",

                    whos: "click",

                },

                methods: {

                    tanChuang: function() {

                        alert(123456)

                    }

                }

            })

                </script>

    3、在我们的模板中,我们一直都只绑定简单的属性键值。但实际上,对于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持。

    {{ number + 1 }}

    {{ ok ? 'YES' : 'NO' }}

    {{ message.split('').reverse().join('') }}

    <div v-bind:id="'list-' + id"></div>

    以下符合逻辑但是不是表达式的也不会生效

    <!-- 这是语句,不是表达式 -->

    {{ var a = 1 }}

    <!-- 流控制也不会生效,请使用三元表达式 -->

    {{ if (ok) { return message } }}

    v-text指令

    设置标签的文本值(textContent)

    1、v-text已经将文本的内容替换,所以源文本的内容不会显示

    2、{{content}}实在原来的文本的基础上进行拼接。

    <div id="add">

    v-text的使用:

            <!-- h2的内容被message的v-text指向 -->

            <h2 v-text="message">

                <!-- 因为有v-text,所以{{info}}里面的内容显示不出来 -->

                {{ info }}

                <!-- </h2>

            此时文本的内容 “深圳”也显示不出来 -->

                <h2 v-text="info">

                    深圳

                </h2>

               

    {{}}的使用:

                <!-- {{message}}表示拼接,所以此时的深圳可以显示出来 -->

                <h2>

                    {{message}}深圳

                </h2>

               

    v-text拼接文本  :

                  <!-- v-text拼接文本 -->

                <h2 v-text="info+'我是v-text拼接的字符串'"></h2>

                <!-- v-text插入多个属性文本 -->

                <h2 v-text="info+message"></h2>

               

        </div>

        <script>

       

            var app = new Vue({

                el: "#add",

                data: {

                    message: "黑马程序员",

                    info: "白马程序员"

                }

            })

        </script>

    v-once指令

    通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。但请留心这会影响到该节点上的其它数据绑定:

    <span v-once>这个将不会改变: {{ msg }}</span>

    msg只随着属性的变化而变化一次

    v-html指令

    设置元素的innerHTML

    1、更新文本的值,直接将原文本替换,和v-html差不多

    2、当v-html指向的内容符合HTML标签的形式时,会生成新的标签。

      <div id="add">

     

    v-html更新文本 

            <!-- 黑马程序员被替换为白马程序员黄马程序员绿马程序员 -->

            <span v-html="content+info+'绿马程序员'">黑马程序员</span>

         

    v-html新增标签

            <!--如果v-html指向的内容符合标签的形式,则生成一个html标签-->

            <!-- 原div里面的内容全部都被替换,生成一个内容为程序员的span标签。 -->

           

            <div v-html="message">

            </div>

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    content: "白马程序员",

                    info: "黄马程序员",

                    message: "<span>程序员</span>"

                }

            })

        </script>

    v-html和v-text的对比

          <span v-html="weblink"></span><br>        //显示的是一个百度链接

           

            <span v-text="weblink"></span>          //显示的是<a href='www.baidiu.com'>百度链接</a>

             

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    weblink: "<a href='www.baidiu.com'>百度链接</a>"

                }

            })

        </script>

    v-on指令

    为元素绑定事件 监听DOM事件

    1、格式

    1、<input type="button" value="事件绑定"v-on:事件名="方法">

    2、<input type="button" value="事件绑定" @事件名="方法">

    事件名为常用事件 click mouseover 等

    2、点击事件

    <input type="button" value="事件绑定" v-on:click="方法">

    或者 v-on:换成@

    <input type="button" value="事件绑定" @click="方法">

    3、直接更改属性的值

    <button v-on:click="foo = 'baz'">Change it</button>

    4、Vue写方法

          var app = new Vue({

                el: "add",

                data: {

                    message: "张浩琦",

                    foo:"123"

                },

                methods: {

                    dolt: function() {

                          //逻辑

                    }

                }

            })

    5、触发函数

    触发函数时会出现集中不同情况

    1、一个按钮触发一个函数

      无参数时  方法的名称可以不加小括号

      <input type="button" id="add" value="点击触发函数" v-on:click="dolt">

     

    2、一个按钮触发两个函数(两个函数都需要带小括号,执行顺序按照先后顺序)

    <input type="button" id="add" value="点击触发函数" v-on:click="dolt()+dolttwo()">

       

       

        <script>

            var app = new Vue({

                el: "#add",

                data: {

                    message: "张浩琦",

                },

                methods: {

                    dolt: function() {

                        alert(this);

                    },

                    dolttwo: function() {

                        console.log(this); // this指的是当前创建的app这个Vue对象

                     

                        console.log(this.message); //张浩琦

                    }

                }

            })

    Vue的操作重在操作数据(文本域),而非操作Dom元素(操作Vue的时候时,需要使用this)

    使用事件点击更改谋个标签的内容

    点击之后,调用dolttwo方法,message的内容由张浩琦换成刘倩倩,span标签里面的内容也更改为现在的message内容

    <span id="add" v-on:click="dolttwo">

            {{message}}

    </span>

        <script>

            var app = new Vue({

                el: "#add",

                data: {

                    message: "张浩琦",

                },

                methods: {

                    dolt: function() {

                        alert(this);

                    },

                    dolttwo: function() {

                        this.message = "刘倩倩"

                      //this.message+="刘倩倩";

                      函数每调用一次,message后面就添加一个刘倩倩

                     

                      //this.message-="刘倩倩";

                      点击一次,显示Nan;

                    }

                }

            })

        </script>

    计数器的实战

    0-10之间

    <body>

        <div id="pss">

            <button class="one" @click="sub">减少</button>

            <span class="one" v-text="message"></span>

            <button class="one" @click="add">增加</button>

        </div>

        <script>

            var vm = new Vue({

                el: "#pss",

                data: {

                    message: 0

                },

                methods: {

                  add() {

                     

                        console.log(this)

                        if (this.message >= 10) {

                            this.message = 0;

                        } else {

                            this.message += 1;

                            //    或者

                        // this.message++;

                        }

                    },

                    sub() {

                        if (this.message <= 0) {

                            this.message = 10;

                        } else {

                            this.message -= 1;

                            //    或者

                        // this.message--;

                        }

                     

                        console.log(this)

                    }

                }

            })

        </script>

    </body>

    v-on补充

    传递自定义参数,事件修饰符@keyup后的.XXX(https://cn.vuejs.org/v2/api/#v-on)

    方法传递参数 <input type="button" @click="doIt(p1,p2)">

    键盘监听(以回车为例)

    <input type="text" @keyup.enter="sayHi('小铁',555)">

    或者 <input type="text" v-on:keyup.enter="sayHi('小铁',555)">

    如果不加.enter,则按键盘上的任意按钮,都会调用sayHi('小铁',555)的方法

    <div id="add">

            <!-- 鼠标  -->

            <input type="button" value="老铁666" @click="doIt('老铁',666)">

            <!-- 键盘 -->

            <input type="text" @keyup.enter="sayHi('小铁',555)">

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                },

                methods: {

                    //含有参数的方法

                    doIt: function(p1, p2) {

                        console.log(p1, p2)

                    },

                    sayHi: function(p3, p4) {

                        console.log(p3, p4)

                    }

                }

            })

        </script>

    访问原生事件DOM对象$event

      <div id="add">

            <button v-on:click="warn($event)">访问原生事件对象</button>

            //如果此处参数是event,则输出的时候会报错

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                },

                methods: {

                    warn: function(event) {

                        console.log(event)

                    }

                }

            })

        </script>

    v-show指令

    根据表达值的真假,切换元素的显示和隐藏(其实是操作元素的display)

    1、< img src="" v-show="true">;true显示,false不显示

    2、v-show里面的值还可以加判断

    <div id="add">

    v-show="false" 标签元素不显示

         

            <img src="./image/q1.jpg" alt="" v-show="false">

           

    v-show="isShow" isShow的值为false  标签元素不显示

            <img src="./image/q2.jpg" alt="" v-show="isHidde">

           

    v-show="isShow" isShow的值为true  标签元素显示 点击不显示

            <img src="./image/q2.jpg" alt="" v-show="isShow" @click="visPic">

           

    v-show="age==16"显示,否则隐藏  此处v-show里面的值为boolean值

            <img src="./image/q3.jpg" v-show="age==16" alt="" @click="addAge">

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    isShow: true,

                    isHidde: false,

                },

                methods: {

                    visPic() {

                        //使isShow的值变为true

                        this.isShow = false

                        //或者

                        this.isShow = !this.isShow

                    },

                    //此方法每调用一次,age增加1

                    addAge() {

                        this.age++;

                    }

                }

            })

        </script>

    v-if指令

    根据表达式的真假,切换元素显示和隐藏(操纵Dom元素,而非样式,v-show操纵的是样式)

    1、用法和v-show完全一样,v-if改变的是Dom元素的添加或删除,v-show改变的是样式,不会新增加Dom元素和删除Dom元素的

    2、实际工作中,频繁切换的元素用v-show,反之用v-if,因为操作Dom消耗比较大。

    v-if和v-else的使用

    v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。

    <div id="add">

            <h1 v-if="awesome">张浩琦</h1>

            <h1 v-else>是的</h1>

            <h1></h1>

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    awesome: false //此时显示的是  是的

                        //当为true时  显示的是张浩琦

                }

            })

        </script>

       

    template元素,一个不可见的包裹元素

        <div id="add">

            <h1 v-else>是的</h1>

            <h1></h1>

            <template v-if="ok">

                <h1>Title</h1>

                <p>Paragraph 1</p>

                <p>Paragraph 2</p>

              </template>

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

               

                    ok: true  //此时template里面包裹的元素都可以显示出来。 如果不添加vue指令,不管是直接在template元素里面添加内容还是添加元素,template里面的内容都显示不出来

                }

            })

        </script>

    v-else-if

      <div id="add">

            <template v-if="ok">

                  <h3 v-if="type===A">A</h3>

                  <h3 v-if="type===B">B</h3>

                  <h3 v-if="type===C">C</h3>

                  <h3 v-if="type===D">D</h3>

                  <h3 v-else>没有选项了啊</h3>

              </template>

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                 

                    ok: true, //此时template里面包裹的元素都可以显示出来。 如果不添加vue指令,不管是直接在template元素里面添加内容还是添加元素,template里面的内容都显示不出来

                    type: "132"  //此时网页显示的是没有选项了啊

                }

            })

        </script>

    用key 管理可复用的元素

    可复用元素举例 此处的表单元素即可复用元素 这样做其实是不符合实际的,要用key属性来解决

      <div id="add">

            <button v-on:click="change">点击切换</button>

            <!-- 点击之后,元素的内容改变,但是input已经输入的值却不发生改变, -->

            <template v-if="loginType === 'username'">

                <label>Username</label>

                <input placeholder="Enter your username">

                //更改为这个,元素里面的内容就会重新渲染,而不是重复使用 //<input placeholder="Enter your username"  key="one">

              </template>

            <template v-else>

                <label>Email</label>

                <input placeholder="Enter your email address">

                //这里也需要更改,不能和复用的元素的key值一样

                //<input placeholder="Enter your username"  key="two">

              </template>

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    loginType: "username",

                },

                methods: {

                    change: function() {

                        console.log(this.loginType)

                        this.loginType = "sef"

                        console.log(this.loginType)

                    }

                }

            })

        </script>

    v-bind指令

    操作元素的属性(如:src,title,class等)

    格式

    1、< img v-bind:src ="imgSrc" >

    2、< img v-bind:title="imgTitle+'123456'"> 拼接

    3、< img v-bind:class="isActive?'active':''">三元表达式的形式表示判断,判断isActive的值,如果符合,class的属性值为active,如果不符合,class的属性值为空。(这种写法比较麻烦,可以采用对象的形式)

    4、< img v-bind:class ="{active:isActive}"> 对象的形式表示判断,如果isActive的值为true,class的属性为active,否则class的属性为空

    5、简写形式:< img :class ="{active:isActive}">(v-bind可以删除,但是在属性前需要加一个:)

      <div id="add">

            <!-- 为一个标签的属性赋予一个变量的值 -->

            <img v-bind:src="imgSrc"></img>

            为一个标签赋的属性赋予两个变量的值

            <span v-bind:class="[classes,changeColor]">

            <!-- 为一个标签的属性赋值,外加拼接 -->

            <span v-bind:title="imgTitle+'我是拼接的部分'">啦啦啦啦啦</span>

            <div v-bind:class="'active'+' '+'bgBorder'">

                <img src="./image/q2.jpg" alt="">

            </div>

            <div>

                <!-- 对象形式判断条件是否成立,成立变为块元素,不成立变为行元素 -->

                <span v-bind:class="{active:judge}">添加一个属性值</span>

                <!--待解决-->

                <!-- <span v-bind:class="{classes:judge}">判断并把vue对象的属性值作为此标签的class值</span> -->

                <br>

                <!-- 三元表达式形式判断添加一个和两个class属性值 -->

                <span v-bind:class="judge?'active':''">添加一个属性值</span>

                <span v-bind:class="judge?'active bgBorder':''">添加两个属性值</span>

            </div>

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    imgSrc: "./image/q1.jpg",

                    imgTitle: "这是一个标签",

                    judge: true,

                    classes: "fonts",

                    changeColor: "red"

                }

            })

        </script>

       

    综合写法

    <div id="demo">

      <span :class="[one,{classA:classa,classB:classb}]"></span>

    </div>

    var vm = new Vue({

        el:"#demo",

        data:{

          one:"string",

          classa:true,

          classb:false

        }

    })

    效果 <span class = "string classA">

    5、遗留问题

    待解决

    问题一:判断并把vue对象的变量作为此标签的class值

            <span v-bind:class="{classes:judge}">判断并把vue对象的属性值作为此标签的class值</span>

            //此时添加的span标签的class的属性值为classes而非fonts

           

    解决方式:

       

           

    问题二:    如何用对象的形式一次添加两个属性值

    对象形式判断条件是否成立,成立变为块元素,不成立变为行元素

                <span v-bind:class="{active:judge}">添加一个属性值</span>

               

    解决措施:两个属性值判断之间用逗号隔开

      <span v-bind:class="{active:judge,fonts:judge}">添加一个属性值41564156416</span>

     

               

               

               

               

                var vm = new Vue({

                el: "#add",

                data: {

                    imgSrc: "./image/q1.jpg",

                    imgTitle: "这是一个标签",

                    judge: true,

                    classes: "fonts"

                }

            })

    v-bind指令的详细补充 包括样式的改变

    修改class和style, v-bind指令与一半属性共存

    对象语法

    样式一:

    .static {

                width: 100px;

                height: 100px;

                border: 1px solid red;

            }

           

            .backgroundcolor {

                background-color: green;

            }

           

            .divBig {

                width: 200px;

                height: 200px;

            }

    <div id="add" class="static"  一半属性class  还可以添加v-bind属性 v-bind:class="{divBig:classOne,backgroundcolor:classTwo}">

            <span>1234656</span>

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    classOne: true,  如果classOne为false,则divBig此类名属性则无法发挥作用

                    classTwo: true

                    与上同理

                }

            })

        </script>

       

    样式二:将所有的样式写在一个属性对象中

    .active {

                width: 100px;

                height: 100px;

                background-color: red;

            }

    <div id="add" v-bind:class="classObject"></div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    classObject: {

                        //此时的类名为active

                        active: true,

                        ' text-danger': false

                    }

                }

            })

        </script>

       

    使用计算属性(看不懂)

      <div id="app" v-bind:class="classObject">

        </div>

        <script>

            var vm = new Vue({

                el: "#app",

                data: {

                    active: true,

                    error: null

                },

                computed: {

                    classObject: function() {

                        return {

                            active: this.active && !this.error,

                            'text-danger': this.error && this.error.type === 'fatal'

                        }

                    }

                }

            })

        </script>

       

       

       

    数组语法

    可以把一个数组传给 v-bind:class,以应用一个 class 列表:

    样式一:将对象存入到数组中

            .active {

                width: 100px;

                height: 100px;

            }

           

            .error {

                background-color: red;

            }

           

           

           

           

    <div id="add" v-bind:class="[activeClass,errorClass]">

        </div>

       

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    activeClass: "active",

                    errorClass: "error",

                }

            })

        </script>

       

    样式二:三元表达式形式

    <div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>

      .active {

                width: 100px;

                height: 100px;

            }

           

            .error {

                background-color: red;

            }

      <!-- 三元表达式,判断属性 -->

        <div id="add" v-bind:class="[activeClass,panduan?'':errorClass]">

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    activeClass: "active",

                    errorClass: "error",

                    panduan: false,

                }

            })

        </script>

    对象语法在数组中使用

            .active {

                width: 100px;

                height: 100px;

            }

           

            .error {

                background-color: red;

            }

           

            .question {

                border: 10px solid black;

            }

    <!-- 数组语法和对象语法的混合使用 -->

        <div id="add" v-bind:class="[{active:activeClass,error:errorClass},questionClass]"></div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    activeClass: false,

                    errorClass: true,

                    questionClass: "question"

                }

            })

        </script>

       

    用在组件上(没有操作过,官方原文档)

    当在一个自定义组件上使用 class 属性时,这些 class 将被添加到该组件的根元素上面。这个元素上已经存在的 class 不会被覆盖。

    例如,如果你声明了这个组件:

    Vue.component('my-component', {

      template: '<p class="foo bar">Hi</p>'

    })

    然后在使用它的时候添加一些 class:

    <my-component class="baz boo"></my-component>

    HTML 将被渲染为:

    <p class="foo bar baz boo">Hi</p>

    对于带数据绑定 class 也同样适用:

    <my-component v-bind:class="{ active: isActive }"></my-component>

    当 isActive 为 truthy[1] 时,HTML 将被渲染成为:

    <p class="foo bar active">Hi</p>

    绑定内联样式

    v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS 属性名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名:

    当 v-bind:style 使用需要添加浏览器引擎前缀的 CSS 属性时,如 transform,Vue.js 会自动侦测并添加相应的前缀。

    <div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"这样写只会渲染数组中最后一个被浏览器支持的值。在本例中,如果浏览器支持不带浏览器前缀的 flexbox,那么就只会渲染 display: flex。

    <div id="add" v-bind:style="[{color:activeColor,fontSize:fontSize+'px'},styleObject]">

            张浩琦

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    activeColor: 'yellow',

                    fontSize: '30',

                    styleObject: {

                        border: "20px solid red",

                        width: "200px",

                        height: "200px"

                    }

                }

            })

        </script>

    使用方法和class的更改差不多   

       

    v-for指令

    根据数据生成列表结构(列表的生成依赖数据,所以在data里面建立)

    v-for指定的内容会随着vue对象的数据的改变而进行dom节点数量的改变

    语法:

    语法一:列表的每一项内容为数组的内容(列表里面如果有原内容,则原内容每一次都会被打印)

    <div id="app>

    <ul>

    <li v-for="item in arr">张浩琦{{item}}</li>

    //item是遍历的每一项,可以改名字,但是得遵循命名规则

    //in 关键字 不能修改

    //arr 要循环的数据名

    //如果li标签里面原本就有内容,例如“张浩琦”,那么遍历的每一项数据生成的节点都是张浩琦

    </ul>

    </div>

    var app = new  Vue({

        el:"#app",

        data:{

            arr:[1,2,3,4,5]

        }

    })

    结果

    张浩琦

    张浩琦

    张浩琦

    张浩琦

    张浩琦

    语法中的内容不一样

      内容用一个对象储存

     

    <html>

    <div id="edd">

            <ul>

                <button @click="add">增加</button>

                <button @click="remove">移除</button>

                <li v-for="item in objArr" v-bind:title="item.name">

                    {{item.name}}

                </li>

            </ul>

        </div>

       

       

    <script>

    var am = new Vue({

                el: "#edd",

                data: {

                    //绑定一个对象的数组

                    objArr: [{

                        name: "张浩琦"

                    }, {

                        name: "刘倩倩"

                    }, {

                        name: "花粥"

                    }]

                },

                methods: {

                    add: function() {

                        //push增加 方法,方法没执行一次,对象数组objArr里面增加一个对象“张雨墨”

                        this.objArr.push({

                            name: "张雨墨"

                        })

                    },

                    remove: function() {

                        //shift()  删除最左边的元素,方法每执行一次,数组里面就移除一个objArr最里面的一个对象

                        this.objArr.shift()

                    }

                }

            })

           

           

            内容显示出数据的索引

            <li v-for="(item,index) in arr">

                    {{index}}{{item}}

              </li>

             

              var bm = new Vue({

                    el: "#app",

                    data: {

                        arr: [1, 2, 3, 4, 5]

                    }

                })

    v-for里使用值范围

    <div id="add">

            <li v-for="n in 10">{{n}}</li>

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                }

            })

        </script>

        结果1-10

    v-model(model 模型;典型;模特儿)

    便捷获取和设置表单元素的值(双向数据绑定) 需要和表单元素一起使用

    双向绑定即当message的内容改变,表单的内容会随着改变,表单的内容改变,message的内容也会随着改变

      <div id="add">

            <input type="text" v-model="message">

            <!-- span里面的内容会随着message的变化而变化,message会随着表单录入的内容变化而变化 -->

            <span>{{message}}</span>

            <input type="button" value="点击更改message的内容为刘倩倩" @click="add">

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    message: "张浩琦"

                },

                methods: {

                    add: function() {

                        this.message = "刘倩倩"

                    }

                }

            })

        </script>

    修饰符(不是太清楚)

    .lazy(懒加载)

    在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步:

    <div id="add">

    没有.lazy

            <input type="text" v-model="message" v-on:change="nub">

            <!-- 当表单中的值发生改变时,会调用nub方法,但是v-model控制的对象属性导致表单的值发生改变时,并不会调用nub方法 -->

            <button v-on:click="change">点击更改</button>

           

    加上.lazy

    <input type="text" v-model.lazy="message">

      <span>

                {{message}}

            </span>

    span中的值并不会随着message的改变而同步改变,只有表单失去焦点时,span中的值才会同步改变,类似于change

        </div>

        <script>

            var vm = new Vue({

                el: "#add",

                data: {

                    message: "张浩琦"

                },

                methods: {

                    change: function() {

                        this.message = "刘倩倩"

                    },

                    nub: function() {

                        alert("15465")

                    }

                }

            })

        </script>

    <!-- 在“change”时而非“input”时更新 -->

    <input v-model.lazy="msg" >

    .number

    如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符:

    <input v-model.number="age" type="number">

    这通常很有用,因为即使在 type="number" 时,HTML 输入元素的值也总会返回字符串。如果这个值无法被 parseFloat() 解析,则会返回原始的值。

    .trim

    如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符:

    <input v-model.trim="msg">

    .ref像v-model一样,实现数据的双向绑定(主要是为了获取当前的元素对象input对象)

    <div id="add">

            <!-- ref目的:获取表单的内容,并把内容赋值给span标签,间接实现双向绑定  类似于v-model -->

            <!-- 获取表单的内容要获取事件,此处使用的是keyup,键盘每按下一次,就调用一次方法 -->

            <input type="text" ref="name" @keyup="getName">

            <span>{{name}}</span>

            <input type="text" ref="age" @keyup="getAge">

            <span>{{age}}</span>

        </div>

        <script>

            new Vue({

                el: "#add",

                data: {

                    name: " ",

                    age: 32

                },

                methods: {

                    getName: function() {

                        console.log(this.$refs);

                        //  相当于ref的父级,包含了标签中ref的所有内容  所以此处输出的也有age的内容

                    },

                    getAge: function() {

                        console.log(this.$refs.age.value);

                    }

                }

            })

        </script>

    项目实战

    小黑记事本项目

    学到的内容

    1、数组元素的长度 content.length

    2、 this.content.splice(index, 1); 删除指定的索引内容,如果是2,则删除当前索引内容和之后的那个索引内容

      <div id="littleBlack">

            <!-- 回车键向表格中录入内容,q键清除表格中的所有内容 -->

            <input type="text" v-model="message" @keyup.enter="addContent" @keyup.q="clearAll">

            <ul>

                <li v-for="(item,index) in content" @click="remove(index)">{{index+1}}{{item}}</li>

            </ul>

            <!-- 统计列表中元素的个数即统计数组的长度  当数组的长度为0时,隐藏此项功能-->

            <span v-text="'个数'+content.length" v-if="content.length!=0"></span>

        </div>

        <script>

            var vm = new Vue({

                el: "#littleBlack",

                data: {

                    message: "泡面",

                    content: ["吃饭饭", "睡觉觉", "敲代码"]

                },

                methods: {

                    addContent: function() {

                        this.content.push(this.message);

                        this.message = " ";

                    },

                    remove: function(index) {

                        console.log(index);

                        //splice(index,1)删除指定的索引,一次删除一个元素  如果是2删除索引和索引后面的元素

                        this.content.splice(index, 1);

                    },

                    clearAll: function() {

                        this.content = " ";

                    }

                }

            })

        </script>

    相关文章

      网友评论

          本文标题:vue指令合集

          本文链接:https://www.haomeiwen.com/subject/zqegthtx.html