上一节中,通过对Vue.js的一个介绍,我们认识了声明{{}}、指令v-bind、条件语法v-if、过渡transition、循环v-for、数据绑定v-on、双向更新v-model、组件Vue.component()。接下来学习一下更详细的内容:Vue.js实例和模板语法等。
构造器
每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的:
var vm = new Vue({ // 选项 })
在实例化 Vue 时,需要传入一个选项对象,它可以包含数据、模板、挂载元素、方法、生命周期钩子等选项。
属性和方法
每个 Vue 实例都会代理其 data
对象里所有的属性:
<div id="app"> <p>{{message}}</p> <todo-item todo="这是一个自定义属性,他会赋值给模板"></todo-item> <todos v-for="todo in todos" v-bind:todo="todo"></todos> </div>
var Component = Vue.extend({
data: function() {
return {
_title: 'vue.js'
}
}
})
//在组件的todo属性中直接赋值
Vue.component('todo-item', {
props: ['todo', 'myMessage'],
template: '<p>{{todo}}</p>'
});
//通过循环数组给它赋值
Vue.component('todos', {
props: ['todo'],
template: '<p>{{todo.text}}</p>'
})
var data = {
message: 'hello qdkfweb.cn',
_title: 'learn js',
$app: 'app',
todos: [{
text: 'hello qdkfweb.cn'
},
{
text: 'learn javascript'
}]
}
var vm = new Vue({
el: '#app',
data: data
});
vm.message = 'hello';
vm.$data.message = 'qdkfweb.cn';
console.log(vm.$data.message); //qdkfweb.cn
console.log(vm.$data._title); // learn js
console.log(vm.$data.$app); //app
//除了 data 属性, Vue 实例暴露了一些有用的实例属性与方法。
//这些属性与方法都有前缀 $
,以便与代理的 data 属性区分。
console.log(vm.$el === document.getElementById('app')); //true
console.log(vm.$data === data); //true
//使用_或者$开头的属性无法使用代理的方式调用,需要加上vm.$data._title
console.log(vm._title); //undefined
vm.$watch('message',
function(newVal, oldVal) {
//这个回调将在 vm.message 改变后调用
})
生命周期
var vm = new Vue({ el: '#app', data: data, created: function() { console.log('message is:' + this.message); } });
生命周期的不同阶段调用,如 mounted
、 updated
、destroyed
。钩子的 this
指向调用它的 Vue 实例。
Vue模板和语法
Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。在底层的实现上, Vue 将模板编译成虚拟 DOM 渲染函数。结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。
插值
文本
{{}}数据绑定最常见的就是Mustache(双括号)的文本插值,使用v-once指令,可以执行一次插值,后面如果有改变,将不会更新。
<p v-once>{{message}}</p>
HTML
你还可以插入HTML使用指令v-html
<div id="app-2"> <p v-once>这里的数据只会执行一次更新:{{message}}</p> <div v-html="rawHtml">自定义html</div> </div>
var app2 = new Vue({ el:'#app-2', data:{ message:'第一次更新', rawHtml:'<ol><li>这里是自定义html</li><li>这里是自定义html</li></ol>' } }) app2.message = '第二次更新没有赋值';
属性
Mustache{{}} 不能在 HTML 属性中使用,应使用 v-bind 指令
<div v-bind:id="dynamicId"></div>
<button v-bind:disabled="someDynamicCondition">Button</button>
值为 false 的话该属性会被移除
JavaScript表达式
每个绑定都只能包含单个表达式
{{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.split('').reverse().join('') }} <div v-bind:id="'list-' + id"></div>
过滤器
个人理解,是通过后面的函数对前面这个值做一个变化,得出需要的内容
Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。过滤器应该被添加在 mustache 插值的尾部,由“管道符”指示:
{{ message | capitalize }} new Vue({ // 将message的值首字母变为大写,其它不变 filters: { capitalize: function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) } } })
过滤器可以串联:
{{ message | filterA | filterB }}
过滤器是 JavaScript 函数,因此可以接受参数:
{{ message | filterA('arg1', arg2) }}
这里,字符串 ‘arg1’ 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。
指令
v-if、v-on、v-bind
指令(Directives)是带有 v-
前缀的特殊属性。指令属性的值预期是单一 JavaScript 表达式(除了 v-for
,之后再讨论)。指令的职责就是当其表达式的值改变时相应地将某些行为应用到 DOM 上。前面的一篇文章讲过这里的,就不再重复代码了。
修饰符
修饰符(Modifiers)是以半角句号 . 指明的特殊后缀,用于指出一个指定应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
<form v-on:submit.prevent="onSubmit"></form>
缩写
v-bind 缩写
<!-- 完整语法 --> <a v-bind:href="url"></a> <!-- 缩写 --> <a :href="url"></a>
v-on 缩写
<!-- 完整语法 --> <a v-on:click="doSomething"></a> <!-- 缩写 --> <a @click="doSomething"></a>