react 渲染 html 特殊字元的bug

flashback發表於2019-02-16

答案寫在最前面(demo):

function translateHtmlCharater(html) {
    var div = document.createElement("div");
    div.innerHTML = html;
    return div.textContent;
}

然後在需要轉換的地方呼叫這個方法 translateHtmlCharater(html) 生成即可,原因是 js 無法渲染 html 字元(熟悉 tpl2js 的人,應該都知道那些特殊字元 js 會以 unicode 的方式處理)。

首先,這不是一個 bug,這不是一個 bug,這真的不是一個bug。順便說說解決問題的過程,以及對於鞏固基礎的一點想法。

剛寫 react 不久,公司業務後臺生成的商品名當中有一些html 實體字元,會出現字元被直接以字元的形式渲染出來而不是字元結果,例如 & amp; 不會渲染成&。於是我在網路上搜尋了 “react 渲染 html 字元 ” ,然後發現react 官方給了方案(因為要防止 xss 注入)。然後使用 dangerouslySetInnerHTML 的方式解決了名稱的問題點這裡看,但是有出現了這樣的問題(把游標凡在第二排,title 會顯示出來,並且顯示是錯的)。

這種方式一方面不優雅,另一方面沒有完全解決問題。然後我在技術群裡求助(很多人出現了這個問題,但大都是以 dangerouslySetInnerHTML 或者乾脆不解決)。開始搜尋“渲染 html 字元”看了幾個,發現網上的處理並不優雅,甚至有人拿正則來替換(也是醉)。各方求助之後,有人問我你這個是 html 實體字元啊,js 怎麼可能渲染。於是這個時候出現轉機,出現了文章一開頭的解決辦法。什麼問題都給到了解決。

列幾點,對自己的期望,也希望能幫助看這篇文章的人:

  1. 在這個前端框架不斷湧現,前端技術突飛猛進的時代,基礎依舊是一個前端工程師賴以生存的根本。比如這個問題,其實很入門,但 github 有 issue ,react 自己文件裡還單獨來寫了一個篇來講這個(雖然依舊沒解決)。

  2. 解決問題的時候,如果出現框架給的方案不能完美解決的時候,真的就需要審視的態度抑或是跳出框架的思維。框架是帶來思想,解決問題的,而不應當被框架限制。

相關文章