antd ツリーと親子コンポーネント間の値転送問題について (React のまとめ)

antd ツリーと親子コンポーネント間の値転送問題について (React のまとめ)

プロジェクト要件: 製品ツリー ノードをクリックすると、そのノードのすべての親ノードが取得され、表に検索条件を入力して検索機能が完成します。検索結果は下の表に表示されます。

3 つのコンポーネントが記述されました:

これで、ビジネス シナリオのインタラクションができました。orderTree コンポーネントのツリー ノードをクリックし、現在のノードとすべての親ノードの ID を取得し、それらをオブジェクト arrKeys に格納して、orderForm コンポーネントで使用します (タイプ ドロップダウン選択ボックスをバックフィルし、objId オブジェクトをクエリ インターフェイスの入力パラメータとして使用します)。

これで、問題を部分的に解決できます。

1. まず、クリックしたツリーノードとすべての親ノードのIDを取得します ---arrKeys

2. ツリー ノードをクリックして現在のノードとすべての親ノードを取得した後、this.props.idObject(arrKeys) を介して arrKeys を親コンポーネントに渡します。

3. ツリーコンポーネントとフォームコンポーネントのcomponentDidMountライフサイクルで、コンポーネント全体を親コンポーネントに渡します。

4. フォームコンポーネントの inquery メソッド:

tree.jsコードが添付されました

React をインポートします。{ コンポーネント } から 'react' をインポートします。
'dva' から connect をインポートします。
'antd' から { Divider、Modal、Table、message、Tag、Spin } をインポートします。
'umi/router' からルーターをインポートします。
'../style.less' からスタイルをインポートします。
'antd' から { Tree, Input } をインポートします。

const { confirm } = モーダル;
TreeNode を Tree に設定します。
const { 検索 } = 入力;
データリストを [] にします。
let keysObj = {}; // 現在のノードとすべての親ノードのID
let firstParentKey = {}; // 第 1 レベルのルート ノード ID
const intetorFun = (データ、キー、文字列) => {
  if (文字列) {
    最初の親キー = {
      [データ.パラメータ]: データ.パラメータId、
    };
  }
  (data.children && data.children.length !== 0) の場合 {
    data.children.forEach(アイテム => {
      if (item.id === key[0]) {
        キーオブジェクト = {
          [データ.パラメータ]: データ.パラメータId、
          [item.param]: アイテム.paramId、
          ...最初の親キー、
        };
      } それ以外 {
        intetorFun(アイテム、キー);
      }
    });
  }
  keysObj を返します。
};
const getParentKey = (キー、ツリー) => {
  親キーを [] とします。
  (i = 0 とします; i < tree.length; i++) {
    定数ノード = tree[i];
    親キー = intetorFun(ノード、キー、'firstTime');
  }
  親キーを返します。
};
//検索 const getSearchKey = (key, tree) => {
  親キーを作成します。
  (i = 0 とします; i < tree.length; i++) {
    定数ノード = tree[i];
    ノードの子の場合{
      if (node.children.some(item => item.id === key)) {
        親キー = ノードID;
      } そうでない場合 (getSearchKey(key, node.children)) {
        親キー = getSearchKey(キー、ノードの子);
      }
    } それ以外 {
      if (node.id === キー) {
        親キー = ノードID;
      }
    }
  }
  親キーを返します。
};

