MVVM框架

MVVM框架

MVVM框架

Vue.js

React.js

Angular.js

对MVVM的认识

MVC

Model

View

Controller

MVVM

Model 服务端,数据来源

View 页面

ViewModel 框架,如vue.js,核心

MVVM框架

对比

双向绑定

定义

数据驱动页面(data->view),页面变了也能将js中保存的变量做相应的改变(view->data),这个过程是自动的。

双向绑定

原理

(data->view):Object.defineProperty(核心API,目前最新的框架),可以监听data的变化,然后有个回调函数,在回调函数中做处理

(view->data):通过input事件,只不过框架执行了我们看不到

Object.defineProperty

MDN

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

用法

defineProperty.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Object.defineProperty</title>
  </head>
  <body>
    <script type="text/javascript">
    var obj1 = {};
    var descriptor = Object.create(null); // 没有继承的属性
    // 默认没有 enumerable,没有 configurable,没有 writable
    descriptor.value = 'static';
    Object.defineProperty(obj1, 'key', descriptor);
    console.log(obj1);
    </script>

    <script type="text/javascript">
    // 显式
    var obj2 = {};
    Object.defineProperty(obj2, 'key', {
        enumerable: true,
        configurable: false,
        writable: false,
        value: 'static',
    });
    console.log(obj2);
    </script>
  </body>
</html>

Reflect.defineProperty的区别

Reflect.defineProperty返回Bool值 ES6

Object.defineProperty返回对象 ES5

手写

useObjectdefineProperty.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>双向绑定</title>
</head>
<body>
    手写一个简单的双向绑定<br/>
    <input type="text" id="model"><br/>

    <div id="modelText"></div>
</body>
<script type="text/javascript">
    var model = document.querySelector("#model");    

    var modelText = document.querySelector("#modelText");    

    var defaultName = "defaultName";  

    var userInfo = {}    

    model.value = defaultName;   

    Object.defineProperty(userInfo, "name", {  

        get: function () {            
            return defaultName;         
        },  

        set: function (value) {             
            defaultName = value;             
            model.value = value;            
            console.log("-----value");            
            console.log(value);             
            modelText.textContent = value;         
        }
    }) 

    userInfo.name = "new value";    
    var isEnd = true;   

    model.addEventListener("keyup", function () {
        if (isEnd) {
            userInfo.name = this.value;
            }}, false)    

    //加入监听中文输入事件    
    model.addEventListener("compositionstart", function () {        
        console.log("开始输入中文");         
        isEnd = false;
        })     

    model.addEventListener("compositionend", function () {
        isEnd = true;        
        console.log("结束输入中文");
    })
</script>
</html>

设计模式

即观察者模式

有一个监听者,监听data的变化,通知观察者列表,watcher会更新view

观察者模式

声明周期

Vue生命周期

Vue生命周期

React生命周期:实例化Mounting、存在期Updating和销毁时Unmounting

React生命周期

源码分析