DataBlockRequestProvider

其内部获取到 BlockResourceProvider 提供的 resource,根据 BlockProvider 提供的参数,自动调用 resource.get() 或者 resource.list() 获取的卡片的数据,并通过 context 传递下去。

请求参数

请求参数是获取 DataBlockProvider 提供中的 paramsfilterByTk

const schema = {
  'x-decorator': 'DataBlockProvider',
  'x-decorator-props': {
    'collection': 'users',
    'action': 'list',
    // 静态参数
    params: {
      pageSize: 10,
    }
  },
  // 动态参数
  'x-use-decorator-props': 'useDynamicDataBlockProps',
}

const useDynamicDataBlockProps: UseDataBlockProps<'CollectionList'>  = () => {
  return {
    params: {
      size: 15,
    }
  }
}

会自动调用 resource.list() 获取数据,发起 GET /api/users:list?pageSize=10&size=15 的请求。

Hooks

useDataBlockRequest()

用于获取请求对象,一般用卡片组件中。

const MyTable = () => {
  const { data, loading } = useDataBlockRequest();

  return (
    <Table
      dataSource={data?.data || []}
      loading={loading}
      pagination={{
        total: data?.meta.total,
        pageSize: data?.meta.pageSize,
        page: data?.meta.page,
      }}
    />
  )
}

Record

Get 请求

对于 get 请求,当获取到 data 数据后,会通过 CollectionRecordProvider 提供 record 对象,用于获取当前卡片的数据。

const schema = {
  'x-decorator': 'DataBlockProvider',
  'x-decorator-props': {
    'collection': 'users',
    'action': 'get', // get 请求
  },
  // 动态参数
  'x-use-decorator-props': 'useDynamicFormProps',
}

const useDynamicDataBlockProps: UseDataBlockProps<'CollectionGet'>  = () => {
  return {
    params: {
      filterByTk: 1,
    }
  }
}

会自动调用 resource.get() 获取数据,发起 GET /api/users:get/1 的请求,并通过 CollectionRecordProvider 提供上下文。

const { data } = useDataBlockRequest();
const record = useCollectionRecord(); // record 上下文数据

// 相等
record.data === data;

List 请求

对于 list 请求则不会提供 record 对象,需要自己通过 <CollectionRecordProvider /> 设置上下文。

const MyTable = () => {
  const { data } = useDataBlockRequest();

  return (
    <Table
      dataSource={data?.data || []}
      columns={[
        {
          title: 'ID',
          dataIndex: 'id',
        },
        {
          title: 'Action',
          render: (v, record) => {
            return (
              <CollectionRecordProvider record={record}>
                <MyAction />
              </CollectionRecordProvider>
            )
          },
        },
      ]}
      pagination={{
        total: data?.meta.total,
        pageSize: data?.meta.pageSize,
        page: data?.meta.page,
      }}
    />
  )
}

const MyAction = () => {
  const record = useCollectionRecord();
  return (
    <Button onClick={() => {
      console.log(record.data);
    }}>Dialog</Button>
  )
}