为了让用户和你的应用进行交互,我们可以用 v-on 指令添加一个事件监听器,通过它调用在 Vue 实例中定义的方法:
<div id="app5">
<p>{{message}}p>
<button v-on:click="reverseMessage">反转消息button>
div>
<script src="../js/vue.js">script>
<script>
var app5 = new Vue({
el: '#app5',
data: {
message: 'Hello Vue.js!'
},
methods: {
reverseMessage : function (){
this.message = this.message.split('').reverse().join('')
}
}
})

单击按钮后,字符串进行反转操作,整个过程中,我们只是将app5应用的状态,没有触碰过DOM 元素,所有的 DOM 操作都由 Vue 来处理,编写的代码只需要关注逻辑层面即可
Vue 还提供了 v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。
<div id="app6">
<p>{{message}}p>
<input v-model="message">
div>
<script src="../js/vue.js">script>
<script>
var app6 = new Vue({
el: '#app6',
data: {
message: 'Hello Vue!'
}
})
浏览器运行效果

组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、独立和通常可复用的组件构建大型应用。
仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:

在 Vue 里,一个组件本质上是一个拥有预定义选项的一个 Vue 实例。
在 Vue 中注册组件很简单:
<div id="app">
<ol>
<todo-item>todo-item>
ol>
div>
<script src="../js/vue.js">script>
<script>
//定义一个名为todo-item的新组件
Vue.component('todo-item', {
template: '<li>这是一个待办项li>>'
})
var app = new Vue({
el: '#app',
data: {}
})
页面效果

但是这样会为每一个待办事项都渲染同样的文本,像下面这样

这看起来并不炫酷
我们应该能从父作用域将数据传到子组件才对。让我们来修改一下组件的定义,使之能够接受一个 prop:
//定义一个名为todo-item的新组件
Vue.component('todo-item', {
// template: '- 这是一个待办项
>'
// todo-item 组件现在接受一个"prop",类似于一个自定义 attribute。
// 这个 prop 名为 todo。
props : ['todo'],
template: '- {{todo.text}}
>'
})
现在,我们可以使用 v-bind 指令将待办项传到循环输出的每个组件中:
<div id="app7">
<ol>
<todo-item
v-for="item in groceryList"
v-bind:todo = 'item'
v-bind:key = 'item.id'
>todo-item>
ol>
div>
<script src="../js/vue.js">script>
<script>
//定义一个名为todo-item的新组件
Vue.component('todo-item', {
// template: '<li>这是一个待办项li>>'
// todo-item 组件现在接受一个"prop",类似于一个自定义 attribute。
// 这个 prop 名为 todo。
props: ['todo'],
template: '<li>{{todo.text}}li>>'
})
var app7 = new Vue({
el: '#app7',
data: {
groceryList: [
{ id : 0 , text : '蔬菜'},
{ id: 1, text: '奶酪' },
{ id: 2, text: '随便其它什么人吃的东西' }
]
}
})
浏览器效果

虽然这是个很刻意的例子,但是我们已经设法将应用分割成了两个更小的单元。
子单元通过 prop 接口与父单元进行了良好的解耦。我们现在可以进一步改进 组件,提供更为复杂的模板和逻辑,而不会影响到父单元。
后面还会详细讲解组件
【一个例子】
Vue 组件非常类似于自定义元素——它是 Web 组件规范的一部分,这是因为 Vue 的组件语法部分参考了该规范。
但是有些差别:
虽然 Vue 内部没有使用自定义元素,不过在应用使用自定义元素、或以自定义元素形式发布时,依然有很好的互操作性。Vue CLI 也支持将 Vue 组件构建成为原生的自定义元素。