Skip to main content

useFetch

用于请求获取数据的 hooks。

说明

发送请求获取数据,当 hook 组件存在时会一直有效。

默认是 hook 生成之后就生效,可以设置 abort 参数来手动开始发送请求。

引入​

import {request, useFetch} from '@baidu/acud-pro-components';

action 为普通函数​

function App() {
const url = 'https://yapi.baidu-int.com/mock/23714/api/list';

const action = () => {
return request.post(url);
};

const columns = [
{
key: 'id',
title: 'ID',
dataIndex: 'id'
},
{
key: 'name',
title: '名称',
dataIndex: 'name'
}
];

const FetchDemo = () => {
const {data, loading} = useFetch(action);
const {result, pageNo, pageSize, totalCount} = data || {};

return (
<Table
rowKey="id"
loading={loading}
dataSource={result}
columns={columns}
pagination={{current: pageNo, total: totalCount}}
/>
);
}

return (
<FetchDemo />
);
}

经过 bindActionCreators 处理​

action 经过了 bindActionCreators 处理:

const action = () => {
return async dispatch => {
const result = await request.post(url);
dispatch({
type: 'LIST',
result
});
return result;
};
};

const mapDispatchToProps = dispatch => ({
action: bindActionCreators(action, dispatch)
});

示例:

  • 引入
import React from 'react';
import thunk from 'redux-thunk';
import {Table} from 'acud';
import {connect, Provider, useSelector} from 'react-redux';
import {createStore, bindActionCreators, compose, applyMiddleware} from 'redux';
import {request, useFetch} from '@baidu/acud-pro-components';
  • 使用
function App() {
const reducer = (state = [], action) => {
switch (action.type) {
case 'LIST':
return action.result;
default:
return state;
}
};

const store = createStore(reducer, compose(applyMiddleware(thunk)));

const url = 'https://yapi.baidu-int.com/mock/23714/api/list';

const action = () => {
return async dispatch => {
const result = await request.post(url);
dispatch({
type: 'LIST',
result
});
return result;
};
};

const mapStateToProps = (state, ownProps) => ownProps;

const mapDispatchToProps = dispatch => ({
action: bindActionCreators(action, dispatch)
});

const columns = [
{
key: 'id',
title: 'ID',
dataIndex: 'id'
},
{
key: 'name',
title: '名称',
dataIndex: 'name'
}
];

const FetchDemo = connect(mapStateToProps, mapDispatchToProps)(props => {

const {action} = props;
const state = useSelector(state => state);

const {loading} = useFetch(action);
const {result, pageNo, pageSize, totalCount} = state || {};

return (
<Table
rowKey="id"
loading={loading}
dataSource={result}
columns={columns}
pagination={{current: pageNo, total: totalCount}}
/>
);
});

return (
<Provider store={store}>
<FetchDemo />
</Provider>
);
}

未经过 bindActionCreators 处理​

action 未经过 bindActionCreators 处理,但使用了 dispatch (该场景其实不合理,但为了兼容旧代码)

const action = () => {
return async dispatch => {
const result = await request.post(url);
dispatch({
type: 'LIST',
result
});
return result;
};
};

示例:

  • 引入
import React from 'react';
import axios from 'axios';
import thunk from 'redux-thunk';
import {Table} from 'acud';
import {connect, Provider, useSelector} from 'react-redux';
import {createStore, compose, applyMiddleware} from 'redux';
import {request, useFetch} from '@baidu/acud-pro-components';
  • 使用
function App() {
const reducer = (state = [], action) => {
switch (action.type) {
case 'LIST':
return action.result;
default:
return state;
}
};

const store = createStore(reducer, compose(applyMiddleware(thunk)));

const url = 'https://yapi.baidu-int.com/mock/23714/api/list';

const action = () => {
return async dispatch => {
const result = await request.post(url);
dispatch({
type: 'LIST',
result
});
return result;
};
};

const columns = [
{
key: 'id',
title: 'ID',
dataIndex: 'id'
},
{
key: 'name',
title: '名称',
dataIndex: 'name'
}
];

const FetchDemo = props => {

const state = useSelector(state => state);

const {loading} = useFetch(action);
const {result, pageNo, pageSize, totalCount} = state || {};

return (
<Table
rowKey="id"
loading={loading}
dataSource={result}
columns={columns}
pagination={{current: pageNo, total: totalCount}}
/>
);
};

return (
<Provider store={store}>
<FetchDemo />
</Provider>
);
}

API​

useFetch(
action: (params?: any) => Promise<TData>,
params?: TParam,
$onRequest?: (payload?: any) => any,
$onResponse?: (result?: any) => any,
$onError?: (ex: any) => void,
abort?: boolean
)