反应管理分页没有按预期工作
react-admin pagination not working as expected
创建了一个简单的 react-admin 应用程序,它从自定义 rest 中提取 api。显示第一页(默认每页 10 页。单击下一步按钮,没有任何反应(仍将 page=1 发送到 api)。第二次单击,页面前进到第 2 页(page=2),如下所示预期。单击第三次并返回到第 1 页(page=1)。
然后,如果你点击第四次,它会转到第 2 页,然后再次单击,转到第 3 页,然后再次单击,返回到第 1 页。继续这种模式,每一轮,得到一页在返回页面之前进一步。
在 react-admin 应用程序之外调用自定义 API 时,我能够得到正确的结果。我创建了一个自定义 dataProvider 来与 API 通信,也许 getList 函数有问题,但我绝对可以看到传递给该函数的页码,它与奇怪的结果(第 1 页,然后是第 1 页)一致, 2, 1, 然后是 1, 2, 3, 1, 等等。自定义 API 需要以下查询字符串进行分页: ?limit=10&page=1&orderBy=id&orderDir=ASC
react-admin原创教程returns10条记录。当我将页面限制设置为 5 时,它似乎工作正常(第一次单击下一步时前进到第 2 页),但没有更多记录,很难对其进行全面测试。但我的猜测是它会起作用,因为这肯定是我的代码或 API 的问题(尽管,正如我所说,API 在 React 应用程序之外工作)。
这是我的 getList 函数:
const httpClient = (url, options = {}) => {
if (!options.headers) {
options.headers = new Headers({ Accept: 'application/json' });
}
const tokens = localStorage.getItem('tokens');
const objToken = JSON.parse(tokens);
options.user = {
authenticated: true,
token: `Bearer ${objToken.accessToken}`
};
return fetchUtils.fetchJson(url, options);
};
export default {
getList: (resource, params) => {
const { page, perPage } = params.pagination;
const { field, order } = params.sort;
const { q } = params.filter;
// Pagination and sort
let query = `limit=${perPage}&page=${page}&orderBy=${field}&orderDir=${order}`;
// Filter?
let useResource = '';
let useFilter = '';
if (q == null) {
// No filter: Use <resource>/ url
useResource = resource;
} else {
// Filter: Use append url with /find
useResource = `${resource}/find`;
useFilter = q;
console.log('useFilter: ', useFilter)
query += `&searchText=${useFilter}`;
}
const url = `${apiUrl}/${useResource}?${query}`;
return httpClient(url)
.then(({ json }) => ({
data: json.results,
total: json.totalRows,
}));
}, ...
这是问题的屏幕截图:
编辑:
看起来正在发送正确的查询字符串,但在第一次单击下一页(page=2)后,page=1 会立即再次自动发送,返回到第一页。随后的下一步点击似乎也是如此。感谢您帮助新手。但我就是不明白为什么要进行额外的调用以返回第 1 页。
已在 react-admin 3.4.3 中修复。
我使用 npm update 进行了更新,并且分页工作正常。
我的行为与反应完全一致4.x.x
我期待的是:
单击下一页时转到下一页,react-admin 3.19 这就是我的应用程序的工作方式
发生了什么:
当您点击下一页时,分页重置为 1!
另外,它没有考虑我定义的分页。
在 chrome 默认每页为 5,即使我将其设置为 10。
chrome_pagination_issue
在 firefox 上默认每页=10,但我有同样的问题
firefox_pagination_issue
其他信息:
getList: (resource, params) => {
const { page, perPage } = params.pagination;
const { field, order } = params.sort;
console.log(params);
const query = {
...fetchUtils.flattenObject(params.filter),
_sort: field,
_order: order,
_start: (page - 1) * perPage,
_end: page * perPage,
_resource:resource
};
const url = `${apiUrl}/${resource}?${stringify(query)}`;
return httpClient(url).then(({ headers, json }) => {
if (!json.hasOwnProperty('totalElements')) {
throw new Error(
"The numberOfElements property must be must be present in the Json response"
);
}
return {
data: json.content,
total: parseInt(json.totalElements,10)
};
});
}
#4658
环境
React-admin 版本: 4.0.1 , 4.0.2
反应 version:18
禁用严格模式
浏览器:chrome、火狐
我的后端是 spring boot rest api
创建了一个简单的 react-admin 应用程序,它从自定义 rest 中提取 api。显示第一页(默认每页 10 页。单击下一步按钮,没有任何反应(仍将 page=1 发送到 api)。第二次单击,页面前进到第 2 页(page=2),如下所示预期。单击第三次并返回到第 1 页(page=1)。
然后,如果你点击第四次,它会转到第 2 页,然后再次单击,转到第 3 页,然后再次单击,返回到第 1 页。继续这种模式,每一轮,得到一页在返回页面之前进一步。
在 react-admin 应用程序之外调用自定义 API 时,我能够得到正确的结果。我创建了一个自定义 dataProvider 来与 API 通信,也许 getList 函数有问题,但我绝对可以看到传递给该函数的页码,它与奇怪的结果(第 1 页,然后是第 1 页)一致, 2, 1, 然后是 1, 2, 3, 1, 等等。自定义 API 需要以下查询字符串进行分页: ?limit=10&page=1&orderBy=id&orderDir=ASC
react-admin原创教程returns10条记录。当我将页面限制设置为 5 时,它似乎工作正常(第一次单击下一步时前进到第 2 页),但没有更多记录,很难对其进行全面测试。但我的猜测是它会起作用,因为这肯定是我的代码或 API 的问题(尽管,正如我所说,API 在 React 应用程序之外工作)。
这是我的 getList 函数:
const httpClient = (url, options = {}) => {
if (!options.headers) {
options.headers = new Headers({ Accept: 'application/json' });
}
const tokens = localStorage.getItem('tokens');
const objToken = JSON.parse(tokens);
options.user = {
authenticated: true,
token: `Bearer ${objToken.accessToken}`
};
return fetchUtils.fetchJson(url, options);
};
export default {
getList: (resource, params) => {
const { page, perPage } = params.pagination;
const { field, order } = params.sort;
const { q } = params.filter;
// Pagination and sort
let query = `limit=${perPage}&page=${page}&orderBy=${field}&orderDir=${order}`;
// Filter?
let useResource = '';
let useFilter = '';
if (q == null) {
// No filter: Use <resource>/ url
useResource = resource;
} else {
// Filter: Use append url with /find
useResource = `${resource}/find`;
useFilter = q;
console.log('useFilter: ', useFilter)
query += `&searchText=${useFilter}`;
}
const url = `${apiUrl}/${useResource}?${query}`;
return httpClient(url)
.then(({ json }) => ({
data: json.results,
total: json.totalRows,
}));
}, ...
这是问题的屏幕截图:
编辑: 看起来正在发送正确的查询字符串,但在第一次单击下一页(page=2)后,page=1 会立即再次自动发送,返回到第一页。随后的下一步点击似乎也是如此。感谢您帮助新手。但我就是不明白为什么要进行额外的调用以返回第 1 页。
已在 react-admin 3.4.3 中修复。
我使用 npm update 进行了更新,并且分页工作正常。
我的行为与反应完全一致4.x.x
我期待的是:
单击下一页时转到下一页,react-admin 3.19 这就是我的应用程序的工作方式
发生了什么:
当您点击下一页时,分页重置为 1! 另外,它没有考虑我定义的分页。
在 chrome 默认每页为 5,即使我将其设置为 10。
chrome_pagination_issue
在 firefox 上默认每页=10,但我有同样的问题
firefox_pagination_issue
其他信息:
getList: (resource, params) => {
const { page, perPage } = params.pagination;
const { field, order } = params.sort;
console.log(params);
const query = {
...fetchUtils.flattenObject(params.filter),
_sort: field,
_order: order,
_start: (page - 1) * perPage,
_end: page * perPage,
_resource:resource
};
const url = `${apiUrl}/${resource}?${stringify(query)}`;
return httpClient(url).then(({ headers, json }) => {
if (!json.hasOwnProperty('totalElements')) {
throw new Error(
"The numberOfElements property must be must be present in the Json response"
);
}
return {
data: json.content,
total: parseInt(json.totalElements,10)
};
});
}
#4658
环境
React-admin 版本: 4.0.1 , 4.0.2 反应 version:18 禁用严格模式 浏览器:chrome、火狐 我的后端是 spring boot rest api