検索
ホームページウェブフロントエンドjsチュートリアルReact の使用: React コンポーネント内の状態管理

この記事では React の使い方を紹介します。React コンポーネントの内部状態管理には特定の参照値があります。必要な場合はそれを参照してください。

この記事では、React コンポーネント内の状態管理に焦点を当てて、次の 3 つの中心的な概念を理解または再考します。

  1. propsstate

  2. 機能コンポーネント

  3. クラスコンポーネント

はじめましょう!

01. React のデータ

「コンポーネント」の観点から見ると、React はアプリケーション内を流れるデータを 2 つのタイプに分類します。

コンテンツを変更することはできませんが、コンポーネント間で一方向に渡すことができるプロパティ。

コンテンツは変更できますが、状態をコンポーネント間で渡すことはできません。

さらに、プロパティと状態の違いは、プロパティは外部であり、このコンポーネントをレンダリングするコードによって制御されることです。状態は内部的なものであり、コンポーネント自体によって制御されます。

コンピューターを専攻していない初心者は、props と state の名前と意味の関係についてよく混乱します。実際、これらは本質的にはデータの別名にすぎませんが、React ではそれぞれに名前が付けられています。特別な制限または機能。

HTML でプロパティを渡すのと同じように、コンポーネントの props 属性を通じて、子コンポーネントに渡したいデータを渡すことができます。すべてのプロパティは、子コンポーネント (クラス コンポーネント) の this.props オブジェクトに格納されます。

リーリー

02. 機能コンポーネント

React はパフォーマンスを向上させるためにコンポーネントを使用してビューをレンダリングすることを前に説明しました。コンポーネントは関数であり、その関数は f (データ) => UI という式で簡潔に表現できます。この時点で、React が大規模な MVC (または MVVM) フレームワークではないと言っている理由に気づいたはずです。React はビュー レイヤー (View) のレンダリングのみを担当し、その他のことは他のツールによって完了されるからです。 React エコシステム内で。

そうは言っても、React コンポーネントの場合、最も単純な形式は関数コンポーネントです。これは、一度に 1 つのことを実行するという React の哲学、コンポーネント化とデータ駆動型 UI を完全に示しています。

関数コンポーネントは、実際の React アプリケーション開発シナリオでは、関数コンポーネント自体が変更可能なデータを持つことができないため、「ステートレス コンポーネント」、「制御コンポーネント」、または「パペット コンポーネント」とも呼ばれます。関数コンポーネントをできる限り多くして、アプリケーション UI 全体を最小の視覚単位に分割します。

これは、関数コンポーネントが非常に直感的であり、属性を受け取って要素を返し、内部ロジックが明確で明確であるためです。さらに重要なことに、関数コンポーネントには this キーワードがないため、煩わしい「this」について心配する必要がありません。文脈の問題」。

注意: コンポーネントが内部状態を追跡する必要がない場合は、機能コンポーネントを使用するようにしてください。

03. クラスコンポーネント

関数コンポーネントに相当するのが「クラスコンポーネント」で、同様に「ステートフルコンポーネント」、「非制御コンポーネント」、「コンテナコンポーネント」とも呼ばれます。ここで、2 種類のコンポーネントにコードの形式で名前を付けていますが、JavaScript では「クラス」も関数であるため、これは厳密ではないことに注意してください。

関数コンポーネントとは異なり、クラス コンポーネントには変更可能な内部データ (状態) があります。これは最終的にページのレンダリングに影響し、状態はいつでもコンポーネントによって内部的に変更される可能性があります。通常の瞬間は、ユーザーがインターフェイスを操作するときです。

React はコンポーネント内の変更データをカプセル化し、一方向のデータ フローの原則に準拠しているためです。高度に抽象化された UI コンポーネントがあり、複雑なビジネス ロジックをカプセル化しています。これにより、一連の小さなコンポーネントを構築して組み合わせることで、大規模なアプリケーションを開発できるようになります。

では、クラスコンポーネントに状態を追加するにはどうすればよいでしょうか?それは簡単です。クラス コンポーネント内に state 属性を追加するだけです。state 属性はオブジェクトです。このオブジェクトはコンポーネントの状態を表します。オブジェクトの各属性名はコンポーネントの特定の状態を表します。

import React from "react"class Parent extends React.Component {
    state = {
        name: "Eliot",
    }
    
    render() {        return <p>{this.state.name}</p>
    }
}

React 使我们迫使大脑关注两个重要的部分:

组件看起来是什么样?

组件当前的状态是什么?

