介紹
renderToString 與 renderToStaticMarkup 都是同 render 一樣都是 react-dom 包提供的方法
不過 renderToString 和 renderToStaticMarkup 在 react-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])
而 renderToString 與 renderToStaticMarkup 只接受一個參數(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ù)...