6. Event - (1)


props,state,event->3つのビートが一致してこそ動的uiを実現できる!
  • WEBテキストをクリックしてHTMLの下部にWelcomeメッセージ
  • を出力
  • リストをクリックして、リストのテキスト内容をHTMLの下部に出力します.
    アプリケーション・コンポーネントのステータス変更、コンポーネントのステータス値の変更、およびアプリケーションの動的変更を実現します.
    ✔SubjectファイルとContentファイルを分離する->Subject.js/Content.js
    ✔componentsフォルダに挿入
    現在のページがwelcomeページかraedページかを区別するために、
    this.state={mode:[welcome]}デフォルト値を挿入
    また、モードがwelcomeの場合に指定したテキストも挿入します.

    state値を変更すると、そのstateを持つコンポーネントのrender関数が再び呼び出されます.
    render関数サブコンポーネントのrender関数もすべて呼び出され、画面が再ロードされます.
    👉レンダーはどんなhtmlを描くかを決める関数だから!
    reactは、ステータス値またはprops値が変更されたときに、対応するコンポーネントのプレゼンテーション関数を呼び出すことを約束します.画面を再描画します.
    条件文を使用して✔modeの値に基づいて異なるレンダリング結果を作成する
    this.state.パターンがWelcomeなら~
    this.state.パターンがReadなら~
       let _title, _desc = nul;
       if(this.state.mode === 'welcome'){
         _title = this.state.welcome.title; //title의 값
         _desc = this.state.welcome.desc; //desc의 값
       }else if(this.state.mode === 'read'){
    
       }

    コンソールは、stateまたはpropsを変更して再ロードすることを確認するために、各コンポーネントのrender()関数にあります.ロゴを撮ってみます.ex
    import { Component } from 'react';
    
    class Content extends Component {
        render(){
          console.log('Content redner');
          return(
            <article>
            <h2>{this.props.title}</h2>
            {this.props.desc}
        </article>
          );
        }
      }
    
      export default Content;

    ブラウザが再ロードされると、各コンソールウィンドウが出力されることを確認します.
    「開発者ツール」ウィンドウで、Stateのモード値を変更しようとします.stateが変更されると、接続されたredner関数が変更されたコンポーネントのstate値に呼び出されます.

    💡 一番上のタイトルをクリックして、JavaScriptを追加して置き換えます!

  • の一番上のタイトルは、Subjectのh 1 tagです.
  • 方法:Subjectのコンポーネントを展開し、Appでイベントを実装します.render関数の変更-headerでコンテンツを展開してJavaScriptとして挿入し、再パッケージします.
      render() {
        console.log('App redner');
        var _title, _desc = null;
        if(this.state.mode === 'welcome'){
          _title = this.state.welcome.title;
          _desc = this.state.welcome.desc;
    
        }else if(this.state.mode === 'read'){
          _title = this.state.contents[0].title;
          _desc = this.state.contents[0].desc;
        }
        return (
          <div className = "App">
            {/* <Subject title={this.state.subject.title}
             sub={this.state.subject.sub}></Subject> */}
             <header>
                    <h1><a href="/">{this.state.subject.title}</a></h1>
                    {this.state.subject.sub}
            </header>
            <TOC data={this.state.contents}></TOC>
            <Content title={_title} desc={_desc}></Content>
          </div>
        );
      }
    }
    クリックするとイベントが発生するのでonClickイベント(バニラjsは小文字、reactはon-後にcamel case)を使用します.
    📌 WEBをクリックすると、Appというコンポーネントのモード値をread->welcomeに変更したいです.
    return (
          <div className = "App">
            {/* <Subject title={this.state.subject.title}
             sub={this.state.subject.sub}></Subject> */}
             <header>
                    <h1><a href="/" onClick={function(e){
                      e.preventDefault();
                      this.state.mode = "welcome";
                    }}>{this.state.subject.title}</a></h1>
                    {this.state.subject.sub}
            </header>
            <TOC data={this.state.contents}></TOC>
            <Content title={_title} desc={_desc}></Content>
          </div>
        );
    this.state.mode = 'welcome'
    書き込みましたが、エラーが発生しました.

    理由。


  • イベントが呼び出されたときに実行される関数では、thisの値はコンポーネント自体を指さず、何も設定されていません(undefined).
    ✔このバインドでいいです.bind(this)->コンポーネントを指します.

  • stateの値が変更されたことを伝えるべきです.this.setStateを使用する必要があります.

  •   bind() 「編んで、刺してあげました」 renderという名前の関数を呼び出すと、この関数では呼び出されたコンポーネント自体、すなわちここではAppになります。 以下に示すように、コンソールウィンドウでこの操作を試みます。 ここにいるよ!!!さっき作成したbind(this)を削除し、コンソールウィンドウに再出力します。

    📌.テストbind



    objのname値をbindTest()という関数に含めます.
  • 私がやった方法:this.nameの代わりに直接obj.nameと書きましたが、これは特定のobjectを指定したので、自由に使用します.
  • bindTest.bind(obj)
    このようにバインドするとbindTest関数はオブジェクトの属性値を自動的に読み込みます...!👀
  •   setState()

    💡 いつ使いますか。


    コンストラクション関数componentを最初に作成するときに最初に実行されるコンストラクション関数はthisです.state={}形式に変更すればいいです.
    BUT! componentが作成され、state値を動的に変更する場合は...!
    このときsetState()を使います!
    変更する値は、
  • setState()関数にオブジェクトとして挿入して変更する必要があります.
  • 反応の中で、変わったものを教えてくれてこそ、上陸することができます!