16 为什么 React 元素有一个 $$typeof 属性

目的是为了防止
XSS攻击。因为Synbol无法被序列化,所以React可以通过有没有$$typeof属性来断出当前的element对象是从数据库来的还是自己生成的。
- 如果没有
$$typeof这个属性,react会拒绝处理该元素。 - 在
React的古老版本中,下面的写法会出现XSS攻击:
// 服务端允许用户存储 JSON
let expectedTextButGotJSON = {
type: 'div',
props: {
dangerouslySetInnerHTML: {
__html: '/* 把你想的搁着 */'
},
},
// ...
};
let message = { text: expectedTextButGotJSON };
// React 0.13 中有风险
<p>
{message.text}
</p>