@connect(({ 商品、読み込み、メニュー }) => ({
  商品、
  読み込み中: loading.effects['commodity/getTree'],
  メニュー、
}))
クラス OrderTree は Component を拡張します {
  コンストラクタ(props) {
    スーパー(小道具);
    この状態 = {
      expandKeys: [], //第1レベルのルートノードのデフォルトの拡張 props.commodity.defaultParentIdList
      検索値: ''、
      自動展開親: true、
    };
  }
  コンポーネントマウント() {
    const { ディスパッチ } = this.props;
    this.props.treeRef && this.props.treeRef(this); //マウント時にツリーコンポーネント全体を親コンポーネントに渡します。dispatch({
      タイプ: 'commodity/getTree',
      コールバック: res => {
        このリストを生成します(res.data);
        const defaultParentIdList = res.data.map(item => item.id);
        this.setState({
          拡張キー: defaultParentIdList、
        });
      },
    });
  }
  生成リスト = データ => {
    const { ディスパッチ } = this.props;
    (i = 0 とします; i < data.length; i++) {
      定数ノード = データ[i];
      const { id, name } = ノード;
      データリストをプッシュします({id, name});
      急送({
        タイプ: '商品/保存'、
        ペイロード: {
          データリスト、
        },
      });
      ノードの子の場合{
        ノードの子のリストを生成します。
      }
    }
  };

  //ノードを展開/折りたたんだときにトリガーされます onExpand = expandKeys => {
    this.setState({
      拡張キー、
      自動展開親: true、
    });
  };
  //ツリーノードをクリックしたときにトリガーされます onSelect = (selectKeys, e) => {
    const { ディスパッチ } = this.props;
    定数{
      商品: { treeData },
    } = this.props;
    arrKeys = {} とします。
    //コードはノードが選択されている場合にのみ実行されます。dataRef は TreeNode に追加されたカスタム属性で、現在のノードのすべての情報を取得できます。if (e.selected && e.node.props.dataRef.param !== 'categoryId') {
      キーオブジェクト = {};
      最初の親キー = {};
      arrKeys = getParentKey(selectKeys、treeData);
    } そうでない場合 (e.selected && e.node.props.dataRef.param === 'categoryId') {
      キーオブジェクト = {};
      最初の親キー = {};
      arrKeys = {
        カテゴリID: e.node.props.dataRef.paramId、
      };
    } そうでない場合 (!e.selected) {
      false を返します。
    }
    this.props.idObject(arrKeys);
  };
  // 検索関数 onChange = e => {
    定数{値} = e.target;
    定数{
      商品: { treeData, dataList, defaultParentIdList },
    } = this.props;
    拡張キーを [] とします。
    if (値) {
      展開キー = データリスト
        .map(アイテム => {
          if (item.name.toLowerCase().indexOf(value.toLowerCase()) > -1) {
            //大文字と小文字を区別しません。getSearchKey(item.id, treeData); を返します。
          }
          null を返します。
        })
        .filter((item, i, self) => item && self.indexOf(item) === i);
      this.setState({
        拡張キー、
        検索値: 値、
        自動展開親: true、
      });
    } それ以外 {
      this.setState({
        拡張キー: defaultParentIdList、
        検索値: ''、
        自動展開親: true、
      });
    }
  };

  与える() {
    const { searchValue、expandedKeys、autoExpandParent } = this.state;
    定数{
      商品: { treeData },
      読み込み中、
    } = this.props;
    定数ループ = データ =>
      データ.map(アイテム => {
        const index = item.name.toLowerCase().indexOf(searchValue.toLowerCase()); //大文字と小文字を区別しない const beforeStr = item.name.substr(0, index);
        const afterStr = item.name.substr(インデックス + searchValue.length);
        const centerStr = item.name.substr(インデックス、検索値.長さ);
        定数タイトル =
          インデックス > -1 ? (
            <span title={item.name}>
              {前Str}
              <span style={{ color: '#f50' }}>{centerStr}</span>
              {afterStr}
            </span>
          ) : (
            <span title={item.name}>{item.name}</span>
          );
        if (item.children) {
          戻る (
            <TreeNode キー = {item.id} タイトル = {title} データ参照 = {item}>
              {loop(item.children)}
            </ツリーノード>
          );
        }
        <TreeNode key={item.id} title={title} dataRef={item} /> を返します。
      });
    戻る (
      <Spin spinning={loading}>
        <div>
          <検索 style={{ marginBottom: 8 }} placeholder="検索" onChange={this.onChange} />
          <木
            onExpand={this.onExpand}
            onSelect={this.onSelect}
            展開キー = {展開キー}
            autoExpandParent={autoExpandParent}
          >
            {ループ(ツリーデータ)}
          </ツリー>
        </div>
      </スピン>
    );
  }
}

デフォルトの OrderTree をエクスポートします。

親コンポーネントのindex.jsコード:

React をインポートします。{ コンポーネント } から 'react' をインポートします。
'dva' から connect をインポートします。
'umi/locale' から formatMessage、FormattedMessage をインポートします。
'antd' から { Card, Spin } をインポートします。
'@/components/PageHeaderWrapper' から PageHeaderWrapper をインポートします。
'./components/form' から OrderForm をインポートします。
'./components/table' から OrderTable をインポートします。
'./components/tree' から OrderTree をインポートします。
'./style.less' からスタイルをインポートします。
'tslint/lib/test' から consoleTestResultHandler をインポートします。

// dataList = [] とします。

