React アプリ開発のための 4 つの実践的なヒント
# [関連トピックの推奨事項: 面接の質問に対応する (2020)]
#背景
フックは発売以来非常に人気があり、React コードの記述方法が変わり、より簡潔なコードを記述するのに役立ちます。 今日の記事はフックに関するものではありません。フックに加えて、簡潔で明確なコードを書くのに役立つ実践的なテクニックがたくさんあります。
実践したものでもあります。今、それらを整理して皆さんと共有します。インスピレーションになれば幸いです。あなた ### ###。 #Text
1. 文字列を使用して React 要素を定義します
簡単な例: // 我们可以通过把一个字符串'p' 赋值给一个变量, 就像:
import React from 'react'
const MyComponent = 'p'
function App() {
return (
<mycomponent>
<h3 id="I-am-inside-a">I am inside a {'</h3>
<p></p>'} element
</mycomponent>
>
)
}
component を明示的に定義して、レンダリングされるコンテンツを決定することもできます。例:
// 定义一个MyComponent function MyComponent({ component: Component = 'p', name, age, email }) { return ( <component> <h1 id="Hi-name">Hi {name} </h1> <h6 id="You-are-age-years-old">You are {age} years old</h6> <small>Your email is {email}</small> > </component> ) }
function App() { return ( <mycomponent> > ) }</mycomponent>
This method 、次のようなカスタム コンポーネントを渡すこともできます。
function Dashboard({ children }) { return ({children}
) } function App() { return ( <mycomponent> > ) }</mycomponent>
要素または
を処理するコンポーネントが見つかった場合は、このカスタム方法で抽象化し、コードを簡素化できます。 実際の例を挙げます:たとえば、商品の梱包を要求する必要があります。商品は個別に梱包することも、バッチで梱包することもできます。カスタム コンポーネントは、一般的な製品向けに作成できます。ポイント:
import React from 'react' import withTranslate from '@components/withTranslate' import PackComponent from './PackComponent' import usePack, { check } from './usePack' let PackEditor = (props) => { const packRes = usePack(props) return ( <packcomponent></packcomponent> ) } PackEditor = withTranslate(PackEditor) PackEditor.check = check export default PackEditor
JavaScript では、発生する可能性のある例外をキャッチするために try/catch を使用します。 catch
でエラーを処理します。例:function getFromLocalStorage(key, value) { try { const data = window.localStorage.get(key) return JSON.parse(data) } catch (error) { console.error } }
このようにすると、エラーが発生した場合でも、アプリケーションが白い画面でクラッシュすることはありません。
React も結局は Javascript であり、本質的な違いはありませんので、
try/catch も同様に使用して問題ありません。 ただし、React の実装メカニズムにより、コンポーネント内で Javascript エラーが発生すると内部状態が破壊され、レンダリングでエラーが生成されます: https://github.com/facebook/ react/issues/4026
上記の理由に基づいて、React チームは
Error Boundaries:
エラー境界
React が提供する公式の例を見てください:
https://reactjs.org/docs/error-boundaries.html#introducing-error-boundaries
class ErrorBoundary extends React.Component { constructor(props) { super(props) this.state = { hasError: false } } static getDerivedStateFromError(error) { // Update state so the next render will show the fallback UI. return { hasError: true } } componentDidCatch(error, errorInfo) { // You can also log the error to an error reporting service logErrorToMyService(error, errorInfo) } render() { if (this.state.hasError) { // You can render any custom fallback UI return <h1 id="Something-went-wrong">Something went wrong.</h1> } return this.props.children } }
使用法:
<errorboundary> <mywidget></mywidget> </errorboundary>
Dan Abramov によるライブ デモ:
平易な言葉で言うと、いわゆる上位コンポーネントとは、コンポーネントを投入し、いくつかの属性または操作を追加してからそれを投入することです。 一般的に、 という共通点を持ついくつかの
コンポーネントを上位コンポーネント
に抽象化し、それを別のモジュール ## で 再利用することができます。 たとえば、私たちのシステムには、多くの場所で使用される
border
を追加する必要があるタイプのボタンがあります。これを抽象化します: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">import React from 'react'
// Higher order component
const withBorder = (Component, customStyle) => {
class WithBorder extends React.Component {
render() {
const style = {
border: this.props.customStyle ? this.props.customStyle.border : '3px solid teal'
}
return <component></component>
}
}
return WithBorder
}
function MyComponent({ style, ...rest }) {
return (
<p>
</p><h2>
This is my component and I am expecting some styles.
</h2>
</pre><div class="contentsignin">ログイン後にコピー</div></div>
で統一できるのでとても便利です。 私のプロジェクトでは、いくつかの上位コンポーネントも使用しています。具体的な例を挙げると:
PackEditor = withTranslate(PackEditor)
私たちの PackEditor
は拡張コンポーネントです。どのような機能が追加されていますか?
名前が表すように、
withTranslate は翻訳機能を追加します。このコンポーネントがどのように実装されているかを説明します: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">import React from 'react'
import { Provider } from 'react-redux'
import { injectIntl } from 'react-intl'
import { store } from '@redux/store'
import { Intl } from './Locale'
const withTranslate = BaseComponent => (props) => {
// avoid create a new component on re-render
const IntlComponent = React.useMemo(() => injectIntl(
({ intl, ...others }) => (
<basecomponent> { // 注入翻译方法
if (!id) { return '' }
return intl.formatMessage(
typeof id === 'string' ? { id } : id,
values
)
}}
{...others}
/>
)
), [])
IntlComponent.displayName = `withTranslate(${BaseComponent.displayName || 'BaseComponent'})`
return (
<provider>
<intl>
<intlcomponent></intlcomponent>
</intl>
</provider>
)
}
export default withTranslate</basecomponent></pre><div class="contentsignin">ログイン後にコピー</div></div>
使用方法は非常に柔軟です:
とても便利です。
4. Render props
Render prop は、React コンポーネント間の値を使用する関数を指します prop # の単純な技術##コードの共有はHOCに似ており、コンポーネント間のロジックの再利用の問題です。
より具体的には、Render プロパティは、どのコンテンツ
をレンダリングする必要があるかをコンポーネントに伝える関数です。 簡単な例を見てみましょう:
次のコンポーネントは、Web アプリケーションでのマウスの位置を追跡します:
const Editor = withTranslate(({ // ... translate, }) => { // ... return ( {translate('xxx')}} > ) })
カーソルが画面上を移動すると、コンポーネントはその (x ,y) 座標を表示します。 ここでの質問は次のとおりです:
この動作を別のコンポーネントで再利用するにはどうすればよいでしょうか?
换个说法,若另一个组件需要知道鼠标位置,我们能否封装这一行为,以便轻松地与其他组件共享它 ??
假设产品想要这样一个功能: 在屏幕上呈现一张在屏幕上追逐鼠标的猫的图片。
我们或许会使用 这个需求如此简单,你可能就直接修改Mouse组件了: 巴适~ 简单粗暴, 一分钟完成任务。 可是,如果下次产品 以上的例子,虽然可以完成了猫追鼠标的需求,还没有达到以 当我们想要鼠标位置用于不同的用例时,我们必须创建一个新的组件,专门为该用例呈现一些东西. 这也是 render prop 的来历: 我们可以提供一个带有函数 prop 的 修改一下上面的代码:
{this.props.render(this.state)}
class Cat extends React.Component {
render() {
const mouse = this.props.mouse;
return (
<img src="/static/imghw/default1.png" data-src="/cat.jpg" class="lazy" alt="React アプリ開発のための 4 つの実践的なヒント" >
);
}
}
class Mouse extends React.Component {
state = { x: 0, y: 0 };
handleMouseMove = (event) => {
this.setState({
x: event.clientX,
y: event.clientY
});
}
render() {
return (
<p>
<cat></cat>
</p>
);
}
}
再要想加条狗呢
?可复用的方式
真正封装行为的目标。<mouse></mouse>
组件,它能够动态决定
什么需要渲染的,而不是将 硬编码
到 class Cat extends React.Component {
render() {
const mouse = this.props.mouse;
return (
<img src="/static/imghw/default1.png" data-src="/cat.jpg" class="lazy" alt="React アプリ開発のための 4 つの実践的なヒント" >
);
}
}
class Mouse extends React.Component {
state = { x: 0, y: 0 };
handleMouseMove = (event) => {
this.setState({
x: event.clientX,
y: event.clientY
});
}
render() {
return (
移动鼠标!
提供了一个render 方法,让动态决定什么需要渲染。
事实上,render prop 是因为模式才被称为 render prop ,不一定要用名为 render 的 prop 来使用这种模式。
任何被用于告知组件需要渲染什么内容的函数 prop, 在技术上都可以被称为 "render prop".
另外,关于 render prop 一个有趣的事情是你可以使用带有 render prop 的常规组件来实现大多数高阶组件 (HOC)。
例如,如果你更喜欢使用 withMouse HOC 而不是
function withMouse(Component) { return class extends React.Component { render() { return ( <mouse> ( <component></component> )}/> ); } } }</mouse>
也是非常的简洁清晰。
有一点需要注意的是, 如果你在定义的render函数里创建函数, 使用 render prop 会抵消
使用 React.PureComponent 带来的优势。
因为浅比较 props 的时候总会得到 false,并且在这种情况下每一个 render 对于 render prop 将会生成一个新的值
。
class Mouse extends React.PureComponent { // 与上面相同的代码...... } class MouseTracker extends React.Component { render() { return ( <mouse> ( // 这是不好的! 每个渲染的 `render` prop的值将会是不同的。 <cat></cat> )}/> > ); } }</mouse>
在这样例子中,每次
为了绕过这一问题
,有时你可以定义一个 prop 作为实例方法
,类似这样:
class MouseTracker extends React.Component { renderTheCat(mouse) { return <cat></cat>; } render() { return ( <p> </p><h1 id="Move-the-mouse-around">Move the mouse around!</h1> <mouse></mouse> ); } }
5.组件性能
性能优化是永恒的主题, 这里不一一细说, 提供积分资源供你参考:
- React.memo https://reactjs.org/docs/reac...
- React.useMemo https://flaviocopes.com/react...
- React.useCallback https://reactjs.org/docs/hook...
- React.PureComponent https://reactjs.org/docs/reac...
- Optimizing performance https://reactjs.org/docs/opti...
总结
以上几点都是我们经常要使用的技巧, 简单实用, 分享给大家, 希望能给大家带来一些帮助或启发,谢谢。
推荐阅读:React在线手册
以上がReact アプリ開発のための 4 つの実践的なヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

JS-Torch の概要 JS-Torch は、構文が PyTorch に非常に似ている深層学習 JavaScript ライブラリです。これには、完全に機能するテンソル オブジェクト (追跡された勾配で使用可能)、深層学習レイヤーと関数、および自動微分エンジンが含まれています。 JS-Torch は JavaScript での深層学習の研究に適しており、深層学習の開発を加速するための便利なツールや機能を多数提供します。 Image PyTorch は、Meta の研究チームによって開発および保守されているオープンソースの深層学習フレームワークです。ニューラル ネットワーク モデルを構築およびトレーニングするための豊富なツールとライブラリのセットを提供します。 PyTorch は、シンプル、柔軟、そして使いやすいように設計されており、その動的な計算グラフ機能により、

Go と Node.js には、型指定 (強い/弱い)、同時実行性 (ゴルーチン/イベント ループ)、ガベージ コレクション (自動/手動) の違いがあります。 Go は高スループットと低レイテンシーを備えており、高負荷のバックエンドに適しています。Node.js は非同期 I/O に優れており、高い同時実行性と短いリクエストに適しています。この 2 つの実際のケースには、Kubernetes (Go)、データベース接続 (Node.js)、Web アプリケーション (Go/Node.js) が含まれます。最終的な選択は、アプリケーションのニーズ、チームのスキル、個人の好みによって異なります。

JavaScript と WebSocket: 効率的なリアルタイム検索エンジンの構築 はじめに: インターネットの発展に伴い、ユーザーのリアルタイム検索エンジンに対する要求はますます高くなっています。従来の検索エンジンで検索を行う場合、ユーザーは検索ボタンをクリックする必要があり、リアルタイムの検索結果を求めるユーザーのニーズに応えることができませんでした。そのため、JavaScript と WebSocket テクノロジを使用してリアルタイム検索エンジンを実装することが注目されています。この記事ではJavaScriptの使い方を詳しく紹介します。

WebSocket と JavaScript を使用してオンライン電子署名システムを実装する方法の概要: デジタル時代の到来により、電子署名は従来の紙の署名に代わってさまざまな業界で広く使用されています。 WebSocketは全二重通信プロトコルとしてサーバーとリアルタイム双方向のデータ通信が可能で、JavaScriptと組み合わせることでオンライン電子署名システムを実現できます。この記事では、WebSocket と JavaScript を使用して簡単なオンライン アプリケーションを開発する方法を紹介します。
