zoukankan      html  css  js  c++  java
  • VUE学习笔记--Vue的模板语法

           Vue.js使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue.js的模板都是合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析。
           在底层的实现上,Vue将模板编译成虚拟DOM渲染函数。结合响应系统,Vue能够智能地计算出最少需要重新渲染多少组件,并把DOM操作次数减到最少。
    简单的说:Vue模板语法就是前端渲染,前端渲染即是把数据填充到html标签中。数据(来自服务器)+模板(html标签)=前端渲染(产物是静态html内容)。
    插值
    插值就是将数据插入到 html 文档中,包含文本、html 元素、元素属性等。
    1. 文本插值 
    文本插值中用得最多的就是用双大括号的形式
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <!-- 会与实例中的【data】中的属性绑定在一起,并且数据实现同步-->
        <h1>{{ message }}</h1>
    </div>
    <script>
        // Vue所做的工作也就是把数据填充把页面的标签里面。
        var vm = new Vue({
            el: "#app",
            // data模型数据,值是一个对象。
            data: {
                message: "I LOVE YOU"
            }
        })
    </script>
    
    </body>
    </html>

    上面代码中当 data 中的值更新之后我们不需要操作 html,页面中会自动更新数据。 我们也可以让数据只绑定一次,在以后更新 data 中的属性时不再更新页面数据
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <!-- v-once只编译一次。显式内容之后不再具有响应式功能。 -->
        <!-- v-once的应用场景,如果显式的信息后续不需要再修改,可以使用v-once指令,可以可以提高性能,因为Vue就不需要去监听它的变化了。 -->
        <h1 v-once>{{message}}</h1>
    </div>
    <script>
        // Vue所做的工作也就是把数据填充把页面的标签里面。
        var vm = new Vue({
            el: "#app",
            // data模型数据,值是一个对象。
            data: {
                message: "I LOVE YOU"
            }
        })
    </script>
    
    </body>
    </html>
    2. HTML 插值 
    双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你 需要使用 v-html
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <!-- 内容按普通 HTML 插入 - 不会作为 Vue 模板进行编译,在网站上动态渲染任意 HTML 是非常危险的,因为容易导致 XSS 攻击 -->
        <h1 v-html="msg"></h1>
    
    </div>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                msg: "<span style='color:blue'>BLUE</span>"//可以使用v-html标签展示html代码。
            }
        })
    
    </script>
    
    </body>
    </html>

    3. 属性插值 
    在开发的时候,有时候我们的属性不是写死的,有可能是根据我们的一些数据动态地决 定的,比如图片标签(<img>)的 src 属性,我们可能从后端请求了一个包含图片地址的数 组,需要将地址动态的绑定到 src 上面,这时就不能简单的将 src 写死。还有一个例子就是 a 标签的 href 属性。这时可以使用 v-bind:指令,其中,v-bind:可以缩写成:
    使用 v-bind:指令绑定属性
    
    <!DOCTYPE html>
    <html xmlns:v-bind="http://www.w3.org/1999/xhtml">
    <head lang="en">
        <meta charset="UTF-8">
        <title>aa</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <img v-bind:src="imgUrl" alt=""/>
        <a  :href="searchUrl">百度一下</a>
    </div>
    </body>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                imgUrl:'F://vuewk//src//assets//1.jpg',
                searchUrl:'http://www.baidu.com'
            }
        })
    </script>
    </html>
    服务器请求过来的数据,我们一般都会在 data 那里做一下中转,做完中转过后再把需 要的变量绑定到对应的属性上面。
    v-bind 除了在开发中用在有特殊意义的属性外(src, href 等),也可以绑定其他一些 属性,如 Class 与 Style 绑定
    <!DOCTYPE html>
    <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
    <head>
        <meta charset="UTF-8">
        <title>v-bind动态绑定属性class</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <p :class="{fontCol:isName,setBack:!isAge}" class="weight">{{name}}</p>
        <i :class="addClass">{{name}}真好看!</i>
    </div>
    <script>
        var vm = new Vue({
            el:"#app",
            // 条件比较少
            data:{
                isName:true,
                isAge:false,
                name:"功守道"
            },
            //当v-bind:class的表达式过长或者逻辑复杂(一般当条件多于两个的时候),可以考虑采用计算属性,返回一个对象
            computed:{
                addClass:function(){
                    return {
                        checked:this.isName&&!this.isAge
                    }
                }
            }
        })
    </script>
    </body>
    </html>

    既然是一个对象,那么该对象内的属性可能不唯一,但总是每一项为真的时候,对应的 类名就会存在。通过 v-bind 更新的类名和元素本身存在的类名不冲突,可以优雅的共存

    v-bind 动态绑定属性 style
    
    <!DOCTYPE html>
    <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
    <head>
        <meta charset="UTF-8">
        <title>v-bind动态绑定属性style</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <div :style="{'color': color,'fontSize':fontSize + 'px'}">修饰文本</div>
    </div>
    <script>
        var vm= new Vue({
            el: "#app",
            data: {
                color: 'red',
                fontSize: 24
            }
        })
    </script>
    </body>
    </html>
    大多情况下,标签中直接写一长串的样式不便于阅读和维护,所以一般写在 dada 或 computed 里,代码如下:
    <div id="app">
        <div :style="{'color': color,'fontSize':fontSize + 'px'}">修饰文本</div>
    </div>
    <script>
        var vm= new Vue({1
            el: "#app",
            data: {
                styles:{
                color: 'red',
                fontSize: 24
             }
           }
        })
    </script>
    应用多个样式对象时,可以使用数组语法
    <!DOCTYPE html>
    <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
    <head>
        <meta charset="UTF-8">
        <title>v-bind动态绑定属性style</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <div :style="[styleA,styleB]">文本</div>
    </div>
    <script>
        var vm=new Vue({
            el: "#app",
            data: {
                styleA:{
                    color: 'red',
                    fontSize: 24 + 'px'
                },
                styleB: {
                     100 + 'px',
                    border: 1 + 'px ' + 'black ' + 'solid'
                }
            }
        })
    </script>
    </body>
    </html>

    4. 插值中使用 Javascript 表达式 
    
    实际上,对 于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持
    
    部分 表达式格式代码如下:
    {{ number + 1 }} 
    {{ ok ? 'YES' : 'NO' }}
    {{ message.split('').reverse().join('') }}
     <div v-bind:id="'list-' + id">
    </div>
    
    这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就 是,每个绑定都只能包含单个表达式,所以下面的表达式都不会生效,代码如下:
    <!-- 这是语句,不是表达式 -->
     {{ var a = 1 }} 
    <!-- 流控制也不会生效,请使用三元表达式 --> 
    {{ if (ok) { return message } }}
    使用 Javascript 表达式
    
    <!DOCTYPE html>
    <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <p>{{ number + 1 }}</p>
        <hr>
        <p>{{msg + '~~~~~'}}</p>
        <hr>
        <p>{{flag ? '条件为真' : '条件为假'}}</p>
        <hr>
    </div>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                msg:'Hello beixi!',
                flag:true,
                number:2
            }
        })
    </script>
    </body>
    </html>
    指令
    指令其实在上面我们已经使用过了【v-bind:】和【v-html】,指令就是值这些带有 v- 前 缀的特殊属性。
     1.参数 
    一些指令能够接收一个“参数”,在指令名称之后以冒号表示。如 v-bind 指令可以用 于响应式地更新 HTML attribute,代码如下:
    <a v-bind:href="url">...</a>
    
    在这里 href 是参数,告知 v-bind 指令将该元素的 href attribute 与表达式 url 的值绑定。
    2.动态参数 
    从 2.6.0 开始,可以用方括号括起来的 JavaScript 表达式作为一个指令的参数,响应式 使得 vue 更加灵活多变,其动态参数也是有其含义的,代码如下:
    <a v-bind:[attributeName] = 'url'>...</a>
    
    同样的,当 eventName 的值为‘focus’时,v-on:[eventName]将等价于 v-on:focus。
    当然动态参数的值也是有约束的,动态参数预期会求出一个字符串,异常情况下值为 null。这个特殊的 null 值可以被显性地用于移出绑定。任何其他非字符串类型的值都将会触 发一个警告。
    3.修饰符 
    修饰符(Modifiers)是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊 方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调 event.preventDefault(), 代码如下:
    <form v-on:submit.prevent="onSubmit">...</form>
    过滤器
     过滤器分全局过滤器和局部过滤器,全局过滤器在项目中使用频率非常高。
    定义过滤器 
    全局过滤器
    
    Vue.filter('过滤器名称', function (value1[,value2,...] ) { 
    //逻辑代码 
    })
    
    局部过滤器
    
    new Vue({
       filters: { 
             '过滤器名称': function (value1[,value2,...] ) {
                   // 逻辑代码
                            }
                        } 
    })
    2. 过滤器使用的地方 
    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个 地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持)。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符号指示,格式代码如下:
    
    <!-- 在双花括号中 -->
     <div>{{数据属性名称 | 过滤器名称}}</div> 
     <div>{{数据属性名称 | 过滤器名称(参数值)}}</div> 
    <!-- 在 v-bind 中 --> 
    <div v-bind:id="数据属性名称 | 过滤器名称"></div> 
    <div v-bind:id="数据属性名称 | 过滤器名称(参数值)"></div>
    <!DOCTYPE html>
    <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <!--文本后边需要添加管道符号( | )作为分隔,管道符 | 后边是文本的处理函数,处理函数的第一个参数是:管道符前边的——文本内容,如果处理函数上边传递参数,则从第二个参数依次往后是传递的参数。-->
        <p>电脑价格:{{price | addPriceIcon}}</p>
    </div>
    
    <script>
        var vm = new Vue({
            el:"#app",
            data:{
                price:200
            },
            filters:{
                //处理函数
                addPriceIcon(value){
                    console.log(value)//200
                    return '¥' + value;
                }
            }
        })
    </script>
    </body>
    </html>

    <!DOCTYPE html>
    <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <!--过滤器接收多个参数-->
        <span>{{value1|multiple(value2,value3)}}</span>
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                msg: 'hello',
                value1:10,
                value2:20,
                value3:30
            },
            //局部过滤器
            filters: {
                'multiple': function (value1, value2, value3) {
                    return value1*value2*value3
                }
            }
        })
    </script>
    </body>
    </html>
    <!DOCTYPE html>
    <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" >
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    </head>
    <body>
    <div id="app">
        <h3>{{viewContent | addNamePrefix}}</h3>
    </div>
    <script>
        /*addNamePrefix是过滤器的名字,也是管道符后边的处理函数;value是参数*/
        Vue.filter("addNamePrefix",(value)=>{
            return "my name is" + value
        })
        var vm = new Vue({
            el:"#app",
            data:{
                viewContent:"贝西"
            }
        })
    </script>
    </body>
    </html>

  • 相关阅读:
    二、Cocos2dx概念介绍(游戏开发中不同的坐标系,cocos2dx锚点)
    (2)入门指南——(7)添加jquery代码(Adding our jQuery code)
    Citrix 服务器虚拟化之三十一 XenApp 6.5负载均衡
    CSS——inline-block属性
    VMware Workstation(虚拟机软件) V10.0 简体中文版可以安装了
    [.NET MVC4 入门系列01]Helloworld MVC 4 第一个MVC4程序
    ElasticSearch NEST笔记
    什么是REST API?
    ArrayList与List<T>笔记
    C# Socket SSL通讯笔记
  • 原文地址:https://www.cnblogs.com/tszr/p/15389995.html
Copyright © 2011-2022 走看看