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>

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

原文地址:https://www.cnblogs.com/qlqwjy/p/11889807.html