interview
advanced-react
如何在 React 中使用 innerHTML

React 进阶面试题, 如何在 React 中使用 innerHTML?

React 进阶面试题, 如何在 React 中使用 innerHTML?

QA

Step 1

Q:: 如何在 React 中使用 innerHTML?

A:: 在 React 中,直接使用 innerHTML 是不推荐的,因为这可能导致 XSS(跨站脚本攻击)的风险。取而代之的是,React 提供了 dangerouslySetInnerHTML 属性,它允许开发者直接设置 HTML 内容。使用时需要非常谨慎,确保所插入的 HTML 是可信任的。用法示例如下:

 
<div dangerouslySetInnerHTML={{ __html: '<p>Some HTML content</p>' }}></div>
 

这里,__html 是必须的,并且它的值是你要插入的 HTML 字符串。

Step 2

Q:: 使用 dangerouslySetInnerHTML 的风险是什么?

A:: 使用 dangerouslySetInnerHTML 的主要风险是它可能导致 XSS(跨站脚本攻击)。如果输入的内容没有经过充分的验证和消毒,恶意用户可以插入恶意脚本,导致安全漏洞。因此,在使用这个属性时,开发者必须确保所插入的 HTML 内容是完全可信的,最好只使用来自受信任来源的内容。

Step 3

Q:: 什么时候在 React 中会使用 dangerouslySetInnerHTML?

A:: 通常在处理富文本编辑器或从第三方 API 获取的内容时,可能需要使用 dangerouslySetInnerHTML。例如,当你从 CMS 系统获取 HTML 内容并将其显示在页面上时,你可能会用到它。然而,开发者应该尽量避免使用这个属性,除非确实没有其他选择,并且确保所有内容已经过安全验证。

Step 4

Q:: React 为什么不推荐使用 innerHTML?

A:: React 不推荐使用 innerHTML 是因为它破坏了 React 的虚拟 DOM 机制,并且容易引发安全问题。React 的设计哲学是通过声明式编程管理 DOM,而 innerHTML 属于命令式编程风格,会绕过 React 的虚拟 DOM,导致 React 无法正确地跟踪 DOM 变化。此外,直接操作 DOM 的 innerHTML 可能引入 XSS 漏洞。

用途

面试中涉及到 React 的 innerHTML 或 `dangerouslySetInnerHTML` 的问题,主要是为了考察候选人对 React 安全性的理解,以及对 React 虚拟 DOM 工作原理的掌握。在实际生产环境下,当你需要处理外部提供的 HTML 内容(例如用户输入的富文本、从 API 获取的 HTML 等)时,可能会使用 `dangerouslySetInnerHTML`。面试官通过这个问题了解候选人是否能够在这些场景下确保应用的安全性。\n

相关问题

🦆
React 虚拟 DOM 的工作原理是什么?

React 的虚拟 DOM 是一种轻量级的 JavaScript 对象,它是对真实 DOM 的抽象。每当组件的状态或属性发生变化时,React 首先在虚拟 DOM 中生成一个新的树结构,然后将这个新的虚拟 DOM 与旧的虚拟 DOM 进行对比(即 Diffing 算法),找出差异。最后,React 只更新那些实际发生变化的 DOM 元素,而不是整个页面,这样可以提高性能。

🦆
如何在 React 中防止 XSS 攻击?

在 React 中防止 XSS 攻击的关键是避免使用 dangerouslySetInnerHTML,并且不直接插入未经处理的用户输入或第三方数据。如果必须使用 dangerouslySetInnerHTML,则应确保数据是安全的,例如通过严格的验证和清理。此外,在表单输入中,React 默认会自动转义字符串以防止 XSS,开发者应该尽量使用这种默认行为。

🦆
React 中的 ref 是什么?它的用途是什么?

React 中的 ref 是一个引用,用于访问 DOM 元素或 React 元素的实例。在某些情况下,你可能需要直接操作 DOM 元素,比如管理焦点、文本选择、或触发动画等操作。通过 ref,你可以在组件挂载后获取 DOM 元素的引用,从而进行操作。用法示例如下:

 
const myRef = React.useRef(null);
useEffect(() => {
  myRef.current.focus();
}, []);
return <input ref={myRef} />;
 
🦆
React 中的生命周期方法有哪些?

在 React 16.3 以前,类组件的生命周期方法包括 componentDidMountcomponentDidUpdatecomponentWillUnmount 等。而在 React 16.3 及以后,新增了 getDerivedStateFromPropsgetSnapshotBeforeUpdate。对于函数组件,React 提供了 useEffect 钩子函数来模拟生命周期方法,这个钩子函数可以模拟组件挂载、更新和卸载等生命周期事件。