通过让组件管理自己的状态,任何时候状态的变更都会令 React 自动更新相应的页面部分。这便是使用 React 构建组件的主要优势之一:当页面需要重新渲染时,我们仅仅需要思考的是如何更改状态。我们不必跟踪页面的哪些部分需要更改,不需要决定如何有效的重新呈现页面,React 自会比较先前的输出和新的输出,决定什么应该发生改变,并为我们做出决定。而这个确定之前改变了什么和现在应该新输出什么的过程有一个专门的名词,叫做 Reconciliation。

04. 修改 state

你应该还记得类组件与函数组件最大的不同在于类组件自身拥有可以改变内部数据的能力。那么如何行使这一能力呢?和直觉不同,要做到这一点,你需要使用 React 提供的专门的 API:this.setState()。

你有两种方式使用该 API:

设置对象参数;

设置函数参数;

让我们先来看看第一种:

this.setState({    name: "Tom"})

React 会自动合并对 state 的改变。而有时,你的组件需要一个新的 state ,而这个 state 的变化又依赖于旧的 state值,每当这种时候,你就该使用第二种 API 调用方式:

this.setState((prevState) => ({
    name: "mr." + prevState.name
}))

讲到这里你可能会感到奇怪,只是更新 state 而已,为什么还需要调用一个专门的 API?我们直接修改之前定义的 state对象不就好了吗?之所以这样设计的原因是,组件内 state 的变化不仅仅是对象属性值发生变化那么简单,它还需要驱动整个 UI 进行重新渲染,因此 this.setState() 这个 API 被调用时实际上做了两件事:

修改 state 对象;

驱动组件重新渲染;

如果你对 React 有一定研究,你可能会质疑我以上所罗列的两点并不精确,的确如此,小小的 this.setState() API 其实内部还有很多细节值得注意,例如,当调用 this.setState() 时并不会立即改变 state 的值,也当然不会立即重新渲染组件。例如,当以对象为参数调用 this.setState() API 时,尽管内部重复为数据赋值,最终的数据也只保留最后一次更改的结果。

不过幸好,这些略显古怪的状态早有前人为我们做了详尽的解释,如果你感兴趣,请点击下方链接查询更多的信息:

setState:这个API设计到底怎么样

问一个react更新State的问题?

05. 控制组件

当你在 Web 应用中使用表单时,这个表单的数据被存储于相应的 DOM 节点内部,但正如我们之前提到的,React 的整个关键点就在于如何高效的管理应用内的状态。所以虽然表单的数据被存储于 DOM 中,React 依然可以对它进行状态管理。

而管理的方式即是使用“控制组件”。简单而言,“控制组件”会渲染出一个表单,但是将表单所需的所有真实数据作为 state 存储于组件内部,而不是 DOM 中。

之所以被称为“控制组件”的原因也即在于此,“控制组件”控制着组件内的表单数据,因此,唯一更新表单数据的方式就是更新组件内部对应的 state 值。

import React as "react"class Input extends React.Component {
    state = {
        value: "enter something...",
    }
    
    handleClick: (e) => {        this.setState({value: e.target.value})
    }
    
    render() {
        <input value={this.state.value} onKeyup={this.handleClick} />
    }
}

可以看到,我们使用 handleClick 方法响应用户每一次键盘敲击以即时更新表单状态,这样做不仅天然的支持了即时的输入验证,还允许你有条件的禁止或点亮表单按钮。

06. 小结

这篇文章我们介绍了 React 的两种数据形式:state 和 props,并且介绍了 React 组件的两种形式:函数组件与类组件,希望各位有所收获。

相关推荐:

react的使用: React如何渲染UI

React的使用:react框架的五大特点

以上がReact の使用: React コンポーネント内の状態管理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:パフォーマンスと効率の考慮事項Python vs. JavaScript:パフォーマンスと効率の考慮事項Apr 30, 2025 am 12:08 AM

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptの起源:その実装言語の調査JavaScriptの起源:その実装言語の調査Apr 29, 2025 am 12:51 AM

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

舞台裏:JavaScriptをパワーする言語は何ですか?舞台裏:JavaScriptをパワーする言語は何ですか?Apr 28, 2025 am 12:01 AM

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの未来:傾向と予測PythonとJavaScriptの未来:傾向と予測Apr 27, 2025 am 12:21 AM

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

Python vs. JavaScript:開発環境とツールPython vs. JavaScript:開発環境とツールApr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScriptはCで書かれていますか?証拠を調べるJavaScriptはCで書かれていますか?証拠を調べるApr 25, 2025 am 12:15 AM

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptの役割:WebをインタラクティブでダイナミックにするJavaScriptの役割:WebをインタラクティブでダイナミックにするApr 24, 2025 am 12:12 AM

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScript:接続が説明しましたCおよびJavaScript:接続が説明しましたApr 23, 2025 am 12:07 AM

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません