ホームページ ウェブフロントエンド jsチュートリアル React でコンポーネントの内部通信を実装する方法

React でコンポーネントの内部通信を実装する方法

Jun 14, 2018 pm 03:24 PM

この記事ではReactのデータ送信におけるコンポーネントの内部通信方法を中心に紹介しますので、参考にしてください。

1. 概要

プライマリ フロントエンドをしばらく離れると、スタイルの作成に費やす時間がますます減り、データの処理に費やす時間がますます増えていることがわかります。データを処理するプロセスはビジネス ロジックを実装するプロセスでもあり、間違いなくプロジェクトで最も重要です。

フロントエンド フレームワークを学習し、基本的な構文を理解したら、次のステップはデータの転送方法を学習することです。

Angular 設計の最初のハイライトの 1 つは、データの双方向バインディングの実現です。Vue をしばらく使用した後、いわゆるデータの双方向バインディングが、内部の唯一のアプリケーション シナリオであることがわかりました。コンポーネントはフォーム form (input、textarea、select、radio ) であり、このシナリオでのデータの双方向バインディングは、フレームワーク内に実装されていなくても、自分で実装するのが非常に簡単です。これを理解すると、React が双方向のデータ バインディングを実装していないと考えるのは甘いと感じます。

React データ転送には 2 つの側面が含まれます: コンポーネント内のデータ転送

  1. フォームの双方向データ バインディングの実装方法とコンポーネント間のデータ転送

  2. 。 子コンポーネントにデータを渡す親コンポーネント、親コンポーネントにデータを渡す子コンポーネント、兄弟コンポーネント間でのデータの受け渡しが含まれます。

この記事では、まずコンポーネント内のデータ転送について説明します。

2. コンポーネント内の内部データ転送

React コンポーネントの内部通信は、主にデータ表示とイベント処理の 2 つの部分に分かれています。

2.1 データ表示

コンポーネントの内部データの表示と更新は状態を通じて実装されます。状態を使用する場合は、ES6 クラスを使用してコンポーネントを定義する必要があります。データの更新については、双方向データ バインディングのセクションで説明します。このセクションでは、初期化されたデータの表示についてのみ説明します。

Vue に詳しい方ならわかると思いますが、React の state オブジェクトは Vue の data オブジェクトと同等です

以下は純粋にデータを表示する例です:

class App extends Component {
 constructor(props) {
 super(props);

 // 初始化 state
 this.state = {
  inputValue: "test",
 };
 }

 render() {
 // 注意,在 react 中,DOM 元素是对象,所以使用‘()'包住 
 return (
  <p className="App">
  <p>{this.state.inputValue}</p>
  </p>
 );
 }
}
ログイン後にコピー

クラスで定義された React コンポーネントでは、ライフサイクルフック関数に加えて、 constructor() と render() の 2 つのメソッドも自動的に実行されます。Constructor() が最初に実行され、constructor() の実行中に、DOM をレンダリングするための render() 用のデータが準備されます。

実際、constructor() 関数は、コンポーネントのライフサイクルで呼び出される最初の関数です。

2.2 イベント

2.2.1 DOM のイベントとの類似点と相違点

React でのイベントの処理は DOM でのイベントの処理と似ていますが、2 つの違いがあります:

  1. React イベントでのキャメルケース命名法による命名すべて小文字の代わりに

  2. 文字列ではなく JSX のイベ​​ント ハンドラーとして関数を直接渡します。

2 番目のポイントには落とし穴があります。これについては後ほど詳しく説明します

たとえば、HTML のイベント:

<button onclick="activateLasers()">
 Activate Lasers
</button>
ログイン後にコピー

React のイベント:

// 因为 jsx 中&#39;{}&#39;里面代表函数表达式,
// 所以传递给 onClick 的实际是函数 activateLasers 的函数体部分,
// 因此需要指定 this 指向,不然会报错
<button onClick={activateLasers}>
 Activate Lasers
</button>
ログイン後にコピー

2.2.2 落とし穴

関数をイベントとして直接渡すハンドラーは関数の実行環境を指定する必要があります。つまり、これを手動でバインドする必要があります。そうしないと、これが未定義であるというエラーが報告されます。以下の例を参照してください:

