0

Reacts 機能コンポーネント スタイルを使用して、再利用可能なテーブルのようなコンポーネントを開発します。テーブルは、React.useReducer を使用してその状態を保持、管理、および検証します。各行には、行/テーブルの状態を変更するためのいくつかの入力フィールド、チェックボックス、およびアクション ボタンがあります。

これで、GUI の別の場所 (テーブルの子ではない) に保存ボタンができました。状態をテーブルから取得して、(他のデータと共に) 永続化のために REST-Endpoint に送信できるようにするにはどうすればよいでしょうか?

私たちの実際の解決策は、テーブルの小道具として設定されるコールバック関数です。この関数は、現在の状態のコピーを公開するために各レンダリング後に table-component 内から呼び出されます。このコールバック関数の所有者は、このデータを取得して保持し、Save-Button のスコープで使用できるようにします。

function ComponentWrapper(props)
{
    const dataRef = React.useRef(props.initialData);

    function onDataUpdate(newData) {
        dataRef.current = newDate;
    }
    
    function saveData() {
        // send dataRef.current to REST-Endpoint
    }
    
    return (
        <div>
            <MyTable onDataUpdate={onDataUpdate}></MyTable>
            ...
            <button onClick={(e) => sendData()} name="save">Save</button>
        </div>
    );
}
    
function MyTable(props)
{
    const [state, dispatch] = useReducer(..., props.initialData)

    // ... some code to dispatch state changing actions

    useEffect(() => {
        const copyOfState = { ...state }
        props.onDataUpdate(copyOfState);
    });
   
    return (
        // table markup goes here ...
    );
}

これは実際に機能しますが、そのようなユースケースにはもっと良い方法があると考えています。テーブルは再利用可能である必要があり、保存ボタンは GUI のまったく別の場所 (ツールバーやメニューなど) に配置される可能性があるため、テーブルから ComponentWrapper に状態を持ち上げたくありません。

これに関するアイデアはありますか?前もって感謝します。

4

1 に答える 1