• vue简介、入门、模板语法


      在菜鸟教程上面学习的vue.js。同时结合vue中文文档网站,便于自己记录。

      vueAPI网站:API

    1. 简介

      Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架。Vue 只关注视图层, 采用自底向上增量开发的设计。Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

      Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统。

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="utf-8" />
            <title></title>
            <script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
        </head>
    
        <body>
            <div id="app">
                {{ message }}
            </div>
    
            <script>
                var app = new Vue({
                    el: '#app',
                    data: {
                        message: 'Hello Vue!'
                    }
                })
            </script>
        </body>
    
    </html>

    结果:

      已经成功创建了第一个 Vue 应用!看起来这跟渲染一个字符串模板非常类似,但是 Vue 在背后做了大量工作。现在数据和 DOM 已经被建立了关联,所有东西都是响应式的。我们要怎么确认呢?打开浏览器的 JavaScript 控制台 (就在这个页面打开),并修改 app.message 的值,可以相应地更新。

    除了文本插值,我们还可以像这样来绑定元素特性:

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="utf-8" />
            <title></title>
            <script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
        </head>
    
        <body>
            <div id="app-2">
                <span v-bind:title="message">
        鼠标悬停几秒钟查看此处动态绑定的提示信息!
      </span>
            </div>
    
            <script>
                var app2 = new Vue({
                    el: '#app-2',
                    data: {
                        message: '页面加载于 ' + new Date().toLocaleString()
                    }
                })
            </script>
        </body>
    
    </html>

    结果:

      这里我们遇到了一点新东西。你看到的 v-bind 特性被称为指令。指令带有前缀 v-,以表示它们是 Vue 提供的特殊特性。可能你已经猜到了,它们会在渲染的 DOM 上应用特殊的响应式行为。在这里,该指令的意思是:“将这个元素节点的 title 特性和 Vue 实例的 message 属性保持一致”。

    2.  入门

      每个 Vue 应用都需要通过实例化 Vue 来实现。当一个 Vue 实例被创建时,它向 Vue 的响应式系统中加入了其 data 对象中能找到的所有的属性。当这些属性的值发生改变时,html 视图将也会产生相应的变化。

    语法格式如下:

    var vm = new Vue({
      // 选项
    })

    实例如下:

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="utf-8" />
            <title></title>
            <script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
        </head>
    
        <body>
            <div id="vue_det">
                <h1>site : {{site}}</h1>
                <h1>url : {{url}}</h1>
                <h1>{{details()}}</h1>
            </div>
            <script type="text/javascript">
                var vm = new Vue({
                    el: '#vue_det',
                    data: {
                        site: "vue入门",
                        url: "www.baidu.com",
                        alexa: "10000"
                    },
                    methods: {
                        details: function() {
                            return this.site + " - 666!";
                        }
                    }
                })
            </script>
        </body>
    
    </html>

    结果:

    vue构造器解释:

            <div id="vue_det">
                <h1>site : {{site}}</h1>
                <h1>url : {{url}}</h1>
                <h1>{{details()}}</h1>
            </div>
            <script type="text/javascript">
                var vm = new Vue({
                    el: '#vue_det',
                    data: {
                        site: "vue入门",
                        url: "www.baidu.com",
                        alexa: "10000"
                    },
                    methods: {
                        details: function() {
                            return this.site + " - 666!";
                        }
                    }
                })
            </script>

    (1)可以看到在 Vue 构造器中有一个el 参数,它是 DOM 元素中的 id。在上面实例中 id 为 vue_det,在 div 元素中:

            <div id="vue_det">
                <h1>site : {{site}}</h1>
                <h1>url : {{url}}</h1>
                <h1>{{details()}}</h1>
            </div>

      这意味着我们接下来的改动全部在以上指定的 div 内,div 外部不受影响。

    (2)定义数据对象

    data 用于定义属性,实例中有三个属性分别为:site、url、alexa。

    methods 用于定义的函数,可以通过 return 来返回函数值。

    {{ }} 用于输出对象属性和函数返回值。

    (3)除了数据属性,Vue 实例还提供了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来。

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="utf-8" />
            <title></title>
            <script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
        </head>
    
        <body>
            <div id="vue_det">
                <h1>site : {{site}}</h1>
                <h1>url : {{url}}</h1>
                <h1>Alexa : {{alexa}}</h1>
            </div>
            <script type="text/javascript">
                // 我们的数据对象
                var data = {
                    site: "vue入门",
                    url: "www.baidu.com",
                    alexa: "10000"
                }
                var vm = new Vue({
                    el: '#vue_det',
                    data: data
                })
                document.write(vm.$data === data) // true
                document.write("<br>")
                document.write(vm.$el === document.getElementById('vue_det')) // true
            </script>
        </body>
    
    </html>

    结果:

    补充:vue中挂载点,模板,实例之间的关系

      vuex渲染的元素称为挂载点,元素之间的内容称为模板,模板也可以写在实例的template属性中。vue实例只会对挂载点内部的模板生效。

            <!--挂载点-->
            <div id="app">
                <!--模板在vue实例中-->
            </div>
            <script type="text/javascript">
                new Vue({
                    data: {
                        site: "vue入门"
                    },
                    template: "<h1>site : {{site}}</h1>"
                }).$mount('#app')
            </script>

    3.模板语法

    Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。
    Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。
    结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。

    3.1插值

    1.插入文本

      数据绑定最常见的形式就是使用 {{...}}(双大括号)的文本插值。

            <div id="app">
                <p>{{ message }}</p>
            </div>
            <script type="text/javascript">
                new Vue({
                    el: '#app',
                    data: {
                        message: 'Hello Vue.js!'
                    }
                })
            </script>

    结果:

    补充: v-once 指令渲染一次性值

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

            <div id="app">
                <p v-once>{{ message }}</p>
            </div>
            <script type="text/javascript">
                var app = new Vue({
                    el: '#app',
                    data: {
                        message: 'Hello Vue.js!'
                    }
                })
            </script>

     2.使用 v-html 指令用于输出 html 代码:

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

            <div id="app">
                <div>{{ message }}</div>
                <div v-html="message"></div>
            </div>
    
            <script>
                new Vue({
                    el: '#app',
                    data: {
                        message: '<h1>vue教程</h1>'
                    }
                })
            </script>

    结果:

    3. 属性

      HTML 属性中的值应使用 v-bind 指令。

    以下实例判断 class1 的值,如果use为 true 使用 class1 类的样式,否则不使用该类:

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="utf-8" />
            <title></title>
            <script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
    
            <style>
                .class1 {
                    color: red;
                }
            </style>
        </head>
    
        <body>
            <div id="app">
                <label for="r1">修改颜色</label><input type="checkbox" v-model="use" id="r1">
                <br><br>
                <div v-bind:class="{'class1': use}">
                    v-bind:class 指令
                </div>
            </div>
            <script>
                new Vue({
                    el: '#app',
                    data: {
                        use: true
                    }
                });
            </script>
        </body>
    
    </html>

    结果:

      

     4.表达式

      vue提供了完全的javascript表达式支持。

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="utf-8" />
            <title></title>
            <script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
    
            <style>
                #list-1 {
                    color: red;
                }
            </style>
        </head>
    
        <body>
            <div id="app">
                {{5+5}}
                <br>
                {{ ok ? 'YES' : 'NO' }}
                <br>
                {{ message.split('').reverse().join('') }}
                <div v-bind:id="'list-' + id">vue教程</div>
            </div>
    
            <script>
                new Vue({
                    el: '#app',
                    data: {
                        ok: true,
                        message: 'vue 666',
                        id: 1
                    }
                })
            </script>
        </body>
    
    </html>

    结果:

    3.2指令

      指令是带有 v- 前缀的特殊属性。指令用于在表达式的值改变时,将某些行为应用到DOM上。

    这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素。

            <div id="app">
                <p v-if="seen">现在你看到我了</p>
                <p v-if="!seen">现在你看不到我</p>
            </div>
            <script>
                var app = new Vue({
                    el: '#app',
                    data: {
                        seen: false
                    }
                })
            </script>

    结果:

    修改app.seen=true

    1. 参数

      参数在指令以后以冒号指明。

    例如:v-bind 指令被用来响应地更新 HTML 属性; v-on 指令用于监听 DOM 事件

            <div id="app">
                <pre><a v-bind:href="url">百度</a></pre>
                <pre><a v-on:click="clickEve(2)">点击</a></pre>
            </div>
            <script>
                new Vue({
                    el: '#app',
                    data: {
                        url: 'http://www.baidu.com'
                    },
                    methods: {
                        clickEve: function(code) {
                            alert(code);
                        }
                    }
                })
            </script>

    结果:

     2.修饰符

      修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():

      preventDefault() 方法阻止元素发生默认的行为。

            <div id="app">
                <form v-on:submit.prevent="onSubmit">
                    <input type="submit" />
                </form>
            </div>
            <script>
                new Vue({
                    el: '#app',
                    data: {
                        url: 'http://www.baidu.com'
                    },
                    methods: {
                        onSubmit: function() {
                            alert(123);
                        }
                    }
                })
            </script>

    3.用户输入

      v-model 指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值。

      按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。

            <div id="app">
                <p>{{ message }}</p>
                <input v-model="message">
            </div>
    
            <script>
                new Vue({
                    el: '#app',
                    data: {
                        message: 'vue!'
                    }
                })
            </script>

    结果:

    4.过滤器

      Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示,过滤器函数接受表达式的值作为第一个参数。过滤器可以串联:  

    {{ message | filterA | filterB }}

    过滤器是 JavaScript 函数,因此可以接受参数:

    {{ message | filterA('arg1', arg2) }}

      这里,message 是第一个参数,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。

    例如: message作为 filterA函数的参数;filterA函数的返回值作为filterB的第一个参数。

            <div id="app">
                {{ message | filterA | filterB('para1', 'para2') }}
            </div>
    
            <script>
                new Vue({
                    el: '#app',
                    data: {
                        message: 'vue study!'
                    },
                    filters: {
                        filterA: function(value) {
                            if (!value) return ''
                            value = value.toString()
                            return value.charAt(0).toUpperCase() + value.slice(1);
                        },
                        filterB: function(value, para1, para2) {
                            console.log(value);
                            console.log(para1);
                            console.log(para2);
                            return value;
                        }
                    }
                })
            </script>

    结果:

     5.缩写

     v-bind 缩写:

    <!-- 完整语法 -->
    <a v-bind:href="url"></a>
    <!-- 缩写 -->
    <a :href="url"></a>

    v-on 缩写:

    <!-- 完整语法 -->
    <a v-on:click="doSomething"></a>
    <!-- 缩写 -->
    <a @click="doSomething"></a>

    例如:

            <div id="app">
                <pre><a :href="url">百度</a></pre>
                <pre><a @click="clickEve(2)">点击</a></pre>
            </div>
            <script>
                new Vue({
                    el: '#app',
                    data: {
                        url: 'http://www.baidu.com'
                    },
                    methods: {
                        clickEve: function(code) {
                            alert(code);
                        }
                    }
                })
            </script>

    补充:vue的生命周期如下 

    官网给出的生命周期图如下:

    解释:

    beforeCreate:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。
    created:在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。
    beforeMount:在挂载开始之前被调用:相关的 render 函数首次被调用。
    mounted:el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。
    beforeUpdate:数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。
    updated:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
    beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。

     例如:

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="utf-8" />
            <title></title>
            <script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script>
        </head>
    
        <body>
            <div id="app-2">
                {{ getMsgs() }}
            </div>
            <script>
                var app2 = new Vue({
                    el: '#app-2',
                    data: {
                        msg: "这是信息"
                    },
                    methods: {
                        getMsgs: function() {
                            console.log(1 + this.msg)
                            return this.msg;
                        }
                    },
                    beforeCreate: function() {
                        console.log(2 + "  " + this.msg);
                    },
                    created: function() {
                        console.log(3 + "  " + this.msg);
                    },
                    beforeMount: function() {
                        console.log(4 + "  " + this.msg);
                    },
                    mounted: function() {
                        this.msg = "new Value";
                        console.log(5 + "  " + this.msg);
                    },
                    beforeUpdate() {
                        console.log(6 + "  " + this.msg);
                    },
                    updated() {
                        console.log(7 + "  " + this.msg);
                    },
                    beforeDestroy() {
                        console.log(8 + "  " + this.msg);
                    },
                    destroyed: function() {
                        console.log(9 + "  " + this.msg);
                    }
                })
            </script>
        </body>
    
    </html>

    结果:(可以看到执行顺序)

  • 相关阅读:
    CCF第四题无向图打印路径 欧拉问题
    20160330训练赛
    POJ 3281 网络流dinic算法
    校赛E题递归形式
    Mbx1996
    good luck
    hdu1054 树形dp&&二分图
    补上题代码 hdu1520
    hdu1520 树形dp Anniversary party
    2018 Multi-University Training Contest 2
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/11889807.html
Copyright © 2020-2023  润新知