class App extends Component {
 constructor(props) {
 super(props);
 this.state = {
  isToggleOn: true,
 };

 // 手动绑定 this
 this.handleClick = this.handleClick.bind(this);
 }

 handleClick() {
 // 如果不在 constructor() 方法中手动绑定 this,直接将其作为事件处理程序 this 为 undefined
 console.log(this);

 this.setState(prevState => ({
  isToggleOn: !prevState.isToggleOn
 }));
 }

 render() {
 return (
  <p className="App">
  <button onClick={this.handleClick}>
   {this.state.isToggleOn ? "on" : "off"}
  </button>
  </p>
 );
 }
}
ログイン後にコピー

2.2.3 なぜ落とし穴があるのですか?

React の公式 Web サイトには、この問題には JS ネイティブ構文が必要であると記載されていますが、React は JS の場合にそのようなイベント システムを設計しているとは限りません。構文はすでに決まっています。誰かが立ち上がって責任を負わなければならない場合は、五分五分で引き受けさせてください。

1、JSネイティブ構文の問題

JS構文には次のようなルールがあります: 関数の関数本体(()なし)が別の変数に代入される場合、関数本体内のthisポインタは変更される可能性があります。変化するかどうかは、関数と代入した変数が同じスコープ(同じ実行環境)にあるかどうかによりますが、実際に使用する場合は同じスコープ内の変数に関数を代入する意味はありません。その関数を直接指定するのは問題ありません。別の変数に代入する必要はありません。

このポインタは変更されません。意味のない例 (説明の便宜上、var 演算子を直接使用します):

var fn = function () {
 console.log(this);
};

var a = fn;

fn(); // window
a(); // window
this 指向发生改变的例子:

var fn = function () {
 console.log(this);
};

// 将函数体赋值给一个对象的属性,函数执行时 this 和定义时指向不同
var o = {
 a: fn,
};

fn(); // window
o.a(); // o,即{a:f}
ログイン後にコピー

関数本体を別の変数に代入し、元の関数の this ポイントもそれに代入する場合。 、次のように、代入プロセス中にこれをバインドする必要があります:

var fn = function () {
 console.log(this);
};

// fn 在赋值的同时将内部的 this 打包一块赋值给了 a
var o = {
 a: fn.bind(this),
};

fn(); // window
o.a(); // window
ログイン後にコピー

通常、関数本体を変数に代入するときにこのエラーを回避するために、バインディング実行環境操作が実行されます。典型的な例は var bindingId = document です。 getElementById.bind(document)

2、JSXの問題

JSXのDOM要素もオブジェクトであるため、要素の属性に値を割り当てることは、実際にはDOM要素オブジェクトの属性に値を割り当てることになります。以下を参照してください。

const element = (
 <button onClick={this.handleClick}>click me</button>
);
ログイン後にコピー

const element = {
 type: &#39;button&#39;,
 props: {
 onClick: this.handleClick,
 children: &#39;click me&#39;,
 },
};
ログイン後にコピー


と同等です。これは、実際に関数本体をオブジェクトのプロパティに割り当てます。これは、関数の実行時と関数の定義時に異なるシナリオを指します。このポインターはネイティブ構文と同じです。違いは、ネイティブ JS ではとにかくポインタが常に存在するのに対し、JSX は直接未定義であることです。

したがって、これをバインドせず、未定義を報告するというエラーを完全に JS ネイティブ構文のせいにすることはできません。

3. 双向数据绑定

通过 state 传递数据加上事件处理程序便能实现数据的双向绑定,其背后的思想是(以 input 为例):初始化时将 state 中预定义的 state a 赋值给 input,当 input 的 value 发生改变时,触发事件处理程序,将改变后的 value 赋值给状态 a ,React 监测到 state 改变时重新调用 render() 方法,即重新渲染组件,达到双向绑定的目的。

class App extends Component {
 constructor(props) {
  super(props);
  this.state = {
   inputValue: "test",
  };
  this.changeInput = this.changeInput.bind(this);
 }

 changeInput(e) {
  // 将改变后的 input 值赋值给 inputValue,通过事件对象 $event.target.value 实现
  this.setState({
   inputValue: e.target.value
  });
 }

