重複するコンポーネントでのReactコンポーネントの状態の問題

ヤステフ

私は最近Reactを学び始めましたが、少し混乱しています。

のコードペンまたは以下のコードスニペットを参照してください

class App extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      sessions: [],
      sessionSelected: null
    }
    this.addSession = this.addSession.bind(this);
    this.switchSession = this.switchSession.bind(this);
  }

  addSession() {
    let sessions = this.state.sessions;
    let id = (sessions.length)
    let title = "Session " + id;
    let session = <Session title={title} index={id + 1} />;
    sessions.push(session);
    this.setState({
      sessions: sessions,
      sessionSelected: id
    });
  }

  switchSession(id) {
    this.setState({
      sessionSelected: id
    });
  }

  render() {
    return (
      <div>
        <button onClick={this.addSession} >+ Add Session</button>
        <div>{this.state.sessions[this.state.sessionSelected]}</div>
        <div className="switchers">
          {this.state.sessions.map((x, i) => {
            return <SessionSwitcher index={i + 1} onClick={() => { this.switchSession(i) }} />;
          })}
        </div>
      </div>
    );
  }
}

class Session extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    }
    this.startTimer = this.startTimer.bind(this);
    this.count = this.count.bind(this);
  }
  startTimer() {
    setInterval(this.count, 1000);
  }
  count() {
    this.setState({
      count: this.state.count + 1
    });
  }
  render() {
    return (
      <div>
        <h1>{this.props.title}</h1>
        <p>{this.state.count}</p>
        <button onClick={this.startTimer}>Start Timer</button>
      </div>
    )
  }
}

class SessionSwitcher extends React.Component {
  render() {
    return (
      <div className="switcher" onClick={this.props.onClick}>
        <span>{this.props.index}</span>
      </div>
    )
  }
}

ReactDOM.render(
  <App />,
  document.querySelector('#app')
);

複数のコンポーネント内で複数のタイマーをトリガーできるようにしたい。

何らかの理由で、1つのコンポーネントで開始タイマーをクリックすると、他のコンポーネントでも開始タイマーがトリガーされます。

誰かが私が間違っていることを私に説明できますか?

グロルト

より予測可能なエクスペリエンスを得るために変更できることがいくつかあります。

  1. 複雑なオブジェクトである状態でJSXを格納するのではなく、IDのみを格納し、そのIDに従ってJSXをレンダリングします。

  2. 状態をその場で変更しないようにしてください(pushすでに状態になっている配列へのingの場合のように)。

  3. 現在選択されているタイマーに関係なく、コンポーネント間で永続的なタイマーを設定する場合は、選択が解除されたときにそれらをアンマウントしないようにしてください。

<App/>コンポーネントの関連する更新された部分は次のとおりです(これらはベストプラクティスよりも迅速な修正であることに注意してください)。

  addSession() {
    const id = this.state.sessions.length;
    this.setState( state => ({
      // treat your state as immutable
      sessions: state.sessions.concat( id ),
      sessionSelected: id
    }));
  }

  // don't unmount when switching components, just hide
  render() {
    return (
      <div>
        <button onClick={this.addSession} >+ Add Session</button>
        <div>
          { this.state.sessions.map( session => 
            <div style={{ display: session === this.state.sessionSelected ? 'block' : 'none' }}>
              <Session title={"Session " + session} />
            </div>
          )}
        </div>
        <div className="switchers">
          {this.state.sessions.map((x, i) => {
            return <SessionSwitcher index={i + 1} onClick={() => { this.switchSession(i) }} />;
          })}
        </div>
      </div>
    );
  }

ここで試してみてください:https//codepen.io/glortho/pen/ZrLMda?editors = 0011

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ReactJSの重複するreactコンポーネント間で共通の状態を共有する

分類Dev

コンポーネント間の状態変化の問題

分類Dev

React.jsのコンポーネントで状態を設定するのに問題があります

分類Dev

コンポーネント状態への値の保存に関する問題

分類Dev

