元々リモートデータから供給された単一の材料テーブル行を更新します

スティーブ

Reactのマテリアルテーブルがあります。列の1つをカスタム<DatePicker/>コンポーネントにして、ユーザーが行にスケジュールされた日付を割り当てることができるようにします。currentleyテーブルはデータをリモートで取得します。

ときに<DatePicker/>コンポーネントが使用され、日付が選択されて、私はリモートソースからの再フェッチデータにテーブル全体を望んでいません。代わりに、<DatePicker/>onChangeハンドラーで、テーブル内の現在のデータ(日付を設定している行)を変更する必要があります。

マテリアルテーブルのデータストアを利用して「setData」関数を呼び出し、ターゲット行のみを更新できるようにする方法はありますか?

通常、テーブルのデータがリモートソースからのものでない場合は、独自の「setData」関数を呼び出すだけですが、リモートデータオプションに組み込まれているマテリアルテーブルを利用しており、フィルターを使用しているため、これを行うことはできません。

スティーブ

マテリアルテーブルのデータを利用して、データがリモートソースからのものである場合に行を更新するための、クリーンな方法を見つけることができませんでした。しかし、私はうまくいくやや「ハッキー」な解決策を思いつくことができました。

これを達成するために、私は次のことを行いました。

  1. material-tableへのtableRefを作成し、これをReduxストアに保存しました。
  2. 以前のクエリパラメータ履歴を保存するためにローカルコンポーネントの状態を作成しました。
  3. dataMaterialTablepropをカスタムgetData関数に設定します。これはPromiseを返すか、バックエンドAPIをヒットしてテーブルデータ(すべての行)を取得するか、現在のテーブルデータを変更してからこの新しい変更データを返します。この関数はtableRef.current.dataManager.getRenderState().data、現在のMaterialTableデータを取得するために使用します。次に、その変更バージョンを返します(必要な場合)。
  4. rowDataMaterialTableとtableRefReduxストアから2つの小道具を受け取る小さなコンポーネント(NextAction)を作成し、現在のテーブルデータを変更するためにクリックされるカスタムアクションボタンを保持する列をレンダリングします。このコンポーネントは、Reduxストアに保存されているマテリアルテーブルのtableRefにもアクセスできます。このコンポーネント(最終的にはボタン)はonQueryChange()、tableRefの関数を利用して、getData関数の呼び出しを手動で強制します。
  5. NextActionと呼ばれるこのコンポーネントを返すように、列定義でレンダリングキーを設定します。

アイデアは、ボタン付きの列を持つことです。ボタンが押されると、その行の「current_state」列が変更され、テーブルデータはAPIから再レンダリングされません。

これがtableRef.current.onQueryChange()機能するのは、ボタンがクリックされると関数が呼び出されるためです。コンポーネントの「data」propはカスタムgetData関数に設定されているため、tableRef.current.onQueryChange()が呼び出されると、MaterialTableはdata、MaterialTableコンポーネントに設定した関数をカスタムgetData関数に呼び出すように指示されます。

次に、このgetData関数内で、新しいクエリパラメータが古いクエリパラメータと異なるかどうかを確認します(クエリパラメータもローカル状態で保存されるため)。それらが同じである場合、getDataクエリパラメータにnextStateキーがあるかどうかを確認します。このnextStateキーは、カスタムボタンからgetDataが呼び出された場合にのみ存在します。そうである場合は、tableRefを使用して現在のテーブルデータにアクセスし、必要な行を変更してから、新しいtableDataを返します(まだpromiseにラップされています)。

上記を実現するサンプルコードを次に示します。

import React, { useContext } from 'react';
import { connect } from 'react-redux';
import axios from 'my/path/to/axios';

/*
  Custom Button  rendered in a column on the MaterialTable
  Takes a tableRef prop from the Redux Store.
  Note the onClick function that is called.
*/
const NextActionButton = connect(mapStateToPropsNextAction)(( props ) => {
  const tableRef = props.tableRef; // captured from redux store - tableRef from MaterialTable
  return (
    <Button
      disabled={false}
      variant="contained"
      color="secondary"
      size="large"
      onClick={(e) => {tableRef.current.onQueryChange({
        onNextAction: true,
        nextState: 'dispatched',
        row_id: props.rowData.tableData.id,
      })}}
      >
      Dispatch
    </Button>
  )
})

