我们用一个TODO的列表作为示例,从用户角度看,一个TODO列表在DOM结构的表现形式就是一组节点:

    而对应的Model可以用JavaScript数组表示:

    1. todos: [
    2. {
    3. name: '产品评审',
    4. description: '新款iPhone上市前评审'
    5. },
    6. name: '开发计划',
    7. description: '与PM确定下一版Android开发计划'
    8. },
    9. {
    10. name: 'VC会议',
    11. }

    使用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()机制来监听对象状态的变化。但是,对于数组元素的赋值,却没有办法直接监听,因此,如果我们直接对数组元素赋值:

    1. vm.todos[0] = {
    2. name: 'New name',
    3. description: 'New description'
    4. };

    会导致Vue无法更新View。

    正确的方法是不要对数组元素赋值,而是更新:

    1. var index = 0;
    2. var newElement = {...};
    3. vm.todos.splice(index, 1, newElement);

    Vue可以监听数组的splice、、unshift等方法调用,所以,上述代码可以正确更新View。

    用CSS修饰后的页面效果如下:

    读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论: