Vue.js实例和模板语法

上一节中,通过对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);
    }
});

生命周期的不同阶段调用,如 mountedupdateddestroyed 。钩子的 this 指向调用它的 Vue 实例。

lifecycle

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>

演示


关注我

我的微信公众号:前端开发博客,在后台回复以下关键字可以获取资源。

  • 回复「小抄」,领取Vue、JavaScript 和 WebComponent 小抄 PDF
  • 回复「Vue脑图」获取 Vue 相关脑图
  • 回复「思维图」获取 JavaScript 相关思维图
  • 回复「简历」获取简历制作建议
  • 回复「简历模板」获取精选的简历模板
  • 回复「加群」进入500人前端精英群
  • 回复「电子书」下载我整理的大量前端资源,含面试、Vue实战项目、CSS和JavaScript电子书等。
  • 回复「知识点」下载高清JavaScript知识点图谱

每日分享有用的前端开发知识,加我微信:caibaojian89 交流