博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
es6学习1: 模拟react Comopnent类的实现
阅读量:6969 次
发布时间:2019-06-27

本文共 4013 字,大约阅读时间需要 13 分钟。

开始系统学习es6, 按自己的理解简单模拟个react的Component类和生命周期思维,  见证自己的成长, 初学, 写着娱乐, 勿喷  T.T

test.js

 

import mm from '../util/util.js';class Component{    constructor(props) {        this.props =  {}; // 注入的history等        this.props = Object.assign(this.props, props || {});        this.state = {};        this.loadComponent();    }    setState(obj, fallBack){        // 判断是否需要刷新虚拟dom        if (this.shouldComponentUpdate(obj)) {            this.componentUpdate();            Object.assign(this.state,obj);            this.componentDidUpdate();            this.loadComponent();        }        // 调用回调函数        typeof fallBack === 'function' && fallBack();    }    loadComponent() {        this.componentWillUMount();        this.loadProps();        this.componentDidUMount();    }    loadProps(){}    flushVdom(){}    // 声明周期函数    shouldComponentUpdate(obj){        console.log("shouldComponentUpdate");        // 对象深拷贝        let stateCopy = mm.objDeepCopy(this.state);        // 合并对象        let objResult = Object.assign(stateCopy, (obj || {}));        // 将setstate的值和state的值合并看和原state的值是否相等        if (mm.isEqual(objResult,this.state)) {            // 不相等就不刷新组件            console.log("值相等: 不刷新虚拟dom");            return false;        }        console.log("值不等, 刷新虚拟dom");        this.flushVdom();        // 不相等就刷新组件        return true;    }    componentUpdate(){        console.log('componentWillUpdate');    }    componentDidUpdate(){        console.log('componentDidUpdate');    }    componentWillUMount(){        console.log('componentWillMount');    }    componentDidUMount(){        console.log('componentDidMount');    }}class Test2 extends Component{    constructor(props){        super(props);    }    render(){        this.setState(            {name:'avenda'},            ()=>(console.log("setState后的回调方法..."))        );        return(`
我是得到的标签
`) }}// 模拟调用console.log(new Test2().render());

 

 

 

工具类 util.js (对象深拷贝及isEquels方法)

let mm = {    isEqual(a, b) {        //如果a和b本来就全等        if (a === b) {            //判断是否为0和-0            return a !== 0 || 1 / a === 1 / b;        }        //判断是否为null和undefined        if (a == null || b == null) {            return a === b;        }        //接下来判断a和b的数据类型        var classNameA = toString.call(a),            classNameB = toString.call(b);        //如果数据类型不相等,则返回false        if (classNameA !== classNameB) {            return false;        }        //如果数据类型相等,再根据不同数据类型分别判断        switch (classNameA) {            case '[object RegExp]':            case '[object String]':                //进行字符串转换比较                return '' + a === '' + b;            case '[object Number]':                //进行数字转换比较,判断是否为NaN                if (+a !== +a) {                    return +b !== +b;                }                //判断是否为0或-0                return +a === 0 ? 1 / +a === 1 / b : +a === +b;            case '[object Date]':            case '[object Boolean]':                return +a === +b;        }        //如果是对象类型        if (classNameA == '[object Object]') {            //获取a和b的属性长度            var propsA = Object.getOwnPropertyNames(a),                propsB = Object.getOwnPropertyNames(b);            if (propsA.length != propsB.length) {                return false;            }            for (var i = 0; i < propsA.length; i++) {                var propName = propsA[i];                //如果对应属性对应值不相等,则返回false                if (a[propName] !== b[propName]) {                    return false;                }            }            return true;        }        //如果是数组类型        if (classNameA == '[object Array]') {            if (a.toString() == b.toString()) {                return true;            }            return false;        }    },    // 对象深拷贝    objDeepCopy (data) {        return JSON.parse(JSON.stringify(data));    }}export default mm;

 测试

调用 setState({},()=>( console.log("setState后的回调方法...") ) 输出结果

调用 setState({name:'avenda'},()=>( console.log("setState后的回调方法...") ) 输出结果

 

 

 

转载于:https://www.cnblogs.com/rushAvenda/p/10072836.html

你可能感兴趣的文章
25.EXTJS 主页面的jsp
查看>>
Verilog语法
查看>>
Atom替换换行符
查看>>
Linux SendMail发送邮件失败诊断案例(四)
查看>>
SpringMVC+hibernate4事务处理
查看>>
大型网站架构演化历程
查看>>
[osg][原]自定义osgGA漫游器
查看>>
JSX 语法
查看>>
Day8 Servlet
查看>>
iOS 集成Protobuf,转换proto文件
查看>>
ZooKeeper伪集群环境搭建
查看>>
[Chromium]怎样安全的使用PostTask
查看>>
python 合并字典,相同 key 的 value 如何相加?
查看>>
Android开发之深入理解Android Studio构建文件build.gradle配置
查看>>
Martini源码剖析
查看>>
【spring boot】【log4jdbc】使用log4jdbc打印mybatis的sql和Jpa的sql语句运行情况
查看>>
BZOJ3265: 志愿者招募加强版(线性规划)
查看>>
Java提高:采用异常链传递异常
查看>>
SQL Server中LIKE %search_string% 走索引查找(Index Seek)浅析
查看>>
在WPF中制作正圆形公章
查看>>