react-dom 的 renderToString 與 renderToStaticMarkup

官方文檔地址

介紹

renderToStringrenderToStaticMarkup 都是同 render 一樣都是 react-dom 包提供的方法
不過 renderToStringrenderToStaticMarkupreact-dom/server 內(nèi)

import {render} from 'react-dom'
import {renderToString} from 'react-dom/server'
import {renderToStaticMarkup} from 'react-dom/server'

render 方法不用多說, 是用于瀏覽器端渲染, 學習過 react 的都接觸過
render 方法接受 2 個參數(shù) render([react element], [DOM node])

renderToStringrenderToStaticMarkup 只接受一個參數(shù)
renderToString(react element)
renderToStaticMarkup(react element)
但都返回一段HTML字符串, 這就使得 react 在服務(wù)端渲染成為可能.

演示代碼

如代碼所示

  • 服務(wù)端
    使用 renderToString/renderToStaticMarkup 方法將 <Hello /> 組件渲染到 #react-target 節(jié)點內(nèi)
import {renderToString} from 'react-dom/server'
import React from 'react'
import KoaRouter from 'koa-router'
import Hello from '../../react/server'
app.get('/hello', (ctx, next) => {
    ctx.body = `
      <html>
      <head>
        <title>title</title>
        <script src="/socket.io/socket.io.js"></script>
      </head>
      <body>
        <div id="react-target">${renderToString(<Hello />)}</div>
        {/* <div id="react-target">${renderToStaticMarkup(<Hello />)}</div> */}
        <script src="/main.js"></script>
      </body>
      </html>
    `
  })
  • 瀏覽器端
    使用 render 方法將 <Hello /> 組件渲染到 #react-target 節(jié)點內(nèi)
  render(<Hello />, document.getElementById('react-target'))

區(qū)別

  • renderToString 方法渲染的時候帶有 data-reactid 屬性.
  • renderToStaticMarkup 則沒有 data-reactid 屬性, 可以節(jié)省一點流量.

data-reactid 簡單的說就是 react 組件 的一個唯一標示 id, 具體可以去 google 下

對于服務(wù)端渲染而言

  • 使用 renderToStaticMarkup 渲染出的是不帶data-reactid的純 html 在前端 react.js 加載完成后, 之前服務(wù)端渲染的頁面會抹掉之前服務(wù)端的重新渲染(可能頁面會閃一下). 換句話說 前端react就根本就不認識之前服務(wù)端渲染的內(nèi)容, render 方法會使用 innerHTML 的方法重寫 #react-target 里的內(nèi)容

  • 而使用 renderToString 方法渲染的節(jié)點會帶有 data-reactid 屬性, 在前端 react.js 加載完成后, 前端 react.js 會認識之前服務(wù)端渲染的內(nèi)容, 不會重新渲染 DOM 節(jié)點, 前端 react.js 會接管頁面, 執(zhí)行 componentDidMout 綁定瀏覽器事件等 這些在服務(wù)端沒完成也不可能執(zhí)行任務(wù).

tips

  • 服務(wù)端渲染的時候不要習慣性地寫成下面這種形式
    <div id="react-target"> ${renderToString(<Hello />)} </div>

而應(yīng)該寫成沒有空格的形式, 如下
<div id="react-target">${renderToString(<Hello />)}</div>

因為這樣會增加空格, 導致前端 react.js 不認識之前服務(wù)端渲染的內(nèi)容, 導致重新渲染!

  • 另外一點需要注意的是前后端渲染的內(nèi)容應(yīng)該保持一致
  • DOM 結(jié)構(gòu)
  • store

這里還沒有涉及到 stote, 未完待續(xù)...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原教程內(nèi)容詳見精益 React 學習指南,這只是我在學習過程中的一些閱讀筆記,個人覺得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,940評論 1 18
  • react+redux+webpack+babel+npm+shell+git這方面的內(nèi)容我會隨時更新,更新內(nèi)容放...
    liangklfang閱讀 706評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,939評論 25 709
  • 參考文章:深度剖析:如何實現(xiàn)一個Virtual DOM 算法 作者:戴嘉華React中一個沒人能解釋清楚的問題——...
    waka閱讀 6,144評論 0 21
  • 小老板問我孔雀開屏怎么說。。。呃,不會。。。去查字典呀,可是這個字典上真心沒有。也不能說沒有啦,有道字典上說是:“...
    海歸程序猿奶爸閱讀 4,086評論 0 4

友情鏈接更多精彩內(nèi)容