• Vue模板语法


    1.Vue模板语法

    1.1 模板语法概述

    1.如何理解前端渲染?

    把数据填充到HTML标签中

    2.前端渲染方式

    • 原生js拼接字符串

    • 使用前端模板引擎

    • 使用vue特有的模板语法

    3. 原生js拼接字符串

    基本上就是将数据以字符串的方式拼接到HTML标 签中,前端代码风格大体上如下图所示。

    缺点:不同开发人员的代码风格差别很大,随着业 务的复杂,后期的维护变得逐渐困难起来。

    4. 使用前端模板引擎

    下面代码是基于模板引擎art-template的一段代 码,与拼接字符串相比,代码明显规范了很多, 它拥有自己的一套模板语法规则。

    优点:大家都遵循同样的规则写代码,代码可读性 明显提高了,方便后期的维护。

    缺点:没有专门提供事件机制。

    5. 模板语法概览

    插值表达式

    指令

    事件绑定

    属性绑定

    样式绑定

    分支循环结构

    1.2 指令

    1.什么是指令?

    • 什么是自定义属性

    • 指令的本质就是自定义属性

    • 指令的格式:以v-开始(比如:v-cloak)

    官网:https://cn.vuejs.org/v2/api/

    2. v-cloak指令用法

    插值表达式存在的问题:“闪动”

    如何解决该问题:使用v-cloak指令

    解决该问题的原理:先隐藏,替换好值之后再显示最终的值

    // v-cloak指令 的用法
            /*  1. 提供样式
             [v - cloak] {
                 display: none
             } 
             <style>
                [v-cloak] {
                  display: none
                }
            </style>
             */
    // 2. 在插值表达式所在的标签中添加 v-cloak 指令
            <div v-cloak>
                {{msg}}
            </div>

    3.数据绑定指令

    v-text  填充纯文本

    ① 相比插值表达式更加简洁

    <div v-text='msg'></div>

    v-html  填充HTML片段

    ① 存在安全问题

    ② 本网站内部数据可以使用,来自第三方的数据不可以用

    <div v-html='msg1'></div>
    data: {
                msg1: '<h3> html </h3>'
          }

      v-pre  填充原始信息

    ① 显示原始信息,跳过编译过程(分析编译过程)

    <div v-pre='msg'>{{msg}} </div>
    1. 数据响应式

      如何理解响应式

      ​ ① html5中的响应式(屏幕尺寸的变化导致样式的变化)

      ​ ② 数据的响应式(数据的变化导致页面内容的变化,可在控制台控制数据)

     

       什么是数据绑定

      ​ ① 数据绑定:将数据填充到标签中

       v-once  只编译一次

      ​ ① 显示内容之后不再具有响应式功能

      ​    v-once的应用场景:如果显示的信息后续不需要再修改,那么可以使用v-once,这样可以提高性能。

      

    1.3 双向数据绑定指令

    1.什么是双向数据绑定?

    2.双向数据绑定分析

    v-model指令用法

      <input type='text' v-model='uname'/>

    在页面中修改数据,控制台里面的数据也会跟着变化

    在控制台里面修改数据,页面数据也会一起被修改

    3.MVVM设计思想

    ① M(model)  --(模型数据)

    ② V(view) --(视图,本质上来说是DOM元素)

    ③ VM(View-Model)--(控制逻辑,把View和Model结合在一起)

    1.4 事件绑定

    1.Vue如何处理事件?

      v-on指令用法

     <button v-on:click='num++'>按钮</button>

    v-on简写形式

    <button @click='num++'>按钮</button>

    2.事件函数的调用方式

    函数定义方式:

    直接绑定函数(方法)名称

    <button @click='handle'>按钮2</button>

    调用函数

    <button @click='handle()'>按钮3</button>

    3.事件函数参数传递

    普通参数和事件对象

    1.     如果事件直接绑定函数名称,那么会默认传递事件对象作为事件函数的第一个参数

       <button @click='handle2'>按钮2</button>
      handle2: function (event) {
           console.log(event.target.innerHTML);
       }
      1. 如果事件绑定函数调用,那么事件对象必须作为最后一个传递的参数,并且事件对象的名称必须是$event,是固定的

        <button @click='handle1(1,6,$event)'>按钮1</button>
         handle1: function (p1, p2, event) {
                 console.log(p1, p2);
                 // tagName 标签名    
                 console.log(event.target.tagName);
                 // innerHTML 标签里的内容
                 console.log(event.target.innerHTML);
                 this.num++;
         }

         

    4.事件修饰符

    .stop 阻止冒泡

    1.传统方式阻止冒泡

    handle1: function () {
         // 传统方式阻止冒泡
         event.stopPropagation();
    }

    2.事件修饰符阻止冒泡

    <button @click.stop='handle1'>按钮1</button>

    .prevent 阻止默认行为 

    1.传统方式阻止默认行为

     handle3: function (event) {
      // 传统方式阻止默认行为
      event.preventDefault();
    }

    2.事件修饰符阻止冒泡

    <a href="http://www.baidu.com" @click.prevent='handle3'>跳转</a>

    .stop  .prevent 可串联使用

     <!-- 阻止冒泡和阻止默认行为可串联使用 -->
    <button @click.stop.prevent='handle1'> <a href="http://www.baidu.com">跳转按钮</a></button>

    5.按键修饰符

    .enter 回车键     .delete删除键

    // .enter 回车键
    密码: <input type="password" v-model='pwd' v-on:keyup.enter='handel'>
    // .delete删除键
    用户名:<input type="text" v-model='uname' v-on:keyup.delete='clearContent'><script>
            var vm = new Vue({
                el: '#app',
                data: {
                    uname: '',
                    pwd: ''
                },
                methods: {
                    clearContent: function () {
                        this.uname = ''
                    },
                    handel: function () {
                        console.log(this.uname, this.pwd);
                    }
                }
            })
        </script>
    
    

    6.自定义按键修饰符

    全局 config.keyCodes 对象

    Vue.config.keyCodes.f1 = 112

    <body>
        <div id="app">
            <!-- 未知Ascll码值,添加事件对象$event,用来获取键盘Ascll码值 -->
            <!-- <input type="text" v-on:keyup='handel'> -->
            <!-- 已知ASCALL码值也可以如下直接添加数字 -->
            <!-- <input type="text" v-on:keyup.65='handel'> -->
            <input type="text" v-on:keyup.f1='handel'>
        </div>
        <script src="vue.js"></script>
        <script>
            // 已知Ascall码值  f1为自定义修饰符别名 
            Vue.config.keyCodes.f1 = 65;
            var vm =new Vue({
                el: '#app',
                data: {},
                methods: {
                    handel: function (event) {
                        //Ascll码值打印出来
                        console.log(event.keyCode);
                    }
                }
            })
        </script>
    </body>

    案例:简单计算器

    需求:实现简单的加法计算,分别输入数值a和数值b,点击计算按钮,结果显示在下面。

    案例分析:

    ① 通过v-model指令实现数值a和数值b的绑定

    ② 给计算按钮绑定事件,实现计算逻辑

    ③ 将计算结果绑定到对应位置

    <body>
        <div id="app">
            <h1>简单计算器</h1>
            <div>
                <span>数值A</span>
                <span>
                    <input type="text" v-model='a'>
                </span>
            </div>
            <div>
                <span>数值B</span>
                <span>
                    <input type="text" v-model='b'>
                </span>
            </div>
            <div>
                <button v-on:click='handel'>计算</button>
            </div>
            <div>
                <span>计算结果:</span>
                <span v-text='result'></span>
            </div>
        </div>
        <script src="vue.js"></script>
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    a: '',
                    b: '',
                    result: ''
                },
                methods: {
                    handel: function () {
                        this.result = parseInt(this.a) + parseInt(this.b);
                    }
                }
            })
        </script>
    </body>
    ​

    1.5 属性绑定

    1.Vue如何动态处理属性?

      v-bind指令用法:

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

    缩写形式

    <a :href="url">百度</a>

    2.v-model的低层实现原理分析

    <input type="text" v-bind:value="msg" v-on:input='msg=$event.target.value'>

    1.6 样式绑定

    1.class样式处理

    对象语法

    <body>
        <div id="app">
            <div v-bind:class="{active:isActive,error:isError}">123</div>
            <button v-on:click='handel'>切换</button>
        </div>
        <script src="vue.js"></script>
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    isActive: true,
                    isError: true
                },
                methods: {
                    handel: function () {
                        // 控制isActive的值在true和false之间进行切换
                        this.isActive = !this.isActive,
                            this.isError = !this.isError
                    }
                }
            })
        </script>

    数组语法     

    <body>
        <div id="app">
            <div v-bind:class='[activeClass,errorClass]'>1213</div>
            <button v-on:click='handle'>切换</button>
        </div>
        <script src="vue.js"></script>
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    activeClass: 'active',
                    errorClass: 'error'
                },
                methods: {
                    handle: function () {
                        this.activeClass = '',
                            this.errorClass = ''
                    }
                }
            })
        </script>
    </body>

    样式处理细节

    1、对象绑定和数组绑定可以结合使用

    <div v-bind:class='[activeClass,errorClass,{text:isText}]'>1213</div>

    2、class绑定的值可以简化操作

    <div v-bind:class='arrClass'></div>
    <div v-bind:class='objClass'></div>
                data: {
                    activeClass: 'active',
                    errorClass: 'error',
                    isText: true,
                    // 简化操作
                    // 数组简化
                    arrClass: ['active', 'error'],
                    // 对象简化
                    objClass: {
                        active: true,
                        error: true
                    }
                }

       3、默认的class如何处理?默认的class会保留

    <div class="base" v-bind:class='objClass'></div>

    2.style样式处理

    对象语法

     <div v-bind:style='{widthStyle,height:heightStyle,border:borderStyle}'></div>

         数组语法

    <div v-bind:style='[objStyle,overrideStyle]'></div>

    具体使用参考如下代码:

    <body>
        <div id="app">
            <div v-bind:style='{widthStyle,height:heightStyle,border:borderStyle}'></div>
            <div v-bind:style='objStyle'></div>
            <div v-bind:style='[objStyle,overrideStyle]'></div>
            <button v-on:click.style='handel'>切换</button>
        </div>
        <script src="vue.js"></script>
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    widthStyle: '100px',
                    heightStyle: '200px',
                    borderStyle: '1px solid #ccc',
                    // 对象简化
                    objStyle: {
                         '200px',
                        height: '100px',
                        border: '1px solid #ccc'
                    },
                    // 数组
                    overrideStyle: {
                        border: '5px solid red',
                        background: 'blue'
    ​
                    }
                },
                methods: {
                    handel: function () {
                        this.heightStyle = '100px';
                        this.objStyle.width = '100px'
                    }
                }
            })
        </script>
    </body>

    1.7 分支循环结构

    1.分支结构

    v-if

    v-else

    v-else-if

    v-show

    <body>
        <div id="app">
            <div v-if='score>=90'>优秀</div>
            <div v-else-if='score<90&&score>=80'>良好</div>
            <div v-else-if='score<80&&score>=70'>中等</div>
            <div v-else-if='score<90&&score>=60'>及格</div>
            <div v-else>挂科</div>
            <div v-show=flag>测试v-show</div>
            <button v-on:click='handel'>切换状态</button>
        </div>
        <script src="vue.js"></script>
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    score: 53,
                    flag: false
                },
                methods: {
                    handel: function () {
                        this.flag = !this.flag
                    }
                }
            })
        </script>
    </body>

    2.v-if与v-show的区别

    v-if控制元素是否渲染到页面 (基本上不会发生改动用v-if)

    v-show控制元素是否显示(已经渲染到了页面,频繁改动用v-show)

    3.循环结构

    v-for遍历数组

    <div v-text='item' v-for='item in fruits'></div>
    <div v-for='(item,index) in fruits'>{{item + ' ---' + index}}</div>

    key的作用:帮助Vue区分不同的元素,从而提高性能

    <div :key='item.id' v-for='(item,index) in list'>{{item}} + '---' {{index}}</div>

    示例代码:

    <body>
        <div id="app">
            <div v-text='item' v-for='item in fruits'></div>
            <div v-for='(item,index) in fruits'>{{item + ' ---' + index}}</div>
            <div :key='item.id' v-for='item in myFruits'>
                <span>{{item.ename}}</span>
                <span>---</span>
                <span>{{item.cname}}</span>
            </div>
    </div>
        <script src="vue.js"></script>
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    fruits: ['banner', 'orange', 'apple'],
                    myFruits: [{
                            id: 1,
                            ename: 'banana',
                            cname: '香蕉'
                        },
                        {
                            id: 2,
                            ename: 'apple',
                            cname: '苹果'
                        }, {
                            id: 3,
                            ename: 'orange',
                            cname: '橙子'
                        }
                    ]
                },
                methods: {
    ​
                }
            })
        </script>
    </body>
  • 相关阅读:
    Android设备驱动安装
    昨晚摆乌龙了
    生活
    SQLSTATE=57019
    IBM项目六
    不吸烟了
    清明短假
    『ExtJS』使用中需要注意的一些事(持续更新)
    『Spring.Net』IoC 容器
    『Spring.Net』为什么使用?
  • 原文地址:https://www.cnblogs.com/bky-/p/14060746.html
Copyright © 2020-2023  润新知