Vue.js学习笔记-2-MVVM
2017-06-30 19:36
567 查看
1.背景
Vue.js是一款MVVM框架,个人对MVVM框架的理解不是很透彻,简单介绍一下自己的理解,更全面准确的解释请参见文章 《MVVM》。
MVVM(model-view-viewModel)同MVC设计模式一样,用于将数据和视图解耦,使程序设计的思路更加清晰,代码更易于维护。model-数据-就是组件中的data,view-视图-就是组件中的模板。viewModel,将两者连接在一起的,就是vue。vue将数据和模板通过vue实例进行绑定。使得我们可以通过改变数据来更新视图,而在必要时,也可以让视图的变化更新数据。那么,我们现在需要弄清楚两个问题:1.vue.js如何将数据和视图绑定在一起?2.组件之间如何通信?
Vue.js通过vue的一些指令,将数据和视图绑定到一起,如,v-bind指令可以将数据作为属性绑定到元素或组件上,v-model则可以实现双向绑定(所谓双向绑定,就是对于input、textarea等输入元素,用户输入的值绑定到数据,使数据可以同步更新)。Vue组件通信分为3部分:父组件到子组件,子组件到父组件,子组件到子组件。Vue.js是单向数据流的设计。就是说父组件到子组件的通信是靠传递数据,子组件不能向父组件传递数据,那么子组件向父组件如何传递消息呢?答案是通过事件,通过触发可携带数据的事件,子组件就可以实现和父组件的通信了。子组件和子组件之间的通信则需要靠总线机制。这个不详细介绍,请参见文档 《Vue.js非父子组件通信》。下面通过文档中的例子《vue-实例
todo》来说明一下这两个问题。
下面的例子实现了一个任务列表的简单应用,用户输入内容,按回车可以生成记录item,每个item后有一个删除按钮。
v-model将自身的内容和newTodoText进行了双向绑定。这样当我们输入内容时,newTodoText会和内容进行同步,输入完内容,再按回车,就会执行input中使用v-on监听的按键事件,更新todos,将新添加的todo append到todos的末尾。更新后的todos会触发视图的更新,即添加一个新的li,文本即我们刚输入的内容。删除则是子组件向父组件传递消息的一个案例。点击子组件时,向父组件抛出一个remove事件,父组件接到这个事件会执行remove将该li组件删除。
$emit触发的事件不会向上冒泡,只能传递到上一级的组件那里。那么Vue怎么进行跨层级的事件传递呢?比如孙子组件向父组件传递事件,在Vue1中,可以在父组件中使用events属性进行事件监听,孙子组件就使用$emit触发事件即可。还有$dispatch和$broadcast API可以进行事件跨层级传递,事件会一直向上冒泡,直到被父组件捕获。
在Vue2中,可能出于规范消息传递机制和状态管理,撤销了这些API。其实组件事件传递就是通信,组件间的通信包括父子组件和其它关系的组件之间的通信。组件之间的通信推荐使用总线机制或者vuex。
Vue.js是一款MVVM框架,个人对MVVM框架的理解不是很透彻,简单介绍一下自己的理解,更全面准确的解释请参见文章 《MVVM》。
MVVM(model-view-viewModel)同MVC设计模式一样,用于将数据和视图解耦,使程序设计的思路更加清晰,代码更易于维护。model-数据-就是组件中的data,view-视图-就是组件中的模板。viewModel,将两者连接在一起的,就是vue。vue将数据和模板通过vue实例进行绑定。使得我们可以通过改变数据来更新视图,而在必要时,也可以让视图的变化更新数据。那么,我们现在需要弄清楚两个问题:1.vue.js如何将数据和视图绑定在一起?2.组件之间如何通信?
Vue.js通过vue的一些指令,将数据和视图绑定到一起,如,v-bind指令可以将数据作为属性绑定到元素或组件上,v-model则可以实现双向绑定(所谓双向绑定,就是对于input、textarea等输入元素,用户输入的值绑定到数据,使数据可以同步更新)。Vue组件通信分为3部分:父组件到子组件,子组件到父组件,子组件到子组件。Vue.js是单向数据流的设计。就是说父组件到子组件的通信是靠传递数据,子组件不能向父组件传递数据,那么子组件向父组件如何传递消息呢?答案是通过事件,通过触发可携带数据的事件,子组件就可以实现和父组件的通信了。子组件和子组件之间的通信则需要靠总线机制。这个不详细介绍,请参见文档 《Vue.js非父子组件通信》。下面通过文档中的例子《vue-实例
todo》来说明一下这两个问题。
下面的例子实现了一个任务列表的简单应用,用户输入内容,按回车可以生成记录item,每个item后有一个删除按钮。
<div id="todo-list-example"> <input v-model="newTodoText" v-on:keyup.enter="addNewTodo" placeholder="Add a todo" > <ul> <li is="todo-item" v-for="(todo, index) in todos" v-bind:title="todo" v-on:remove="todos.splice(index, 1)" ></li> </ul> </div>
Vue.component('todo-item', { template: ' <li> {{ title }} <button v-on:click="$emit('remove')">X</button> </li> ', props: ['title'] }) new Vue({ el: '#todo-list-example', data: { newTodoText: '', todos: [ 'Do the dishes', 'Take out the trash', 'Mow the lawn' ] }, methods: { addNewTodo: function () { this.todos.push(this.newTodoText) this.newTodoText = '' } } })该应用的设计是,有一个根组件,和一个子组件。根组件即id为todo-list-example的元素对应的Vue实例。它维护了两个数据:newTodoText和todos。根组件的模板里包括两部分:用于输入的input元素和用于显示todo列表的ul。通过创建vue实例,并传入dom #todo-list-example,Vue.js就把数据和视图绑定在了一起,这样我们就可以通过改变数据来更新视图了。newTodoText这个数据表示当前正在创建的todo,可以看到,input元素通过指令
v-model将自身的内容和newTodoText进行了双向绑定。这样当我们输入内容时,newTodoText会和内容进行同步,输入完内容,再按回车,就会执行input中使用v-on监听的按键事件,更新todos,将新添加的todo append到todos的末尾。更新后的todos会触发视图的更新,即添加一个新的li,文本即我们刚输入的内容。删除则是子组件向父组件传递消息的一个案例。点击子组件时,向父组件抛出一个remove事件,父组件接到这个事件会执行remove将该li组件删除。
$emit触发的事件不会向上冒泡,只能传递到上一级的组件那里。那么Vue怎么进行跨层级的事件传递呢?比如孙子组件向父组件传递事件,在Vue1中,可以在父组件中使用events属性进行事件监听,孙子组件就使用$emit触发事件即可。还有$dispatch和$broadcast API可以进行事件跨层级传递,事件会一直向上冒泡,直到被父组件捕获。
在Vue2中,可能出于规范消息传递机制和状态管理,撤销了这些API。其实组件事件传递就是通信,组件间的通信包括父子组件和其它关系的组件之间的通信。组件之间的通信推荐使用总线机制或者vuex。
相关文章推荐
- 关于Vue.js一些问题和思考学习笔记(2)
- Vue.js - 学习笔记 (一)
- Vue.js第二天学习笔记(vue-router)
- vue.js学习笔记之prototype
- Vue.js学习系列二 —— vuex学习实践笔记(附DEMO)
- Vue.js 源码学习笔记 -- 分析前准备1 -- vue三大利器
- Vue.js学习笔记: 数据绑定语法---绑定表达式
- Vue.js 源码学习笔记 -- 分析前准备2 -- Object.defineProperty
- vue.js学习笔记--遇到的那些问题
- vue.js学习笔记之属性绑定 v-bind
- vue.js学习笔记之绑定style样式和class列表
- Vue.js第四天学习笔记
- Vue.js学习笔记(4)
- Vue.js第一天学习笔记(数据的双向绑定、常用指令)
- vue.js学习笔记:如何加载本地json文件
- Vue.js第三天学习笔记(计算属性computed)
- Vue.js 学习笔记
- Vue.js第四天学习笔记(组件)
- 关于Vue.js一些问题和思考学习笔记(1)
- vue.js入门学习笔记整理