美文网首页Vue我爱编程
Vue 学习笔记(二)

Vue 学习笔记(二)

作者: 嗨超儿 | 来源:发表于2018-06-10 23:33 被阅读11次

    1、Vue实例与数据绑定

    1.1 实例与数据

    Vue.js应用的创建很简单,通过构造函数Vue就可以创建一个Vue的根实例,并启动Vue应用:

    var app = new Vue({
        // 选项
    });
    

    变量app就代表了这个实例。
    首先,必不可少的一个选项就是el。el用于指定一个页面中已存在的DOM元素来挂载Vue实例。

    <div id="app">{{ name }}</div>
    var app = new Vue({
        el: document.getElementById('app'), // 或者 ‘#app’
        data :{
            name: 'Hello World'
        }
    });
    

    其次,通过Vue实例的data选项,可以声明应用内需要双向绑定的数据。建议所有会用到得数据都预先在data内声明,这样不至于将数据散落在业务逻辑中,难以维护。
    除了显示得声明数据外,也可以指向已有得变量,并且它们之间默认建立了双向绑定,当修改其中任意一项时,另一个也会一起变化,即匹配更新为新的值。

    var myData = {
        a:1
    };
    var app = new Vue({
        el: ‘#app’,
        data: myData
    });
    console.log(app.a); // 1
    // 修改属性,原数据也会随之改变
    app.a = 2;
    console.log(myData.a); // 2
    // 反之,修改原数据,Vue属性也会改变
    myData.a = 3;
    console.log(app.a); // 3
    

    1.2 Vue生命周期

    每个Vue实例创建时,都会经历一系列得初始化过程,同时也会调用相应的生命周期钩子,我们可以利用这些钩子,在合适的时机执行我们的业务逻辑。例如jQuery的ready()方法。

    $(document).ready(function(){
        // DOM加载完成后,会执行这里得代码
    });
    

    Vue的生命周期与之类似

    vue生命周期图
    Vue2.0 Description
    beforeCreate 组件实例刚被创建,组件属性计算之前,如data属性等
    created 组件实例创建完成,属性已绑定,但DOM还未生成,$el 属性还不存在,需要初始化处理一些数据时会比较有用。
    beforeMount 模版编译/挂载之前
    mounted 模版编译/挂载之后,一般我们的第一个业务逻辑会在这里开始。
    beforUpdate 组件更新之前
    updated 组件更新之后
    activated for keep-alive,组件被激活时调用
    deactivated for keep-alive,组件被移除时调用
    beforeDestory 组件销毁前调用,主要解绑一些使用addEventListener监听的事件等。
    destroyed 组件销毁后调用

    1.3 插值与表达式

    文本
    数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值:

    <span>Message: {{ msg }}</span>
    

    Mustache 标签将会被替代为对应数据对象上msg属性的值。无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会更新。

    原始 HTML
    双大括号会将数据解释为普通文本,而非HTML代码。为了输出真正的 HTML,你需要使用 v-html 指令:

    <p>Using v-html directive: <span v-html="rawHtml"></span></p>
    

    这里需要注意,如果将用户产生得内容使用v-html输出后,有可能导致XSS攻击,所以要在服务端对用户提交得内容进行处理,一般可将尖括号“<>”转义。

    v-pre
    如果想显示{{}}标签,而不进行替换,使用v-pre即可跳过这个元素和它子元素得编译过程。

    <span>{{ 这里的内容是不会被编译的 }}</span>
    

    特性
    Mustache 语法不能作用在 HTML 特性上,遇到这种情况应该使用 v-bind 指令:

    <div v-bind:id="dynamicId"></div>
    

    使用 JavaScript 表达式
    对于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持

    {{ number + 1 }}
    
    {{ ok ? 'YES' : 'NO' }}
    
    {{ message.split('').reverse().join('') }}
    
    <div v-bind:id="'list-' + id"></div>
    

    Vue.js只支持单个表达式,不支持语句和流控制。另外在表达式中,不能使用用户自定义的全局变量,只能使用Vue白名单内的全局变量,例如Math和Date。以下是一些无效得示例:

    <!-- 这是语句,不是表达式-->
    {{ let name = "hello world" }}
    <!-- 不能使用流控制,要使用三元运算 -->
    {{ if (ok) { return msg } }}
    

    2、指令与事件

    指令 (Directives) 是带有 v- 前缀的特殊特性。指令特性的值预期是单个 JavaScript 表达式 (v-for是例外情况)。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于DOM

    2.1 参数

    v-bind 一些指令能够接收一个“参数”,在指令名称之后以冒号表示。例如,v-bind 指令可以用于响应式地更新 HTML 特性,比如id,class等。

    <div id="app">
        <a v-bind:href="url">链接</a>
        <img v-bind:src="imgUrl">
    </div>
    <script>
        var app = new Vue({
            el:'#app',
            data:{
                url: "https://www.github.com",
                imgUrl: "http://xxx.xxx.xx/img.png"
            }
        });
    </script>
    

    示例中的链接地址与图片得地址都与数据进行了绑定,当通过各种方式改变数据时,链接和图片都会自动更新。

    v-on另一个例子是 v-on 指令,它用于监听 DOM 事件:

    <div id="app">
        <p v-if="isShow">看见还是看不见?</p>
        <button v-on:click="handleClose">点击隐藏</button>
    </div>
    <script>
        var app = new Vue({
           el:'#app',
           data:{
               isShow:true
           },
           methods:{
               handleClose(){
                   this.isShow = false;
               }
           }
        });
    </script>
    

    在button 按钮上使用v-on:click给元素绑定一个点击事件,在普通元素上,v-on可以监听原生DOM事件。除click外,还有dblclick、keyup、mousemove等。表达式可以是一个方法名,这些方法都写在Vue实例得methods属性内,并且是函数的形式,函数内this指向的当前Vue实例本身,因此可以直接使用this.xxx的形式来访问或修改数据。
    表达式除了方法外,也可以直接是一个内联语句,上例也可以改为:

    <div id="app">
        <p v-if="isShow">看见还是看不见?</p>
        <button v-on:click="show = false">点击隐藏</button>
    </div>
    <script>
        var app = new Vue({
           el:'#app',
           data:{
               isShow:true
           }
        });
    </script>
    

    这种场景只适用于简单得业务逻辑,如果绑定的事件要处理复杂得业务逻辑,建议还是在mothods里声明一个方法,这样可读性更强也利于维护。

    2.2 语法糖

    语法糖是指在不影响功能得情况下,添加某种方法实现同样得效果,从而方便程序开发。
    Vue.js的v-bind和v-on都提供了语法糖,也可以说是缩写,
    v-bind,可以直接省略v-bind,直接写一个冒号“:”:

    <a v-bind:href="url">链接</a>
    <img v-bind:src="imgUrl">
    <!-- 缩写为 -->
    <a :href="url">
    <img :src="imgUrl">
    

    v-on可以直接用“@”来缩写:

    <button v-on:click="handleClose">点击隐藏</button>
    <!-- 缩写为 -->
    <button @click="handleClose">点击隐藏</button>
    

    3、class与style绑定

    3.1 绑定class的几种方法

    1. 对象语法

    给v-bind:class设置一个对象,可以动态的切换class,例如:

    <div id="app">
        <div :class="{ 'active': isActive }"></div>
    </div>
    <script>
        var app = new Vue({
           el: '#app',
           data:{
               isActive: true
           } 
        });
    

    上面示例中,类名active依赖与数据isActive,当其为true时,div会拥有类名active,为false时则没有,所以上面示例的最终渲染结果为:

    <div class="active"></div>
    

    当:class的表达式过长或逻辑复杂时,还可以绑定一个计算属性,这是一种很友好很常见的方法,一般当条件多于两个时,都可以使用data或者computed,例如使用计算属性:

    <div id="app">
        <div :class="classes"></div> 
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                isActive: true,
                error: null
            },
            computed:{
                classes(){
                    return {
                        active: this.isActive && !this.error,
                        'text-fail': this.error && this.error.type==='fail'
                    };
                }
            }
        });
    </script>
    

    除了计算属性,你也可以直接绑定一个object类型的数据,或者使用类似计算属性的mothods。

    2. 数组语法

    当需要多个class时,可以直接使用数组语法,给:class 绑定一个数组,应用一个class列表:

    <div id="app">
        <div :class="[activeCls,errorCls]"></div>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                activeCls: 'active',
                errorCls: 'error'
            }
        });
    </script>
    

    渲染的结果为:

    <div class="active,error"></div>
    

    也可使用三元运算表达式来根据条件切换class,例如下面的例子:

    <div id="app">
        <div :class="[isActive ? activeCls : '',errorCls]"></div>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                isActive: true,
                activeCls: 'active',
                errorCls: 'error'
            }
        });
    </script>
    

    与数组语法一样,也可以使用data,computed和methods三种方法。

    3.2 绑定内联样式
    使用v-bind:style(即:style)可以给元素绑定内联样式,方法与:class类似,也有对象语法和数组语法,看起来就像直接在元素上写css:

    <div id="app">
        <div :style="{'color':color, 'fontSize':fontSize + 'px' }">文本</div>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                color: red,
                fontSize: 14,
            }
        });
    </script>
    

    css属性名称使用驼峰命名(camelCase)或者短横线分割命名(kebab-case),渲染后的结果为:

    <div style="color:red;font-size:14px;">文本</div>
    

    大多数情况下,直接写一长串的样式不便于阅读和维护,所以一般写在data或computed里,以data为例:

        <div id="app">
        <div :style="styles">文本</div>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                styles: {
                    color: 'red',
                    fontSize: 14 + 'px',
                }
            }
        });
    </script>
    

    应用多个样式时,可以使用数组语法:

    <div :style=[styleA,styleB]>文本</div>
    

    在实际业务中,:style的数组语法不常用,因为往往可以写在一个对象里面;而较为常用的应当是计算属性。
    另外,使用:style时,Vue.js会自动给特殊的css属性名称增加前缀,比如transform。

    参考资料-Vue.js
    参考资料-Vue.js实战

    相关文章

      网友评论

        本文标题:Vue 学习笔记(二)

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