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>

  • 相关阅读:
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之六 多点触控
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之九 定位
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之七 重力感应
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之五 保存数据的几种方式
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之八 照相机
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之三 Application 配置详解
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之四 打开与关闭应用程序是的保存数据
    ADOBE FLASH BUILDER 4.6 IOS 开发之部署与调试
    [译] 高性能JavaScript 1至5章总结
    页签及盒子的web标准实现
  • 原文地址:https://www.cnblogs.com/tszr/p/15389995.html
Copyright © 2011-2022 走看看