const MyComponent = ( props ) => {

  let tableRef = React.createRef()  // Create the tableRef
  props.setTableRef(tableRef)

  // Store the query history
  const [queryHist, setQueryHist] = React.useState({});

  // Custom function to return the table data either via api or from the old state with modifications
  const getData = (query, tableRef) => new Promise((resolve, reject) => {
    const queryParams = {
      filters: query.filters,
      orderBy: query.orderBy,
      orderDirection: query.orderDirection,
      page: query.page,
      pageSize: query.pageSize,
      search: query.search,
    }

    /*
    Here is the magic that allows us to update the current tableData state without hitting the api

    If the query is the same as before, then just return the same table without hitting api
    This occurs only when:
      1.) the user types the same filter
      2.) when the user wants to update a single row through the special update component in the update column
    */
    if (JSON.stringify(queryHist) === JSON.stringify(queryParams)) {
      // This is how we get MaterialTable's current table data. This is a list of objects, each object is a row.
      let newData = tableRef.current.dataManager.getRenderState().data; 
      if (query.onNextAction === true) {
        newData[query.row_id].current_state = query.nextState;
      }
      resolve({
        data: newData,
        page: tableRef.current.state.query.page,
        totalCount: tableRef.current.state.query.totalCount,
      })
    }

    setQueryHist(queryParams)  // Store query params in the local state for future comparison

    axios.get('/my_data_api', {
      params: queryParams
    }).then(response => {
        return resolve({
          data: response.data.data,
          page: response.data.page,
          totalCount: response.data.total_count,
        })
      }).catch(function (error) {
        console.log(error);
      })
  })

  const [columns] = React.useState([
    {
      title: "Record Id",
      field: "record_id",
    },
    {
      title: "Current State",
      field: "current_state",  // This is the field we will be updating with the NextActionButton
    },
    {
      title: "Next Action",
      field: "placeholder",
      filtering: false,
      render: (rowData) =>  <NextActionButton rowData={rowData}/> // Render the custom button component
    },
  ])

  return (
    <MaterialTable
      title="My Table Title"
      tableRef={tableRef}  // Assign the ref to MaterialTable
      data={
        (query) => getData(query, tableRef)
      }
      columns={columns}
      options={{
        filtering: true,
        debounceInterval: 600,
        paging: true,
        pageSize: 50,
        pageSizeOptions: [50, 100, 1000],
        emptyRowsWhenPaging: false,
        selection: true,
      }}
      .
      .
      .

    />
  )
}

// Redux stuff
const mapDispatchToProps = dispatch => {
  return {
    setTableRef: (tableRef) => dispatch({type: 'SET_TABLE_REF', 'ref': tableRef})
    .
    .
    .
  };
};

export default connect(null, mapDispatchToProps)(Workorders);

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

単一のクエリで関連するデータベーステーブルからネストされたJSON配列をエコーしますか?

分類Dev

ファイルから供給された投稿データを使用してcurlにリクエストを送信します

分類Dev

Pandasデータフレームをデータフレームのリストにマージします。ただし、リスト内のprevoiusテーブルに正常に一致した行はマージから除外されます。

分類Dev

7970HDカードに電力を供給します。分離されたケーブルまたは単一のケーブル?

分類Dev

Hiveは、単一のテーブルのデータから複数のテーブルを作成/更新します

分類Dev

ビューから元のテーブルのデータを更新します

分類Dev

別のテーブルから供給された欠落値を追加しながら、テーブルからマテリアライズドビューを作成します

分類Dev

ネストされたコントロール内の PrimeFaces データテーブルを更新しますか?

分類Dev

Oracle:結合されたテーブルからデータをプルできません:単一行のサブクエリが複数の行を返します

分類Dev

Laravelのルートから注入されたモデルを更新します

分類Dev

Angular6マテリアルテーブルからソートされたデータを取得します

分類Dev

RDBMSデータを使用してSoapUIまたは同様のテストツールに燃料を供給する

分類Dev

別のテーブルから供給されたさまざまな条件をチェックするSQLビューを作成する

分類Dev

AngularJS:モーダルから返されたデータをクリック元の行にバインドします

分類Dev

元の列を保持したまま、グループ化されたテーブルからCSVにデータをコピーします

分類Dev

ネストされた構造を線形供給ストリームからの値で埋めます

