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)
    }
    

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

  • 相关阅读:
    HIVE Group by、join、distinct等实现原理
    【1.3】shell基础——调试shell(sh -x)
    sql server无法显示请求的对话框,检索数据失败
    sql server索引操作
    sql server中的alter
    tempdb无法收缩。使用 DBCC FREESYSTEMCACHE 解决
    在从该备份集进行读取时,RESTORE 检测到在数据库 "CISDB" 中的页(0:0)上存在错误。系统断定检查已失败
    【1.2】shell基础——stty erase解决按backspace出现^H的情况
    【1.1】shell基本实践——密码输入三次错误则结束
    (5.3.7)数据库迁移——sql server备份文件的加密解密
  • 原文地址:https://www.cnblogs.com/lsy6/p/14321387.html
Copyright © 2011-2022 走看看