 render() {
  // input 改变时触发 changeInput
  return (
   <p className="App">
    <input value={this.state.inputValue} onChange={this.changeInput} />
    <p>{this.state.inputValue}</p>
   </p>
  );
 }
}
ログイン後にコピー

这里用到了事件对象,React 的事件对象和 JS 原生事件对象保持一致。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

使用Node.js爬虫如何实现网页请求

使用VueAwesomeSwiper容易出现的问题?

在angular2中有关Http请求原理(详细教程)

在node中如何实现http小爬虫

以上がReact でコンポーネントの内部通信を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

JavaScriptの文字列文字を交換します JavaScriptの文字列文字を交換します Mar 11, 2025 am 12:07 AM

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? 独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? Mar 18, 2025 pm 03:12 PM

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? Mar 18, 2025 pm 03:14 PM

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? Mar 18, 2025 pm 03:16 PM

この記事では、ブラウザ開発者ツールを使用した効果的なJavaScriptデバッグについて説明し、ブレークポイントの設定、コンソールの使用、パフォーマンスの分析に焦点を当てています。

jQueryマトリックス効果 jQueryマトリックス効果 Mar 10, 2025 am 12:52 AM

マトリックスの映画効果をあなたのページにもたらしましょう!これは、有名な映画「The Matrix」に基づいたクールなJQueryプラグインです。プラグインは、映画の古典的な緑色のキャラクター効果をシミュレートし、画像を選択するだけで、プラグインはそれを数値文字で満たされたマトリックススタイルの画像に変換します。来て、それを試してみてください、それはとても面白いです! それがどのように機能するか プラグインは画像をキャンバスにロードし、ピクセルと色の値を読み取ります。 data = ctx.getimagedata(x、y、settings.greasize、settings.greasize).data プラグインは、写真の長方形の領域を巧みに読み取り、jQueryを使用して各領域の平均色を計算します。次に、使用します

jQueryのパフォーマンスを即座に増やす10の方法 jQueryのパフォーマンスを即座に増やす10の方法 Mar 11, 2025 am 12:15 AM

この記事では、スクリプトのパフォーマンスを大幅に向上させるための10の簡単な手順の概要を説明します。 これらの手法は簡単で、すべてのスキルレベルに適用できます。 更新の維持:NPMのようなパッケージマネージャーを使用して、Viteなどのバンドラーを使用して確認してください

JavaScriptによる構造マークアップの強化 JavaScriptによる構造マークアップの強化 Mar 10, 2025 am 12:18 AM

キーポイントJavaScriptを使用した構造的なタグ付けの強化は、ファイルサイズを削減しながら、Webページコンテンツのアクセシビリティと保守性を大幅に向上させることができます。 JavaScriptを効果的に使用して、Cite属性を使用して参照リンクを自動的にブロック参照に挿入するなど、HTML要素に機能を動的に追加できます。 JavaScriptを構造化されたタグと統合することで、ページの更新を必要としないタブパネルなどの動的なユーザーインターフェイスを作成できます。 JavaScriptの強化がWebページの基本的な機能を妨げないようにすることが重要です。 高度なJavaScriptテクノロジーを使用できます(

シンプルなjQueryスライダーを構築する方法 シンプルなjQueryスライダーを構築する方法 Mar 11, 2025 am 12:19 AM

この記事では、jQueryライブラリを使用してシンプルな画像カルーセルを作成するように導きます。 jQuery上に構築されたBXSLiderライブラリを使用し、カルーセルをセットアップするために多くの構成オプションを提供します。 今日、絵のカルーセルはウェブサイトで必須の機能になっています - 1つの写真は千の言葉よりも優れています! 画像カルーセルを使用することを決定した後、次の質問はそれを作成する方法です。まず、高品質の高解像度の写真を収集する必要があります。 次に、HTMLとJavaScriptコードを使用して画像カルーセルを作成する必要があります。ウェブ上には、さまざまな方法でカルーセルを作成するのに役立つ多くのライブラリがあります。オープンソースBXSLiderライブラリを使用します。 BXSLiderライブラリはレスポンシブデザインをサポートしているため、このライブラリで構築されたカルーセルは任意のものに適合させることができます

See all articles