vben-admin でテーブルをレンダリングするときにさまざまなデータ構造を処理する方法

最近、vben admin を使用してバックエンド管理システムを開発しています。vben admin のバックエンド フレームワークは非常にカプセル化されており、粒度が非常に細かいため、コンポーネントや API の使用法を理解していれば、非常に早く開発できます。現在、vben 管理開発の問題に関するブログは非常に少ないため、見つけにくい問題もあります。そんな過程を経てきたので、使える学生が遠回りしないようにと思い、開発中に遭遇した問題点をまとめてみました。

1. インターフェースリクエストによって返されたデータ構造が現在のテーブルコンポーネントと一致しない場合はどうすればよいですか?

まず、最初に遭遇した問題は、バックエンドはデータを返しましたが、データ構造とデータ名が私が望んでいたものではなかったということでした。これは、テーブル コンポーネントがカプセル化されており、フィールド名もあらかじめ決められていたためです。バックエンドから返されるデータ構造とデータ名は異なりますか?

まずはコードを見てください

// 获取页面的列表数据
// getRuleList();
const [registerTable, {
    
     getRawDataSource, reload, updateTableDataRecord, getForm }] = useTable({
    
    
    api: getRuleList,
    columns,
    formConfig: {
    
    
        labelWidth: 120,
        schemas: searchFormSchema,
        autoSubmitOnEnter: true,
        showResetButton: false,
        showSubmitButton: false,
    },
    beforeFetch: (params) => {
    
    
        params.ruleId = query.ruleId;
        return params;
    },
    afterFetch: (data) => {
    
    
        console.log('-------------------请求之后的参数处理---------');
        // 获取接口的原始数据
        getRawData();
        return data;
    },
    useSearchForm: true,
    bordered: true,
    showIndexColumn: false,
});

getRuleList インターフェイスの場合、返されるデータ構造は次のようになります。

{
    
    
   code:2000
   message:null,
   data:{
    
    
          list: [....],
          last: 161,
          count: 1610,
          pageNo: 1,
          pageSize: 10,
   }
}

ただし、バックエンドによって返されるデータ構造は次のようになります。

{
    
    
   resultCode:2000
   resultMessage:null,
   resultData:{
    
    
          records: [....],
          pageCount: 161,
          totalCount: 1610,
          pageNum: 1,
          pageSize: 10,
   }
}

現時点では、インターフェイス要求データが返された後に変換レイヤーを実行する必要があります。

コードは以下のように表示されます:

//获取客户资料列表
export const getRuleList = (params: any) => {
    
    
  return new Promise((resolve, reject) => {
    
    
    defHttp
      .post<any>(
        {
    
    
          url: Api.GetRuleList,
          params,
        }
      )
      .then((res) => {
    
    
        console.log('-----------列表返回的数据------------');
        console.log(res);
        resolve({
    
    
        code:res.resultCode,
        message:res.message,
        data:{
    
    
          list: res.resultData.records,
          last: res.resultData.pageCount,
          count: res.resultData.totalCount,
          pageNo: res.resultData.pageNum,
          pageSize: res.resultData.pageSize,
        }
        });
      });
  });
};

変換層を経ると、現在のデータ構造はこの要件を満たします。

この問題は解決され、フォーム データがレンダリングされます。
しかし、新しいデータが到着しました。ページに検索フォームがある場合、フォーム内のデータを反転表示するにはどうすればよいでしょうか?

2. フォームとテーブルが含まれるページで、フォーム データを反転して表示するにはどうすればよいですか?

この問題は 2 つのステップで完了する必要があります。最初のステップはフォーム データを取得することであり、2 番目のステップはフォームに値を割り当てることです。

テーブルデータは反転表示できるが、フォームデータが取得できないため、この問題が発生しました。

// 获取页面的列表数据
// getRuleList();
const [registerTable, {
    
     getRawDataSource, reload, updateTableDataRecord, getForm }] = useTable({
    
    
    api: getRuleList,
    columns,
    formConfig: {
    
    
        labelWidth: 120,
        schemas: searchFormSchema,
        autoSubmitOnEnter: true,
        showResetButton: false,
        showSubmitButton: false,
    },
    // 请求数据接口之前的处理函数
    beforeFetch: (params) => {
    
    
        params.ruleId = query.ruleId;
        return params;
    },
    // 请求接口数据之后的处理函数
    afterFetch: (data) => {
    
    
        console.log('-------------------请求之后的参数处理---------');
        // 获取接口的原始数据并给表单赋值,使表单反显
        getRawData();
        return data;
    },
    useSearchForm: true,
    bordered: true,
    showIndexColumn: false,
});
1. 最初のステップの問題を解決します: フォームデータを取得します

afterFetch 処理関数で印刷要求が戻ってきたとき、データは印刷されますが、印刷できません。この時点ではデータが何であるかはわかりませんが、後でレンダリングされたページ データから判断すると、データは次のとおりであるはずです。 res.data.list, list フォームデータは含まれておらず、テーブルデータのみが含まれています。では、元のリクエストデータを取得するにはどうすればよいでしょうか?

vben admin ではインターフェースの元データを取得するメソッド getRawDataSource を useTable 内に用意しており(コード内での導入方法をご覧ください)、この際にフォームデータを取得することができます。

// 获取接口的原始数据
// getRawData();
// 获取接口的完整数据
function getRawData() {
    
    
    console.log('请在控制台查看!');
    console.log(getRawDataSource());
    // 获取到请求回来的原始数据,然后对原始数据赋值
    let getFormData = getRawDataSource();
    
    // 第一步 拿到表单数据
    fromData.name = getFormData.data.name;
    fromData.departmentName = getFormData.data.departmentName;
    fromData.field = getFormData.data.field;
    fromData.scenarioName = getFormData.data.scenarioName;
    fromData.applicableUserName = getFormData.data.applicableUserName;
    console.log('---------------form表单-----------------');
    console.log(fromData);
    
    // 第二步 对表单数据进行赋值
    let form = getForm();
    console.log('---------------获取到的form表单数据-----------------');
    console.log(form);
    getForm().setFieldsValue({
    
    
        datalistName: fromData.departmentName,
        department: fromData.departmentName,
        field: fromData.field,
        UsageScenario: fromData.scenarioName,
        applicableUser: fromData.applicableUserName,
    });
}
2. 2 番目のステップで問題を解決します。取得したデータをフォームに割り当てます。

useTableにはgetFormメソッドが用意されており、getFormメソッドにはフォームを処理するための様々なメソッドが含まれており、フォームに値を代入するメソッドはフォームデータを設定するメソッドであるsetFieldsValueです。(上記の最初のステップのコードには、2 番目のステップのコードも含まれています)

// 第二步 对表单数据进行赋值
    let form = getForm();
    console.log('---------------获取到的form表单数据-----------------');
    console.log(form);
    getForm().setFieldsValue({
    
    
        datalistName: fromData.departmentName,
        department: fromData.departmentName,
        field: fromData.field,
        UsageScenario: fromData.scenarioName,
        applicableUser: fromData.applicableUserName,
    });

最初のステップと 2 番目のステップの問題は解決されましたが、getRawData を呼び出してデータを取得し、値を割り当てるステップがまだ 1 つ残っています。
現時点では、afterFetch を使用し、afterFetch で getRawData を呼び出します。これで私の問題は完全に解決されます。

はい、以上です。今後新しい概要を発行する予定です。皆様のお役に立てれば幸いです。

おすすめ

転載: blog.csdn.net/xiaolinlife/article/details/132813200