我们用一个TODO的列表作为示例,从用户角度看,一个TODO列表在DOM结构的表现形式就是一组节点:
而对应的Model可以用JavaScript数组表示:
todos: [
{
name: '产品评审',
description: '新款iPhone上市前评审'
},
name: '开发计划',
description: '与PM确定下一版Android开发计划'
},
{
name: 'VC会议',
}
使用MVVM时,当我们更新Model时,DOM结构会随着Model的变化而自动更新。当todos
数组增加或删除元素时,相应的DOM节点会增加<li>
或者删除<li>
节点。
在Vue中,可以使用v-for
指令来实现:
我们可以在浏览器console中用查看View的变化,或者通过window.vm.todos.push({name:'新计划',description:'blabla...'})
来增加一个数组元素,从而自动添加一个<li>
元素。
需要注意的是,Vue之所以能够监听Model状态的变化,是因为JavaScript语言本身提供了或者Object.observe()机制来监听对象状态的变化。但是,对于数组元素的赋值,却没有办法直接监听,因此,如果我们直接对数组元素赋值:
vm.todos[0] = {
name: 'New name',
description: 'New description'
};
会导致Vue无法更新View。
正确的方法是不要对数组元素赋值,而是更新:
var index = 0;
var newElement = {...};
vm.todos.splice(index, 1, newElement);
Vue可以监听数组的splice
、、unshift
等方法调用,所以,上述代码可以正确更新View。
用CSS修饰后的页面效果如下: