Vue 指令与事件

指令,Directives,Vue 模板中最常用的一项功能。
它带有 v- 前缀,如:v-if,v-html,v-pre等。
主要职责是,当其表达式的值改变时,相应地将某些行为应用到DOM上。

以 v-if 为例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例</title>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
    <p v-if="show">显示这段文本</p>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            show: true
        }
    })
</script>
</body>
</html>

上述代码将转化为:

<html><head>
<meta charset="utf-8">
<title>Vue 测试实例</title>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app"><p>显示这段文本</p></div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            show: true
        }
    })
</script>

</body></html>

而当下面的代码时:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例</title>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
    <p v-if="show">显示这段文本</p>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            show: false
        }
    })
</script>
</body>
</html>

则转化为:

<html><head>
<meta charset="utf-8">
<title>Vue 测试实例</title>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app"><!----></div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            show: false
        }
    })
</script>

</body></html>

v-bind,动态更新HTML 元素上的属性,比如:id、class等

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例</title>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
</head>
<body>
<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>
</body>
</html>

转化为:

<html><head>
<meta charset="utf-8">
<title>Vue 测试实例</title>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app"><a href="https://www.github.com">链接</a> <img src="http://xxx.xxx.xx/img.png"></div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            url: 'https://www.github.com',
            imgUrl: 'http://xxx.xxx.xx/img.png'
        }
    })
</script>

</body></html>

v-on,绑定事件监听器

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例</title>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
    <p v-if="show">这是一段文本</p>
    <button v-on:click="handleClose">点击隐藏</button>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            show: true
        },
        methods: {
            handleClose: function () {
                this.show = false
            }
        }
    })
</script>
</body>
</html>

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

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例</title>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
    <p v-if="show">这是一段文本</p>
    <button v-on:click="show = false">点击隐藏</button>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            show: true
        }
    })
</script>
</body>
</html>

vue 将 methods 里的方法也代理了,所以也可以像访问 Vue数据那样来调用方法:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例</title>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
    <p v-if="show">这是一段文本</p>
    <button v-on:click="handleClose">点击隐藏</button>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            show: true
        },
        methods: {
            handleClose: function () {
                this.close()
            },
            close: function () {
                this.show = false
            }
        }
    })
</script>
</body>
</html>

正确的使用,上面只是展示用法:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例</title>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
</head>
<body>
<div id="app">
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            show: true
        },
        methods: {
            init: function (text) {
                console.log(text)
            }
        },
        mounted : function () {
            this.init('在初始化时调用')
        }
    })

    app.init('通过外部调用')
</script>
</body>
</html>