zoukankan      html  css  js  c++  java
  • vue2源码-响应式处理(学习笔记)-2

    回顾vue的使用

    index.html文件

      <div id="app">{{name}}</div><!-- 对数据进行渲染 -->
      <script src="./dist/vue.js"></script>  <!-- 引入vue(自己准备手写的) -->
      <script>
        //viewModel 数据模型
        //典型的MVVM View  vm  model
        let vm = new Vue({//vue的使用首先要挂载
          //定义数据的两种写法
          /*  data: {
             name: 'zs'
           } */
          data() {
            return {
              name: 'yft',
              age: {
                n: 1,
                m: 2
              }
            }
          }
        })
        vm._data.age = {
          v: 5
        }
        console.log(vm);
      </script>
    

    一下是手写vue的js逻辑代码文件层层下去一个个建就好了

    index.js

    import { initMixin } from "./init"
    function Vue(options){
        //options 为用户传入的选项
        this._init(options);//初始化操作
        
    }
    //扩展原型
    initMixin(Vue)
    export default Vue;
    

    init.js

    import { initSate } from "./state"
    export function initMixin(Vue){
        const vm = this;
        vm.$options = options;
        //对数据进行初始化 
        initState(vm);//vm.$options.data  
    }
    

    state.js

    import { observe } from "./observer/inex";
    import { isFunction } from "./utils";//存放一下工具和方法
    export function initSate(vm){
         const opts = vm.$options;
         if(opts.data){
              initData(vm);
         }
    }
    function initData(vm){
         let data = vm.$options.data;
         //vue2中会将data中的数据 进行劫持 Object.defineProperty
         //这是vm和data没有任何关系 通过_data进行关联
         data = vm._data = isFunction(data) ? data.call(vm) : data;
         observe(data)
    }
    

    utils.js

    export function isFunction (val){
         return typeof val === 'function';
    }
    export function isObject (val){
         return typeof val == 'object' && val !== null;//下面会使用到
    }
    

    observer/index.js

    import { isObject } from "../utils";
    // 检测数据变化 类有类型
    class Observer{
        construtor(data){//对象中的所有属性进行劫持
          this.walk(data);
        }
        walk(data){
          Object.keys(data).forEach(key=>{
              defineReactive(data,key,data[key]);
          })
        }
    }
    
    //vue2会对对象进行遍历 将每个属性用defineProperty 重新定义 性能差
    function defineReactive(data,key,value){//value 有可能是对象
        observe(value);//本身用户默认就是对象套对象 需要进行递归处理 性能差
        Object.defineProperty(data,key,{
          get(){
              return value;
          },
          set(newV){
              observe(newV);
               value = newV;//如果用户赋值一个对象,需要将这个对象进行劫持
          }
        })
    }
    export function observe(data){
         //如果是对象才观测
         if(!isObject(data)){
           return ;
         }
         //默认最外层的data必须是一个对象
         return new Observer(data)
    }
    

    以上的基本的响应式处理内容,下面我继续学习继续更新哦!

  • 相关阅读:
    性能测试流程
    N种自动化测试框架(包含自动化和性能,总有一款适合你)
    自动化测试框架:jmeter + maven+ jenkins
    oracle中删除表:drop、delete、truncate
    SpringBoot开发mockserver及生成swagger接口文档
    五步法颈椎病自我按摩图解
    自动化必备:自动化持续集成环境搭建(上):git + maven + jenkins
    玩转jmeter:beanshell必备技能
    EFK-2:ElasticSearch高性能高可用架构
    MySQL5.7之在线DDL不会锁表
  • 原文地址:https://www.cnblogs.com/lsy6/p/14321387.html
Copyright © 2011-2022 走看看