2Vue之MVVM模式

 模式

传统的mvp模式:moudel(数据)、view(视图)、presenter(控制器,业务逻辑)。

控制器调用数据层,改变试图层,是个中转站,大部分代码集中在这一层,有大量dom操作。

mvvm模式:model层,view层,vm层

 ViewModel取代presenter,使数据和Dom建立了联系,不用我们编写dom操作代码了。我们主要在面向数据编程,所有东西都是响应式的。

 组件化

全局组件,使用

Vue.component():内部实例化一个组件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="vue.js"></script>
    <title>Document</title>
</head>
<body>
    <div id="app">
        <!-- v-model与数据进行双向绑定,当input中的值发生变化的时候,Vue实例中的数据也会发生变化,当Vue数据发生变化的时候,input框中的值也会发生变化 -->
        <input type="text" v-model="inputValue" />
        <button v-on:click="handleBtnClick">提交</button>
        <ul>
            <!-- v-for是一个模板指令,帮助我们去循环数据 -->
            <!-- <li v-for="item in list">{{item}}</li> -->
            <todo-item v-bind:content="item" v-for="item in list"></todo-item>
        </ul>
    </div>
    
</body>
<script>
    Vue.component("TodoItem",{
        props:['content'],
        template:"<li>{{this.content}}</li>"
    })
    var obj={
        list:[],
        inputValue:""
    }

    var app=new Vue({
        el:"#app",//接管id=app里面的内容,el限制了vue接管的内容
        data:obj,
        methods:{//方法定义在methods中
            handleBtnClick:function(){
                this.list.push(this.inputValue)
                this.inputValue="";
            }
        }
    });

    
</script>
</html>

 局部组件,需要在new Vue中注册,注意要写在new Vue之前,不然会找不到。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="vue.js"></script>
    <title>Document</title>
</head>
<body>
    <div id="app">
        <!-- v-model与数据进行双向绑定,当input中的值发生变化的时候,Vue实例中的数据也会发生变化,当Vue数据发生变化的时候,input框中的值也会发生变化 -->
        <input type="text" v-model="inputValue" />
        <button v-on:click="handleBtnClick">提交</button>
        <ul>
            <!-- v-for是一个模板指令,帮助我们去循环数据 -->
            <!-- <li v-for="item in list">{{item}}</li> -->
            <todo-item v-bind:content="item" :index="index" v-for="(item,index) in list" @delete="handleDeleteItem"></todo-item>
            <!-- @delete监听 -->
            <!-- :是v-bind:的简写 -->
        </ul>
    </div>
    
</body>
<script>
    //全局组件
    // Vue.component("TodoItem",{
    //     props:['content'],
    //     template:"<li>{{this.content}}</li>"
    // })
    var obj={
        list:[],
        inputValue:""
    }

    //局部组件,要在Vue实例化之前写,子组件
    var TodoItem={
        props:["content","index"],
        template:"<li @click='handleItemClick'>{{this.content}}</li>",// @是v-on的简写
        methods:{
            handleItemClick:function(){
                // alert(this.index);
                this.$emit('delete',this.index);
            }
        }
    }

    var app=new Vue({
        el:"#app",//接管id=app里面的内容,el限制了vue接管的内容
        components:{ //局部组件需要注册到Vue实例中
            TodoItem:TodoItem
        },
        data:obj,
        methods:{//方法定义在methods中
            handleBtnClick:function(){
                this.list.push(this.inputValue)
                this.inputValue="";
            },
            handleDeleteItem:function(index){
                this.list.splice(index,1);
            }
          
        }
    });

    
</script>
</html>
  •  @是v-on:的简写
  • :是v-bind的简写
  • v-model实现双向绑定

原文地址:https://www.cnblogs.com/ellen-mylife/p/14008404.html