让我们一起来熟悉 React@18.3 的 use()

首先

由于 React 18.3 即将推出一个名为 use() 的新 Hook,所以现在就要尽量熟悉它,以免慌忙起来。

这个题目

突然,这是来源。

这是使用Render-as-You-Fetch技术的React@18.2之前的老代码,对于聪明的人来说应该已经很熟悉了。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width">
  </head>
  <body>
    <div id="app"></div>

    <script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
  
    <script>
////////////////////////////////////////////////////

// Render-as-You-Fetch
// https://reactjs.org/docs/concurrent-mode-suspense.html#approach-3-render-as-you-fetch-using-suspense
const wrapPromise = promise => {
  let status = "pending"
  let result
  const suspender = promise.then(
    r => {
      status = "success"
      result = r
    },
    e => {
      status = "error"
      result = e
    }
  )
  return {
    read() {
      if (status === "pending") {
        throw suspender
      } else if (status === "error") {
        throw result
      } else if (status === "success") {
        return result
      }
    }
  }
}

//
const resource = wrapPromise(
  (async() => {
    const r = await fetch('https://www.reddit.com/r/reactjs.json')
    return await r.json()
  })()
)

//
const Inner = props => {
  const json = resource.read()
  const posts = json.data.children.map((child) => child.data);
  return posts.map(post => 
    React.createElement('div', {key: post.id}, post.title)
  )
}

//
const App = props => {
  return React.createElement(React.Suspense, 
    {
      fallback: React.createElement('p', {}, 'Now Loading...')
    }, 
    React.createElement(Inner)
  )
}

const root = ReactDOM.createRoot(document.getElementById("app"))
root.render(React.createElement(App))
    
////////////////////////////////////////////////////
    </script>
  
  </body>

</html>

终于,大家期待已久的使用()方法的最新源代码来了。现在看起来干净多了!

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width">
  </head>
  <body>
    <div id="app"></div>

    <script crossorigin src="https://unpkg.com/react@18.3.0-next-6883d7944-20221101/umd/react.production.min.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@18.3.0-next-6883d7944-20221101/umd/react-dom.production.min.js"></script>
  
    <script>
////////////////////////////////////////////////////

//
const resource = (async() => {
  const r = await fetch('https://www.reddit.com/r/reactjs.json')
  return await r.json()
})()

//
const Inner = props => {
  const json = React.use(resource)
  const posts = json.data.children.map((child) => child.data);
  return posts.map(post => 
    React.createElement('div', {key: post.id}, post.title)
  )
}

//
const App = props => {
  return React.createElement(React.Suspense, 
    {
      fallback: React.createElement('p', {}, 'Now Loading...')
    }, 
    React.createElement(Inner)
  )
}

const root = ReactDOM.createRoot(document.getElementById("app"))
root.render(React.createElement(App))
    
////////////////////////////////////////////////////
    </script>
  
  </body>

</html>

最后

如果比较一下上述的资源,你应该不会为 React@18.3 而感到慌张和困惑了。
结合我之前发布的类信号系统,也许很快就能成为真正强大的 React 大师了,这话一点也不夸张。

感谢您一直阅读我的拙文,直到最后<(_ _)>

广告
将在 10 秒后关闭
bannerAds