zoukankan      html  css  js  c++  java
  • 数据改动,更新视图,类似于vue

      

    //当数据改变时,更新视图,和vue的有点类似
    let obj = {
    name:{
    name:'ll'
    },
    age:12,
    }
    let arr = [1,2,3];
    //针对数组的写法
    //当需要改变原型对象上的方法时,不要直接在prototype上修改,否则以后使用的都是修改后的方法
    //创建一个新对象,可以获取到Array.protyotype上的所有方法
    let proto = Object.create(Array.prototype);
    ['pop','push','shift','unshift','reverse','sort','splice'].forEach(method=>{
    proto[method] = function(){
    update();
    let old = Array.prototype[method];
    old.call(this,...arguments)
    }
    })
    function update(){
    console.log('更新视图')
    }
    function observer(obj){
    //如果是数组,不循环,把数组的新方法赋给该数组
    if(Array.isArray(obj)) return;
    if(typeof obj !== 'object'){
    return obj.__proto__ = proto;
    }
    for(let key in obj){
    defineReactive(obj,key,obj[key]);
    }
    }
    //定义属性的getter和setter
    function defineReactive(obj,key,value){
    observer(value) //如果值是对象,继续循环定义getter和setter
    Object.defineProperty(obj,key,{
    get(){
    return value;
    },
    set(newval){
    //如果新值是个对象,也要循环定义getter和setter
    if(typeof newval === 'object'){
    observer(newval)
    }
    //如果数据有变化,更新视图
    if(value !== newval){
    update();
    }
    value = newval
    }
    })
    }
    //对象
    observer(obj);
    //数组
    observer(arr);
    //更改数据
    obj.name.name = 'mj';
    arr.push(4);
    console.log(obj);
    console.log(arr)
  • 相关阅读:
    清除大文本中的html标签
    页面中富文本的使用
    artDialog的几种基本使用
    SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)[转]
    Struts2
    js中window.location的用法
    keycode键盘 按键
    jQuery升级踩坑之路
    生成唯一随机码的方法及优缺点分析
    百度API的经历,怎样为多个点添加带检索功能的信息窗口
  • 原文地址:https://www.cnblogs.com/qiruoranbeginner/p/10980768.html
Copyright © 2011-2022 走看看