161.React 支持所有的 HTML 属性么?
从 React 16 开始,完全支持标准或自定义 DOM 属性。由于 React 组件通常同时使用自定义和与 DOM 相关的属性,因此 React 与 DOM API 一样都使用 camelCase 约定。让我们对标准 HTML 属性采取一些措施:
<div tabIndex="-1" /> // Just like node.tabIndex DOM API
<div className="Button" /> // Just like node.className DOM API
<input readOnly={true} /> // Just like node.readOnly DOM API
除了特殊情况外,这些属性的工作方式与相应的 HTML 属性类似。它还支持所有 SVG 属性。
162.如何将事件处理程序传递给组件?
可以将事件处理程序和其他函数作为属性传递给子组件。它可以在子组件中使用,如下所示:
//父组件
<Child func={this.handleClick}></Child>
//子组件Child
<button onClick={()=>this.props.func()}>点我</button>
163.在渲染方法中使用箭头函数好么?
是的,你可以用。它通常是向回调函数传递参数的最简单方法。但在使用时需要优化性能。
class Foo extends Component {
handleClick() {
console.log('Click happened');
}
render() {
return <button onClick={() => this.handleClick()}>Click Me</button>;
}
}
注意: 组件每次渲染时,在 render 方法中的箭头函数都会创建一个新的函数,这可能会影响性能。
164.如何防止函数被多次调用?
如果你使用一个事件处理程序,如 onClick or onScroll 并希望防止回调被过快地触发,那么你可以限制回调的执行速度。
这可以通过以下可能的方式实现:
- Throttling: 基于时间的频率进行更改。例如,它可以使用 lodash 的 _.throttle 函数。
- Debouncing: 在一段时间不活动后发布更改。例如,可以使用 lodash 的 _.debounce 函数。
- RequestAnimationFrame throttling: 基于 requestAnimationFrame 的更改。例如,可以使用 raf-schd。
注意:_.debounce, _.throttle 和 raf-schd 都提供了一个 cancel 方法来取消延迟回调。所以需要调用 componentWillUnmount,或者对代码进行检查来保证在延迟函数有效期间内组件始终挂载。
165.JSX 如何防止注入攻击?
React DOM 会在渲染 JSX 中嵌入的任何值之前对其进行转义。因此,它确保你永远不能注入任何未在应用程序中显式写入的内容。
const name = response.potentiallyMaliciousInput;
const element = <h1>{name}</h1>;
这样可以防止应用程序中的XSS(跨站点脚本)攻击。
166.如何更新已渲染的元素?
通过将新创建的元素传递给 ReactDOM 的 render 方法,可以实现 UI 更新。例如,让我们举一个滴答时钟的例子,它通过多次调用 render 方法来更新时间:
function tick() {
const element = (
<div>
<h1>Hello, world!</h1&g