[レスポンス]ライフサイクル-コンポーネントDidUpdate


構成部品ライフサイクル

  • マウント
  • 更新
  • アンインストール
    3つの方法で現れる.
  • componentDidMount()

  • componentDidMount()素子実装後に呼び出す.初期化操作はこの方法で完了します.
    API要求により外部からデータを取得する必要がある場合は、送信要求の適切な位置である.
  • componentDidUPdate()

    componentDidUpdate(prevProps, prevState, snapshot)
  • データが呼び出されて更新された直修したがって、最初のレンダリングでは呼び出されません.従来のpropsと現在のpropsを比較したので,特定のprops変化に応じてネティリクエストを送信する方法がよい.
  • 注意事項

  • componentDidUpdate()setState()を呼び出すことができますが、条件文を迂回しないと無限ループが発生する可能性があります.breakロールを持つ条件文を与えるべきです.つまり、実際の変更が発生した場合にのみ機能するようにコードを記述する必要があります.
  • 使用例(チェックボックス)


    応用機器

  • 開発チームの設計システムにおけるCheckbox.既存の単一チェックボックスとグループチェックボックスを構成する場合、既存のコードを実現できます.
  • でも!予想外の全面検査で問題が発生した.既存のチェックボックスグループが1つだけでは解決できません.すべて選択するイベント(状況)を識別し、当日にチェックボックスの値を渡して海のチェックボックスグループを制御する必要があります.
  • チェックボックスグループは、グループ内の各チェックボックスのみならず、チェックボックス全体も認識する.この2つのチェックを識別し区別するために、あるpropsの値を更新したら更新すべきだと考え、コンポーネントDidUpdateを適用しました.
  • アプリケーションコード


    propsの値をポイントにしてください.
  • DoucumentCheckbox.tsx
  • // Checkbox로 내려줄 체크된 리스트
    @action
        private onChangeAllCheck = () => {
            this.isAll = !this.isAll;
            if (this.isAll) {
                this.AllCheckedList = [...allList];
            } else {
                this.AllCheckedList = [];
            }
            console.log(toJS(this.AllCheckedList))
        }
    ...
    <div>
      <p>그룹 (Group) 정렬 - 전체선택</p>
      // 단일체크박스
      <Checkbox onChange={this.onChangeAllCheck} >전체선택</Checkbox>
      // 체크박스 그룹
      <CheckboxGroup options={options} onGroupChanged={action((values: any[]) => {
                                                       this.AllCheckedList = [...values];})}
                                                       values={this.AllCheckedList}/>
    </div>
  • CheckboxGroup.tsx
  •   componentDidMount() {
            const {defaultValue, values} = this.props;
            if (defaultValue) {
                this.checkedList = [...defaultValue];
            } else if (values) {
                this.checkedList = [...values];
            }
        }
    
        componentDidUpdate(prevProps: Readonly<CheckboxGroupInnerProps>, prevState: Readonly<{}>, snapshot?: any): void {
            if (prevProps.values !== this.props.values) {
                const {values = []} = this.props;
                this.checkedList = [...values];
            }
        }

  • ここでvaluesはチェックボックス全体のデータを含む配列である.componentDidMount()の場合、ユーザーがデフォルトチェックのデータを持っている場合はcheckedListに入れます.

  • そして、個別のチェックボックスがクリックされ、変更したCheckedListが親にアップロードされます.AllCheckeListがonChangeAllCheckに変更されると、propsデータも変更されます.

  • この変化はComponentDidUdpateで検出され、以前のpropsと現在のpropsを比較し、変更したデータをcheckedListに格納します.

  • 取り付け後、操作素子ハンドルの統一性を保つことができます.
    +)チェックボックスは、コンポーネントDidUpdateで選択されているかどうかを統一的に表すこともできます.
  • // 2. 체크박스 그룹의 변경에따라 자식인 체크박스의 체크여부 통일 가능
        componentDidUpdate(prevProps: Readonly<CheckboxProps>, prevState: Readonly<{}>, snapshot?: any): void {
            if (this.props.checked != undefined &&
                prevProps.checked !== this.props.checked) {
                this.isChecked = this.props.checked;
            }
        }
    ...
    // 1. 체크여부를 판단하고 컨트롤하는 기본 함수
        @action
        private handleCheckedBox = (e: React.MouseEvent<HTMLLabelElement>) => {
            const {onChange, disabled, checked, value} = this.props;
            const targetValue = (e.target as HTMLLabelElement).textContent || value || '';
    
            if (!disabled) {
                if (checked) {
                    this.isChecked = true;
                }
                this.isChecked = !this.isChecked;
    
                onChange && onChange(targetValue, this.isChecked);
            }
        }
    classコンポーネントを使用する場合はreactが提供するライフサイクルを使用できますが、関数型コンポーネントに変化を導くreactストリームに基づいて、hookのuseEffectの使い方などの機能をさらに並行して学ぶべきだと思います.