目次
ステートフル コンポーネント: 状態を定義できるコンポーネント。 クラスコンポーネント
##<要素 イベント名 1={イベント処理関数 1} イベント名 2={イベント処理関数 2} >></要素>
\
##注:
render メソッド内のこれは、現在の React コンポーネントを指します。 イベント ハンドラー内のこれは、
unknown
を使用する必要はありません。コードがクラスまたはモジュールに記述されている限り、使用できるのは厳密モードのみであるため、クラス内の関数 this は未定義
イベント ハンドラーで矢印関数をラップする
欠点: 追加の矢印を追加する必要があります。ハンドラー関数の外側にラップされています 関数、構造が美しくありません利点:
方法 3:
利点:コードは簡潔で直感的で、最もよく使用されます。メソッド
1.语法:
五、表单处理-受控组件
六、表单处理-非受控组件-ref
ホームページ ウェブフロントエンド フロントエンドQ&A Reactでコンポーネントの状態を変更する方法

Reactでコンポーネントの状態を変更する方法

Dec 15, 2022 pm 07:19 PM
フロントエンド react.js コンポーネントのステータス

react では、setState() を使用してコンポーネントの状態を変更できます。 setState()は、コンポーネントの状態を更新するためのメソッドです。このメソッドは、コンポーネントの状態への変更をキューに入れ、最新の状態を取得することもできます。構文は、「this.setState({変更するデータの一部 })」です。

Reactでコンポーネントの状態を変更する方法

#このチュートリアルの動作環境: Windows7 システム、react18 バージョン、Dell G3 コンピューター。

##1. ステートフル コンポーネントとステートレス コンポーネント


#1. まず状態とは何かを理解します:


定義:

は、

特定の瞬間における物事の形状を記述するために使用される

データであり、一般に 状態と呼ばれます。 (状態がデータであると単純に理解できます)例: 9 月 23 日の書籍の在庫数量、18 歳時の身長。vue にも関連する概念があります
機能:

変更可能。変更後、ビューには対応する変更が加えられます (双方向データ バインディング)

2. ステートフル コンポーネントとステートレス コンポーネント

ステートフル コンポーネント: 状態を定義できるコンポーネント。 クラスコンポーネント

はステートフルコンポーネントです。

ステートレスコンポーネント: 状態を定義できないコンポーネント。 関数コンポーネント

は、

ステートレスコンポーネントとも呼ばれます注:

2019年2月6日、React 16.8バージョンReactでフックは、機能コンポーネントが独自の状態も定義できるように導入されています。 [関連する推奨事項: Redis ビデオ チュートリアル

プログラミング教育 ]この記事では主に クラス コンポーネントのステータスについて説明します

3. クラスコンポーネントの状態

1) 状態を定義します

初期化には state = { }

を使用します

import React from "react";

export default class Hello extends React.Component {

  // 这里的state就是状态
  state = {
    list:  [{ id: 1, name: "给我一个div" }],
    isLoading : true
  };
}
ログイン後にコピー
2) ビュー 2 で

 render() {
    return (
      <>
            <h1>姓名-{this.state.name}</h1>
            <ul>
            {this.state.list.map((item) => (
            <li key={item.id}>{item.name}</li>
             ))}
            </ul>
        <div>{this.state.isLoading ? "正在加载" : "加载完成"}</div>
      </>
    );
  }
ログイン後にコピー
を使用します。イベント バインディング

1. 形式

##<要素 イベント名 1={イベント処理関数 1} イベント名 2={イベント処理関数 2} >>
\

Note:

React イベント名には、onMouseEnter、onFocus、onClick...

2 などのキャメル ケースの名前が使用されます。例

import React from &#39;react&#39;
import ReactDOM from &#39;react-dom&#39;

const title = <h1>react中的事件</h1>