@connect(({ 商品、読み込み、メニュー }) => ({
  商品、
  読み込み中: loading.effects['commodity/getTree'],
  メニュー、
}))
クラス OrderPage は Component を拡張します {
  コンストラクタ() {
    素晴らしい();
    この状態 = {
      idオブジェクト: {},
      反応フラグ: false、
    };
  }
  コンポーネントマウント() {
    const { ディスパッチ } = this.props;
    急送({
      タイプ: 'commodity/getGoodsCategory',
    });
  }
  onRef = ref => {
    this.orderForm = ref;
  };
  ツリー参照 = ref => {
    this.orderTree = ref;
  };
  getIdObject = データ => {
    this.setState() は、
      {
        idObject: データ、
      },
      () => {
        this.orderForm.props.form.setFieldsValue({
          カテゴリID: [文字列(data.categoryId)],
        });
        this.orderForm.inquery(データ);
      }
    );
  };
  //リセットボタンがクリックされたかどうかを判定する isReact = ref => {
    定数{
      商品: { defaultParentIdList },
    } = this.props;
    (参照)の場合{
      this.orderTree.setState({
        拡張キー: defaultParentIdList、
      });
    }
  };

  与える() {
    戻る (
      <PageHeaderWrapper ロゴ>
        <Card bordered={false} title="製品 SPU リスト" className={style.antCardBox}>
          <div
            style={{ width: '350px', marginRight: '30px', boxShadow: '3px -3px 6px 0px #ccc6' }}
            クラス名={style.antTreeBox}
          >
            <OrderTree idObject={this.getIdObject} treeRef={this.treeRef} />
          </div>
          <div style={{ flex: '1' }}>
            <オーダーフォーム onRef={this.onRef} isReact={this.isReact} />
            <注文テーブル />
          </div>
        </カード>
      </ページヘッダーラッパー>
    );
  }
}

デフォルトの OrderPage をエクスポートします。

以上が、antdツリーと親子コンポーネント間の値転送問題の詳細です(React要約)。antdツリー親子コンポーネント間の値転送の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • React 非親子コンポーネントパラメータ渡しのサンプルコード
  • React親子コンポーネント通信実装方法
  • 親コンポーネントと子コンポーネント間で値を渡すReactメソッド
  • 親コンポーネントと子コンポーネント間のReact通信プロパティ
  • Reactの親子コンポーネント転送とその他の重要なポイントの詳細な説明
  • react.js 親子コンポーネント データ バインディング リアルタイム通信 サンプル コード
  • React親子コンポーネント値転送(コンポーネント通信)実装方法

<<:  RR および RC 分離レベルでのインデックスとロックのテスト スクリプトのサンプル コード

>>:  Linux に ASPNET.Core3.0 ランタイムをインストールするためのサンプル コード

推薦する

React Native が「NSArray<id<RCTBridgeModule>>型のパラメータを初期化できません」というエラーを報告する (解決方法)

最近、古い RN プロジェクトを Xcode で実行すると、次のコード エラーが報告されました。 &...

Windows 10 システムで nginx ファイル サーバーを構成するためのグラフィック チュートリアル

Nginx の公式 Web サイトから Windows バージョンの Nginx をダウンロードしま...

Mybatis ファジークエリ実装方法

Mybatis ファジークエリ実装方法mybatis のリバース アシスタントは非常に使いやすく、通...

MySql 5.7.21 無料インストール バージョンの構成方法 (Win10 の場合)

1.インストールしたい場所に解凍し、my.iniファイルを作成します。 my.iniの内容は次のと...

MySQL パフォーマンス最適化のための魔法のツール、Explain の基本的な使用分析

導入MySQL には、SELECT ステートメントを分析し、開発者が最適化できるように SELECT...

Nginx 仮想ホストを構成する 3 つの方法 (ポートベース) の詳細な説明

Nginx は、IP ベースの仮想ホスト構成、ポート ベースの仮想ホスト構成、ドメイン名ベースの仮想...

MySQL 8.0.23 のインストールと設定方法のグラフィックチュートリアル (Win10 の場合)

この記事では、MySQL 8.0.23のインストールと設定方法を参考までに紹介します。具体的な内容は...

パーソナライズされたクリエイティブなウェブサイトデザインの例 (30)

そこで、個性的なスタジオやフリーランスを表現する組み合わせを 30 個選びました。デザインを目立たせ...

CSSとHTMLを組み合わせる4つの方法

(1)各HTMLタグには属性スタイルがあり、CSSとHTMLを組み合わせている。 <div s...

JavaScriptはボタンをクリックして4桁のランダムな検証コードを生成します

この記事の例では、ボタンをクリックすることで4桁のランダムな検証コードを生成するjsの具体的なコード...

Mysqlのインポートとエクスポート時に発生する問題の解決

背景すべての業務を Docker の運用管理に移行してから、一連の落とし穴に遭遇しましたが、今回は ...

Linux 環境変数とプロセス アドレス空間の概要

目次Linux 環境変数とプロセスアドレス空間コードを通じて環境変数を取得するプロセスアドレス空間な...

JavaScript コードベースをよりクリーンにする 5 つの方法

目次1. 短絡や条件文の代わりにデフォルトのパラメータを使用する2. 複数の条件の処理3. スイッチ...

CUDA10.0 のインストールと Ubuntu での問題

Tensorflow バージョンと Cuda および CUDNN の対応: https://tens...