React - 修改children(下)
在 React - 修改children(上) 中我提到了React在遍历children过程中是不允许修改其中的React Element的,这里我要做点补充,就是有个前提是:使用的React是非压缩版的,也就是说不是使用react.min.js这种,使用react.min.js则不会报错。 查看React非压缩版的源码发现,里边有许多这样的代码块,而在压缩版中是没有的。 if ("development" !== 'production') { ...... } 举个例子 React v0.14.4 (注释被我去掉了)
var ReactElement = function (type,key,ref,self,source,owner,props) { var element = { $$typeof: REACT_ELEMENT_TYPE,type: type,key: key,ref: ref,props: props,_owner: owner }; if ("development" !== 'production') { ...... Object.freeze(element.props); Object.freeze(element); } return element; };
u = function(e,t,n,r,o,i,u) { var s = { $$typeof: a,type: e,key: t,ref: n,props: u,_owner: i }; return s }; 对比压缩前后,由if ("development" !== 'production') {} 包裹的代码块被直接strip掉了,说明压缩工具确实了得。 Object.freeze(element.props); Object.freeze(element); 查看一下MDN关于Object.freeze的介绍: 看到这里可以知道,为啥在使用非压缩版的时候修改React Element时会提示报错,正是因为该对象被freeze了;相反在压缩版中因为没有freeze,所以能够成功修改,不会报错。 谈到这里再顺便提下两点:
To use React in production mode,set the environment variable
在开发过程中提示报错,在线上环境不提示,有点JAVA编译的味道,编译时校验信息,提示警告和错误,在执行中不校验。 总结:开发过程中还是用非压缩版的React好,有利于及时发现问题。完成!!! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |