在 React 應用程式中顯示 iframe

Irakli Tchigladze 2023年1月30日
  1. 在 React 中使用 dangerouslySetInnerHTML 屬性顯示 iframe
  2. 在 React 中為 iframe 建立自定義元件
  3. 在 React 應用程式中放置 iframe 的效果
在 React 應用程式中顯示 iframe

每個現代應用程式都需要一個 HTML 結構。React 開發人員使用 JSX 輕鬆構建應用程式的標記。JSX 的語法看起來很像 HTML,因此即使你是 React 的新手,也很容易編寫。

在 React 中使用 dangerouslySetInnerHTML 屬性顯示 iframe

在某些情況下,你需要將 HTML 程式碼注入現有標記。在本文中,我們將討論在你的應用程式中插入 iframe 標籤的情況。

從伺服器獲取預結構化 HTML 程式碼作為響應的情況並不少見。大多數情況下,它被格式化為字串。

iframe 插入 React 應用程式中最困難的部分是解析字串值以獲取其屬性,例如源、寬度和高度。如果從伺服器接收到的資料具有更多的結構並指定 iframe 的寬度、高度和來源,這會更容易一些。例如,它可以是具有與這些值對應的屬性的物件。

iframe 插入 React 應用程式的最簡單方法是使用 dangerouslySetInnerHTML 屬性。該屬性的值應該是一個帶有 __html 鍵和字串 HTML 值的物件。

讓我們看一個例子:

export default function App(props) {
  const {
    iframeSource = '<iframe src="https://codesandbox.io/"></iframe>'
  } = props;
  return <div className="App" dangerouslySetInnerHTML={{__html: iframeSource}}></div>;
}

這是一個相當簡單的演示。我們有一個帶有預設值的 iframeSource 屬性,一個字串形狀的 iframe 標籤。

我們只返回一個帶有 dangerouslySetInnerHTML 屬性的 div 元素,該屬性設定為帶有 __html 鍵和 HTML 字串的物件。

你可以在 codesandbox 上測試示例程式碼。

在 React 中為 iframe 建立自定義元件

根據原始碼的結構,建立一個不使用 dangerouslySetInnerHTML 的自定義元件可能會更好。如果諸如 sourcewidthheight 之類的 iframe 屬性可用,你可以將它們作為 props 傳遞並完全避免使用 dangerouslySetInnerHTML

讓我們看一個例子:

export default function Component(props){
   const {source, height, width} = this.props
   return (
   	<div>          
      <iframe src={source} height={height} width={width}/>         
    </div>
   ) 
}   

這是一個更簡單的解決方案。你可以在應用程式的任何地方使用這個元件,只要你有必要的值作為 props 傳遞。

有時你必須解析字串以提取 iframe 標籤的高度、寬度和來源等值。出於安全原因,最好避免使用 dangerouslySetInnerHTML 屬性,如下所述。

在 React 應用程式中放置 iframe 的效果

一般來說,在你的 React 應用程式中放置 iframe 被認為是一種不安全的做法。問題是你無法控制源頁面,它可以顯示任何內容。

iframe 中的頁面可能需要很長時間才能載入,這也會影響整個頁面的效能。

除此之外,dangerouslySetInnerHTML 屬性會將你的訪問者暴露給 XSS 攻擊。還有其他安全風險和潛在洩漏。

根據經驗,如果你的 React 應用程式必須包含 iframe 標籤,請確保你信任源頁面不會嘗試任何惡意行為。

Irakli Tchigladze avatar Irakli Tchigladze avatar

Irakli is a writer who loves computers and helping people solve their technical problems. He lives in Georgia and enjoys spending time with animals.

LinkedIn