记录几个有用的特性
Forwarding Refs
React.forwardRef
accepts a render function that receivesprops
andref
parameters and returns a React node.
自己写HTML5
的audio
需要在父组件中使用子组件Audio
里面的audio
DOM
元素
1 | Audio.js |
传播属性
两个组件是等效的
1 | function App1() { |
可以获取特定属性,而不是直接传,这里把
other
和props.children
传给了button
1 | const Button = props => { |
一个很有用的栗子
1 | 父组件.js |
代码就变得精简了。
小结
虽然好用,但是官网建议尽量少用,会传一些不必要的属性。
props.children
传递组件的children可以是anything,比如函数
false
,null
,undefined
, 以及true
是不合法children
一个栗子
1 | function Repeat(props) { |
Protals
插槽
博文
当父组件有overflow: hidden; 或者 z-index的样式时候,又希望子结点冲破父容器展示(例如tooltips)
Usage
1 | render() { |
这里没有创建div来包裹this.props.children,而是将它直接渲染到domNode(任意一个DOM结点,无论DOM结点的位置)
在 React 组件树
设计上,Selector 是 Button 的子组件。但是在 DOM 树
的角度 Selector
是 Body
的子节点。
1 | <Button> |
注意事件冒泡
1 | <html> |
此时的DOM树
React组件树
Parent —> Modal —> Child
可见DOM树中Modal组件是它的Parent父组件的兄弟结点。但是由于 React 的事件处理规则,让 portal 的 React 父组件有能力捕获 portal 的冒泡事件。
题外
JS escaped & unescaped output
对XSS attack
很有用。
一个栗子
有一个页面允许用户输入地址,并且在另外一夜确定,如果用户输入
1 | <script> |
下个页面将会简单地运行这个脚本,特别是当攻击者把脚本放在一个无限循环里,程序就崩了。
因此,用户输入的文本将会被解码(escaped),对应的就是编码(uneasped)。
1 | <script><br/> alert("Welcome");<br/></script> |
这样,浏览器就会把他当做一个HTML元素而不是script元素了。