react开发的时候,引入热加载,用了修饰器的引入方式,发现了一个很有意思的问题,网上并没有相关文章,所以抛出来探讨下。
一段很简单的测试代码。但是经过babel编码后,变得很有意思。假设编码成es2016,那么会是怎样的呢。
因为es6支持static静态方法,但不支持静态属性,导致属性被编码成CS.myName='kkk'
but 关键的地方来了。。因为我们引入了@hot。。一切变得有意思,看看源码它做了什么
hot给Component包裹了几层,返回了一个新的component。。
重点来了。。。这就导致了一个很有意思的问题。
babel转码后,我们的静态属性同样挂载到了这个新的component上,这是babel的操作,无解,它已经不是原来的component了。 这就导致我们在里层的component中去调用 Cs.myName等静态属性就会报undefined。所以尽可能不使用静态属性,而是直接置顶用const变量代替。
不过幸好的是,静态方法是直接挂载到里面(原来)的component上的。所以我们能够正常访问得到,如Cs.show。
但同样会引发一个好奇,如果我转化成es5,不支持静态方法的话,那是不是也会导致静态方法丢失的问题呢。。为此我特意做了个试验。。
当当当。。。
忽略波浪线,是eslint报错。。。
发现没。。即便是es2015。转码后属性还是外层,不过方法依然是在里层实现的。并没有挂载的外层,_createClass这个方法做了处理的
我们定义的show和hide当做staticProps传进去了。
总结了。。虽然是引入了@hot导致的问题,但还是尽量不要使用static定义属性(方法没问题)。。毕竟谁也不支持会不会有什么其他东东包裹了我们的组件。