VueコンポーネントとTypeScriptの状態に関する問題

分類Dev

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

分類Dev

Reactの子コンポーネントから親の状態を更新する際の問題

分類Dev

React Native:コンポーネント状態の重複アイテム

分類Dev

あるコンポーネントの状態を別のコンポーネントで使用する方法は?独立したコンポーネント(React)

分類Dev

あるReactコンポーネントから別のReactコンポーネントに状態を渡す

分類Dev

ReactJS:コンポーネントの状態のレンダリングに関する問題

分類Dev

ReactJSでコンポーネントの状態を別のコンポーネントから更新する

分類Dev

Reactでコンポーネントの状態をJSONに変換する

分類Dev

異なるコンポーネント間のReact状態管理

分類Dev

ReactES6の親子コンポーネントの状態の問題

分類Dev

コンポーネント内のvueデータオブジェクトの状態に関する問題

分類Dev

ReactJsであるコンポーネントから別のコンポーネントに状態を渡す

分類Dev

React、Promise内のコンポーネント状態の設定に問題がある

分類Dev

複数の子コンポーネントの状態を操作する

分類Dev

Vuex 4、コンポーネントの状態が空です

分類Dev

別のコンポーネント内でコンポーネントを使用する際のVueJSの問題

分類Dev

子コンポーネントの状態を取得する

分類Dev

親コンポーネントの状態を設定する

分類Dev

コンポーネントの外部からReactコンポーネントの状態を設定します

分類Dev

React:親の子コンポーネントコンポーネントの状態を取得します

分類Dev

vueでコンポーネントの状態をコピーする方法は?

分類Dev

React別のコンポーネントの状態を取得する

分類Dev

React の特定のコンポーネントに状態を設定する

分類Dev

Reactコンポーネントの状態内の配列を変更する

Related 関連記事

  1. 1

    ReactJSの重複するreactコンポーネント間で共通の状態を共有する

  2. 2

    コンポーネント間の状態変化の問題

  3. 3

    React.jsのコンポーネントで状態を設定するのに問題があります

  4. 4

    コンポーネント状態への値の保存に関する問題

  5. 5

    VueコンポーネントとTypeScriptの状態に関する問題

  6. 6

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

  7. 7

    Reactの子コンポーネントから親の状態を更新する際の問題

  8. 8

    React Native:コンポーネント状態の重複アイテム

  9. 9

    あるコンポーネントの状態を別のコンポーネントで使用する方法は?独立したコンポーネント(React)

  10. 10

    あるReactコンポーネントから別のReactコンポーネントに状態を渡す

  11. 11

    ReactJS:コンポーネントの状態のレンダリングに関する問題

  12. 12

    ReactJSでコンポーネントの状態を別のコンポーネントから更新する

  13. 13

    Reactでコンポーネントの状態をJSONに変換する

  14. 14

    異なるコンポーネント間のReact状態管理

  15. 15

    ReactES6の親子コンポーネントの状態の問題

  16. 16

    コンポーネント内のvueデータオブジェクトの状態に関する問題

  17. 17

    ReactJsであるコンポーネントから別のコンポーネントに状態を渡す

  18. 18

    React、Promise内のコンポーネント状態の設定に問題がある

  19. 19

    複数の子コンポーネントの状態を操作する

  20. 20

    Vuex 4、コンポーネントの状態が空です

  21. 21

    別のコンポーネント内でコンポーネントを使用する際のVueJSの問題

  22. 22

    子コンポーネントの状態を取得する

  23. 23

    親コンポーネントの状態を設定する

  24. 24

    コンポーネントの外部からReactコンポーネントの状態を設定します

  25. 25

    React:親の子コンポーネントコンポーネントの状態を取得します

  26. 26

    vueでコンポーネントの状態をコピーする方法は?

  27. 27

    React別のコンポーネントの状態を取得する

  28. 28

    React の特定のコンポーネントに状態を設定する

  29. 29

    Reactコンポーネントの状態内の配列を変更する

ホットタグ

アーカイブ