javascript - 如何在 React 中创建使用状态和道具的可重用函数
问题描述
我有一个将数据发送到服务器并使用props
和set...
. 在少数几个组件中都是相同的。当某个事件发生时它会被调用。
我怎样才能将它从这些组件中重构到一个地方?
我正在考虑使用钩子,但因为它是由事件触发的,所以我认为使用钩子不是一个好方法。
async function sendDataToServer(data) {
const url = new URL(buildUrl());
let timeout = setTimeout(() => setPostingState(SendingState.Sending), 250);
try {
const response = props.id
? await axios.put(url, data)
: await axios.post(url, data);
setPostingState(SendingState.Idle);
props.onSaved(props.id ? props.id : response.data, data);
}
catch (error) {
setPostingState(SendingState.Error);
}
clearTimeout(timeout);
}
function handleSubmit(e) { ... sendDataToServer(data); ... }
解决方案
您可以制作一个咖喱函数:
// helpers.js
export const genSendDataToServerCallback = ({ setState, onSaved, id }) => async (
data
) => {
const url = new URL(buildUrl());
let timeout = setTimeout(() => setState(SendingState.Sending), 250);
try {
const response = await (props.id
? axios.put(url, data)
: axios.post(url, data));
setState(SendingState.Idle);
onSaved(id ? id : response.data, data);
} catch (error) {
setState(SendingState.Error);
}
clearTimeout(timeout);
};
// Usage in some component
import { genSendDataToServerCallback } from './helpers.js'
const sendDataToServer = genSendDataToServerCallback({setter:setPostingState, ...props});
function handleSubmit(e) { sendDataToServer(data); }
// Usage in other component with different setter
const sendDataToServer = genSendDataToServerCallback({setter:setState, ...props});
function handleSubmit(e) { sendDataToServer(data); }
推荐阅读
- laravel - Ubuntu 18.04 上的 Laravel Forge 自定义 VPS
- php - $_POST 没有使用 bindValue 插入到帖子表中,而其他字段被插入
- reactjs - WP Gutenberg,如何将变量从后端(保存函数)传递到前端(在保存函数输出中呈现的 React 应用程序)?
- javascript - JS- 相应地过滤 JSON
- javascript - evoPDF 转换触发模式不起作用
- image - 在我在 vue chrome 开发工具中打开组件之前,数据属性中的图像文件路径不会显示
- charts - 如何用 highcharts 库绘制欧拉图?
- eclipse - 如何将现有的 iLog 规则 jar 导入 Eclipse?
- azure - 如何使用 azure 将数据加载到 sql sink 中?
- swift - UIPickerView 在重新加载时冻结 UI