Vue 入门示例
[ 插值 ] Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>Demo</title>
<!-- 1. 导入 Vue 的包 -->
<script src="lib/vue.js"></script>
</head>
<body>
<!-- 将来 new 的 Vue 实例,会控制这个元素中的所有内容 -->
<div id="app">{{ message }}</div>
<script type="text/javascript">
// 2. 创建一个 Vue 实例
// 当我们导入包之后,在浏览器当内存中,就多了一个 Vue 构造函数
var vm = new Vue({
el:'#app', // 表示,当前new的Vue实例,要控制页面上的哪个区域
data:{ // data属性中,存放的是el中要用到的数据
message:'hello,Vue !' // 通过 Vue 提供的指令,很方便的就能把数据渲染到页面中,程序员不再手动操作dom元素了
}
})
</script>
</body>
</html>
这看起来跟单单渲染了一个字符串模板非常类似,但是 Vue 在背后做了大量工作。
Now,数据和 DOM 已经绑定在一起( 被建立了关联 ),所有东西都是响应式的。
要怎么确认呢?打开你的浏览器( 当前页面 )的控制台,并修改 app.message 的值,你将看到上例相应地更新。
[ 指令 ] 除了文本插值,我们还可以像这样来绑定 DOM 元素特性:
<div id="app">
<p v-bind:title="message">
鼠标悬停几秒钟查看此处动态绑定的提示信息
</p>
</div>
<script type="text/javascript">
var app2 = new Vue({
el:'#app',
data:{
message:'页面加载于' + new Date().toLocaleString()
}
});
</script>
v-bind 特性被称为指令。指令带有前缀 v-,以表示它们是 Vue.js 提供的特殊属性。
它们会在渲染过的 DOM 上应用特殊的响应式行为。
在这里,该指令表示:“将这个元素节点的 title 特性和 Vue 实例的 message 属性保持一致”。如果你再次打开浏览器的控制台,输入 app2.meaage = '新消息',就会再一次看到这个绑定了 title 特性的 HTML 已经进行了更新。
[ 条件与循环 ] 我们不仅可以把数据绑定到 DOM 文本或特性,还可以绑定到 DOM 结构。
// 控制切换一个元素是否显示
<div id="app">
<p v-if="seen">
现在你看到我了
</p>
</div>
<script type="text/javascript">
var app = new Vue({
el:'#app',
data:{
seen:true
}
});
</script>
// 继续在控制台输入 app.seen = 'false',你会发现之前显示的消息消失了。
此外,Vue 也提供一个强大的过渡效果系统?!,可以在 Vue 插入/更新/移除元素时自动应用过渡效果。
还有其它很多指令,每个都有特殊的功能。例如,v-for 指令可以绑定数组的数据来渲染一个项目列表:
<div id="app">
<ol>
<li v-for="todo in todos">
{{ todo.text }}
</li>
</ol>
</div>
<script type="text/javascript">
var app = new Vue({
el:'#app',
data:{
todos:[
{ text:'学习js' },
{ text:'学习Vue' },
{ text:'整个牛项目' }
]
}
});
</script>
// 在控制台输入app.todos.push({text:'新项目'}),可以在列表最后添加一个新项目
[ 处理用户输入 ] 为了让用户和应用进行交互,可以用 v-on 指令添加一个事件监听器,通过它调用在实例中定义的方法:
<div id="app">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">逆转消息</button>
</div>
<script type="text/javascript">
var app = new Vue({
el:'#app',
data:{
message:'Hello,Vue!'
},
methods:{
reverseMessage:function(){
this.message = this.message.split('').reverse().join('')
}
}
});
</script>
// 在reverseMessage方法中,我们更新了应用的状态,但没有触碰 DOM - 所有的DOM操作都由Vue来处理,你编写的代码只需要关注逻辑层面即可。
Vue 还提供了 v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。
<div id="app"> <input type="text" v-model="msg"> <p>{{msg}}</p> </div> <script type="text/javascript"> var vm = new Vue({ el:'#app', data:{ msg:'' } }); </script>
[ 组件化应用构建 ] 组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:

在 Vue 里,一个组件本质上是一个拥有预定义选项的一个 Vue 实例。在 Vue 中注册组件很简单:
// 全局注册,定义名为 todo-item 的新组件 Vue.component('todo-item', { template: '<li>这是个待办项</li>' }) 现在可以用它构建另一个组件模板: <ol> <!-- 创建一个 todo-item 组件的实例 --> <todo-item></todo-item> </ol> // 说明:要确保在初始化根实例之前注册了组件但,这样会为每个待办项( todo-item )渲染同样的文本,这看起来并不炫酷。
我们应该能从父作用域将数据传到子组件才对。让我们修改一下组件的定义,使之能够接受一个 prop:
Vue.component('todo-item', { // todo-item 组件现在接受一个 // "prop",类似于一个自定义特性。 // 这个 prop 名为 todo。 props: ['todo'], template: '<li>{{ todo.text }}</li>' })
// 代码示例 — 现在,我们可以使用
v-bind指令将待办项传到循环输出的每个组件中:<div id="app-7"> <ol> <!-- 现在我们为每个 todo-item 提供 todo 对象 todo 对象是变量,即其内容可以是动态的。 我们也需要为每个组件提供一个“key”,稍后再作详细解释。 --> <todo-item v-for="item in groceryList" v-bind:todo="item" v-bind:key="item.id"></todo-item> </ol> </div>Vue.component('todo-item', { props: ['todo'], template: '<li>{{ todo.text }}</li>' }) var app7 = new Vue({ el: '#app-7', data: { groceryList: [ { id: 0, text: '蔬菜' }, { id: 1, text: '奶酪' }, { id: 2, text: '随便其它什么人吃的东西' } ] } })尽管这只是一个刻意设计的例子,但我们已经设法将应用分割成了两个更小的单元。子单元通过 prop 接口与父单元进行了良好的解耦。我们还可以进一步改进 <todo-item> 组件,提供更为复杂的模板和逻辑,而不会影响父单元。