分類Dev

外部からインポートされたテーブルのdjangoモデルを作成します

分類Dev

リモートSQLServerデータベーステーブルからローカルデータベーステーブルを更新します

分類Dev

単一のクエリでフェッチされた値の1つのテーブル更新値から値を選択します

分類Dev

元のデータフレームからのフィルター処理されたビュー/行のサブセットから値を更新した後、元のデータフレームを変更するにはどうすればよいですか?

分類Dev

複製されたデータから、一意の行を持つ縮小されたテーブルに選択します

分類Dev

単一のモデル/テーブルからグループ化された結果を抽出してビューに提供する方法

分類Dev

テーブルのチェックされた行からデータを取得します

分類Dev

データベースから生成されたADO.NETデータモデルが私のテーブルの1つを除外しています

分類Dev

ボタンクリックで色とテキストを変更するためにngClassを使用しています。データはデータテーブルを使用してリモートサーバーからフェッチされます

分類Dev

対応する行からのデータを含む動的に生成されたテーブル行クリックにモーダルを表示する

分類Dev

ブートストラップテーブルから単一のテーブル行を選択します

分類Dev

テーブルに更新クエリを適用すると、一度選択されなかったすべてのデータが更新されます

分類Dev

SQLは、各カテゴリ内の列でソートされた複数のテーブルからデータを選択します

Related 関連記事

  1. 1

    単一のクエリで関連するデータベーステーブルからネストされたJSON配列をエコーしますか?

  2. 2

    ファイルから供給された投稿データを使用してcurlにリクエストを送信します

  3. 3

    Pandasデータフレームをデータフレームのリストにマージします。ただし、リスト内のprevoiusテーブルに正常に一致した行はマージから除外されます。

  4. 4

    7970HDカードに電力を供給します。分離されたケーブルまたは単一のケーブル?

  5. 5

    Hiveは、単一のテーブルのデータから複数のテーブルを作成/更新します

  6. 6

    ビューから元のテーブルのデータを更新します

  7. 7

    別のテーブルから供給された欠落値を追加しながら、テーブルからマテリアライズドビューを作成します

  8. 8

    ネストされたコントロール内の PrimeFaces データテーブルを更新しますか?

  9. 9

    Oracle:結合されたテーブルからデータをプルできません:単一行のサブクエリが複数の行を返します

  10. 10

    Laravelのルートから注入されたモデルを更新します

  11. 11

    Angular6マテリアルテーブルからソートされたデータを取得します

  12. 12

    RDBMSデータを使用してSoapUIまたは同様のテストツールに燃料を供給する

  13. 13

    別のテーブルから供給されたさまざまな条件をチェックするSQLビューを作成する

  14. 14

    AngularJS:モーダルから返されたデータをクリック元の行にバインドします

  15. 15

    元の列を保持したまま、グループ化されたテーブルからCSVにデータをコピーします

  16. 16

    ネストされた構造を線形供給ストリームからの値で埋めます

  17. 17

    外部からインポートされたテーブルのdjangoモデルを作成します

  18. 18

    リモートSQLServerデータベーステーブルからローカルデータベーステーブルを更新します

  19. 19

    単一のクエリでフェッチされた値の1つのテーブル更新値から値を選択します

  20. 20

    元のデータフレームからのフィルター処理されたビュー/行のサブセットから値を更新した後、元のデータフレームを変更するにはどうすればよいですか?

  21. 21

    複製されたデータから、一意の行を持つ縮小されたテーブルに選択します

  22. 22

    単一のモデル/テーブルからグループ化された結果を抽出してビューに提供する方法

  23. 23

    テーブルのチェックされた行からデータを取得します

  24. 24

    データベースから生成されたADO.NETデータモデルが私のテーブルの1つを除外しています

  25. 25

    ボタンクリックで色とテキストを変更するためにngClassを使用しています。データはデータテーブルを使用してリモートサーバーからフェッチされます

  26. 26

    対応する行からのデータを含む動的に生成されたテーブル行クリックにモーダルを表示する

  27. 27

    ブートストラップテーブルから単一のテーブル行を選択します

  28. 28

    テーブルに更新クエリを適用すると、一度選択されなかったすべてのデータが更新されます

  29. 29

    SQLは、各カテゴリ内の列でソートされた複数のテーブルからデータを選択します

ホットタグ

アーカイブ