export default class Hello extends React.Component {
  fn() {
    console.log(&#39;mouseEnter事件&#39;)
  }
  render() {
    return (
      <div
            onClick = { () => console.log(&#39;click事件&#39;) }
            onMouseEnte r = { this.fn }
      </div>
    )
  }
}

const content = (
  <div>
    {title}
    {<Hello />}
  </div>
)

ReactDOM.render ( content , document.getElementById (&#39;root&#39;) )
ログイン後にコピー

#注:

イベント名はキャメルケースの命名形式です

    #クラス
  • #this . fn
  • Don't

    かっこを追加しないでください:

  • ##onClick={ this.fn( ) }

    このとき、最初に fn() が呼び出され、その後 fn の実行結果がクリックイベントの処理関数として使用されます

    • これを忘れずに書いてください
    • 3. イベント処理 - これは問題を示しています

#1. 問題コード:

class App extends React.Component {
        // 组件状态
      state = {
        msg: &#39;hello react&#39;
      }
      
      // 事件处理函数
      handleClick() {
            console.log(this) // 这里的this是 undefined
      }
      
      render() {
            console.log(this) // 这里的this是当前的组件实例 App
        
          return (
              <div>
                    <button onClick={this.handleClick}>点我</button>
              </div>
        )
      }
}
ログイン後にコピー
結果は次のようになります:


render メソッド内のこれは、現在の React コンポーネントを指します。 イベント ハンドラー内のこれは、
unknown

  • 2 を指します。理由:
  • クラス
  • クラスとモジュールの内部はデフォルトで strict モードになっているため、実行モードを指定するために
use strict

を使用する必要はありません。コードがクラスまたはモジュールに記述されている限り、使用できるのは厳密モードのみであるため、クラス内の関数 this は未定義

3 を指します。イベント関数 this が指すものを解決します:

方法 1:

イベント ハンドラーで矢印関数をラップする

欠点: 追加の矢印を追加する必要があります。ハンドラー関数の外側にラップされています 関数、構造が美しくありません利点:

前述したように、{this.handleClick () で処理関数を呼び出すときに括弧を追加しないでください。 }, それ以外の場合、プログラムはすぐに実行されます。アロー関数を外側にラップした後、括弧を追加するだけでなく、パラメーターを渡すこともできます。

class App extends React.Component {
  state = {
    msg: &#39;hello react&#39;
  }

  handleClick () {
    console.log(this.state.msg)
  }

  render () {
    return (
      <div>
        <button onClick={ () => { this.handleClick ( ) }}>点我</button>
      </div>
    )
  }
}
ログイン後にコピー

方法 2: バインドを使用する

bind() メソッドを使用して関数のこのポインターを変更し、関数の特徴的な解決策を実行しないでください

class App extends React.Component {
  state = {
    msg: &#39;hello react&#39;
  }

  handleClick () {
    console.log(this.state.msg)
  }

  render () {
    return (
      <div>
        <button onClick={ this.handleClick.bind (this) }>点我</button>
      </div>
    )
  }
}
ログイン後にコピー

方法 3:

クラスでイベント処理関数を宣言するときに、アロー関数を直接使用します。

class App extends React.Component {
  state = {
    msg: &#39;hello react&#39;
  }

  handleClick = () => {
    console.log(this.state.msg)
  }
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>点我</button>
      </div>
    )
  }
}
ログイン後にコピー

利点:コードは簡潔で直感的で、最もよく使用されます。メソッド

4. コンポーネントのステータスを変更します

##注:

渡すことはできません ビューを変更するにはステート内の値を直接変更してください! ! !

this.setState() メソッドを通じて変更してください


react では setstate が使用されるメソッドですコンポーネントの状態を更新するには、 state ;setState() はコンポーネントの状態への変更をキューに入れ、更新された状態でこのコンポーネントとそのサブコンポーネントを再レンダリングする必要があることを React に通知します。

1.语法:

语法:this.setState( { 要修改的部分数据 } )
这是继承自React.Component的修改类组件状态的方法

state = {
    count: 0,
    list: [1, 2, 3],
    person: {
      name: &#39;jack&#39;,
      age: 18
    }
  }
  
  // 【不推荐】直接修改当前值的操作:
  this.state.count++
  ++this.state.count
  this.state.count += 1
  this.state.count = 1
  this.state.list.push(4)
  this.state.person.name = &#39;rose&#39;
  
  // 【推荐】不是直接修改当前值,而是创建新值的操作:
  this.setState({
    count: this.state.count + 1,
    list: [...this.state.list, 4],
    person: {
      ...this.state.person,
    	// 要修改的属性,会覆盖原来的属性,这样,就可以达到修改对象中属性的目的了  
      name: &#39;rose&#39;
    }
  })
ログイン後にコピー

五、表单处理-受控组件


  • HTML中表单元素是可输入的,即表单维护着自己的可变状态(value)。
  • 但是在react中,可变状态通常是保存在state中的,并且要求状态只能通过setState进行修改。
  • React中将state中的数据与表单元素的value值绑定到了一起,由state的值来控制表单元素的值
  • 受控组件:value值受到了react控制的表单元素

示例代码:

class App extends React.Component {
  state = {
    msg: &#39;hello react&#39;
  }

  handleChange = (e) => {
    this.setState({
      msg: e.target.value
    })
  }

   // value 绑定state 配合onChange事件双向绑定
  render() {
    return (
      <div>
        <input type="text" value={this.state.msg} onChange={this.handleChange}/>
      </div>
    )
  }
}
ログイン後にコピー

注意事项

使用受控组件的方式处理表单元素后,状态的值就是表单元素的值。即:想要操作表单元素的值,只需要通过this.setState( { 要修改的部分数据 } )操作对应的状态即可

六、表单处理-非受控组件-ref


  • 受控组件是通过 React 组件的状态来控制表单元素的值
  • 非受控组件是通过手动操作 DOM 的方式来控制
  • ref:用来在 React 中获取 DOM 元素

示例代码:

import { createRef } from &#39;react&#39;

class Hello extends Component {
  txtRef = createRef()

  handleClick = () => {
    // 文本框对应的 DOM 元素
    // console.log(this.txtRef.current)

    // 文本框的值:
    console.log(this.txtRef.current.value)
  }

  render() {
    return (
      <div>
        <input ref={this.txtRef} />
        <button onClick={handleClick}>获取文本框的值</button>
      </div>
    )
  }
}
ログイン後にコピー

(学习视频分享:编程基础视频

以上が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)

Nodeのメモリ制御に関する記事 Nodeのメモリ制御に関する記事 Apr 26, 2023 pm 05:37 PM

ノンブロッキングおよびイベント駆動に基づいて構築されたノード サービスには、メモリ消費量が少ないという利点があり、大量のネットワーク リクエストの処理に非常に適しています。大量のリクエストを前提として、「メモリ制御」に関する問題を考慮する必要があります。 1. V8 のガベージ コレクション メカニズムとメモリ制限 Js はガベージ コレクション マシンによって制御されます

Node の File モジュールについて詳しく説明しましょう Node の File モジュールについて詳しく説明しましょう Apr 24, 2023 pm 05:49 PM

ファイル モジュールは、ファイルの読み取り/書き込み/開く/閉じる/削除の追加など、基礎となるファイル操作をカプセル化したものです。ファイル モジュールの最大の特徴は、すべてのメソッドが **同期** と ** の 2 つのバージョンを提供することです。 asynchronous**、sync サフィックスが付いているメソッドはすべて同期メソッドであり、持たないメソッドはすべて異種メソッドです。

Vue3 で単体テストを作成する方法を調べる Vue3 で単体テストを作成する方法を調べる Apr 25, 2023 pm 07:41 PM

Vue.js は、今日のフロントエンド開発において非常に人気のあるフレームワークとなっています。 Vue.js が進化し続けるにつれて、単体テストの重要性がますます高まっています。今日は、Vue.js 3 で単体テストを作成する方法を検討し、いくつかのベスト プラクティスと一般的な問題と解決策を提供します。

PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ Mar 16, 2024 pm 12:09 PM

PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ 今日のインターネットの急速な発展の時代において、フロントエンド開発はますます重要になっています。 Web サイトやアプリケーションのエクスペリエンスに対するユーザーの要求がますます高まっているため、フロントエンド開発者は、より効率的で柔軟なツールを使用して、応答性の高いインタラクティブなインターフェイスを作成する必要があります。フロントエンド開発の分野における 2 つの重要なテクノロジーである PHP と Vue.js は、組み合わせることで完璧なツールと見なされます。この記事では、PHP と Vue の組み合わせと、読者がこれら 2 つをよりよく理解し、適用できるようにするための詳細なコード例について説明します。

クロスドメインの問題を解決するにはどうすればよいですか?一般的なソリューションの簡単な分析 クロスドメインの問題を解決するにはどうすればよいですか?一般的なソリューションの簡単な分析 Apr 25, 2023 pm 07:57 PM

クロスドメインは開発においてよく遭遇するシナリオであり、インタビューでもよく議論される問題でもあります。一般的なクロスドメイン ソリューションとその背後にある原則を習得すると、開発効率が向上するだけでなく、面接でのパフォーマンスも向上します。

フロントエンド開発に Go 言語を使用するにはどうすればよいですか? フロントエンド開発に Go 言語を使用するにはどうすればよいですか? Jun 10, 2023 pm 05:00 PM

インターネット技術の発展に伴い、フロントエンド開発の重要性がますます高まっています。特にモバイル デバイスの人気により、効率的で安定しており、安全で保守が容易なフロントエンド開発テクノロジーが必要です。 Go 言語は、急速に発展しているプログラミング言語として、ますます多くの開発者によって使用されています。では、フロントエンド開発に Go 言語を使用することは可能でしょうか?次に、この記事ではフロントエンド開発にGo言語を使用する方法を詳しく説明します。まずはフロントエンド開発にGo言語が使われる理由を見てみましょう。多くの人は Go 言語は

フロントエンドの面接官からよく聞かれる質問 フロントエンドの面接官からよく聞かれる質問 Mar 19, 2024 pm 02:24 PM

フロントエンド開発のインタビューでは、HTML/CSS の基本、JavaScript の基本、フレームワークとライブラリ、プロジェクトの経験、アルゴリズムとデータ構造、パフォーマンスの最適化、クロスドメイン リクエスト、フロントエンド エンジニアリング、デザインパターン、新しいテクノロジーとトレンド。面接官の質問は、候補者の技術スキル、プロジェクトの経験、業界のトレンドの理解を評価するように設計されています。したがって、候補者はこれらの分野で自分の能力と専門知識を証明するために十分な準備をしておく必要があります。

ノードのバッファーについて詳しく見る ノードのバッファーについて詳しく見る Apr 25, 2023 pm 07:49 PM

当初、JS はブラウザ側でのみ動作していたため、Unicode でエンコードされた文字列の処理は簡単でしたが、バイナリ文字列や非 Unicode エンコード文字列の処理は困難でした。バイナリは、コンピュータのビデオ/オーディオ/プログラム/ネットワーク パッケージの最低レベルのデータ形式です。

See all articles