【发布时间】:2021-08-06 01:11:30
【问题描述】:
我试图在每个答案负载上传到服务器时显示进度或加载栏,并在整个任务完成时显示成功消息?这是我的代码,但我收到错误消息Invalid hook call. Hooks can only be called inside of the body of a function component.。
还要注意getOfflineSavedAnswers 是一个导入函数,因此我不能在此处将其设置为函数。
export default function UploadReport(type) {
const [success, setSuccess] = useState(false)
useEffect(() => {
getOfflineSavedAnswers(type).then(async answers => {
if (answers && answers.length > 0) {
try {
for (const answer of answers) {
try {
await axios.post('/report/question/create-answer', answer)
.then(res => {
delAnswers("phcss")
setSuccess(true)
// ts(`Answers successfully saved!`);
})
.catch(err => {
console.error(err);
delAnswers("phcss")
te(`Answers submission failed!`)
});
} catch (error) {
console.error(error);
delAnswers("phcss")
te(`Answers submission failed!`)
}
}
if(success){
ts(`Answers successfully submitted!`);
}
setSuccess(false)
} catch (error) {
console.error(error);
te(`Answers submission failed!`)
}
}
});
});
return(
success ? 'uploading ans...' : null
)
};
此代码将由另一个类组件调用,如下所示,其中有多个任务
sendReportToServer = () => {
UploadReport("phc", (msg, error) => {
if (error) {
te("Could not upload answer data");
} else {
ts(msg);
}
})
UploadAnswer("phc", (msg, error) => {
if (error) {
te("Could not upload answer data");
} else {
ts(msg);
}
})
UploadQuestion("phc", (msg, error) => {
if (error) {
te("Could not upload answer data");
} else {
ts(msg);
}
})
};
没有钩子,当我做export const uploadReport = async (type) => { 时它工作得很好。但是我引入了钩子,因为我想在每个答案有效负载上传到服务器时显示进度条或加载条,并在整个任务完成时显示成功消息
【问题讨论】:
-
UploadReport(type)看起来有点像组件函数签名不。type是 props 对象吗?UploadReport应该是自定义钩子吗?如果是这样,请将其重命名为使用use-前缀命名约定,即useUploadReport。 -
@DrewReese 为什么?它呈现文本或 null。
-
@evolutionxbox 我同意 Drew 的观点,通常反应组件的参数,如果没有解构,被命名为 props。参数名称本身并不重要,但它确实闻起来像这样可能被称为
UploadReport(type)而不是<UploadReport/>。德鲁的好猜测。 -
@evolutionxbox 因为 linter 使用非常简单的规则来确定钩子是否被有效使用,而且它不是太亮,它只是遵循一些基本准则。 reactjs.org/docs/hooks-overview.html#building-your-own-hooks
-
好点@DrewReese 我没有注意到缺少道具解构。
标签: javascript reactjs function async-await react-hooks