reactjs - 在 React 钩子中使用带有 `useSelector` 的异步等待
问题描述
我有一个功能组件,它有一个输入字段,用户在其中输入一个问题并点击输入,然后我将查询发送到后端。
这是功能组件的简化版本
用户查询.js
import {postQuery} from '../actions/postQueryAction'
const UserQuery = () => {
const [name, setName] = useState("")
function sendMessage(userQuery) {
postUserQuery(userQuery)
}
return (
<>
<input
type="text"
value={name}
onChange={e => setName(e.target.value)}
onKeyPress={sendMessage}
id="userQuery"
/>
</>
)
}
export default UserQuery
如您所见,我调用了一个回调postQuery
,它实际上发出 axios 请求并发布用户查询。这是它的样子
postQueryAction.js
export const postQuery = (userQuery) => async dispatch => {
let userInfo = useSelector(state => state.userInfo.data)
const username = userInfo.username
const group = userInfo.group
const headers = {
'Content-Type': 'application/json;charset=UTF-8',
}
const params = {
group: group,
user: username,
data: userQuery
}
await axios.post(`/postQuestion`,params, {headers}, {
}).then(response => {
console.log("response check", response.data);
})
.catch(err => {
console.log("Error log", err);
});
}
但我得到Invalid hook call
错误。如果我删除useSelector
代码,那么它不会抱怨并且请求会通过。
我可以使用useSelector
原始功能组件(UserQuery.js)并相应地传递参数。但我希望该postQuery
方法只接受userQuery
参数并从 redux 状态中计算其他信息。
我应该怎么办?
解决方案
钩子只能从反应组件或其他钩子中调用。postQuery
您可以在组件中调用它并将用户信息传递给函数,而不是使用函数内部的钩子postQuery
const UserQuery = () => {
const [name, setName] = useState("");
let userInfo = useSelector((state) => state.userInfo.data);
function sendMessage(userQuery) {
postUserQuery(userQuery, userInfo);
}
...
export const postQuery = (userQuery, userInfo) => async (dispatch) => {
...
推荐阅读
- python - 将单个值从一列复制到满足条件的另一列
- php - 我正在寻找广告代码,在第二次访问时运行
- javascript - 使用 jQuery.validate 禁用表单字段时的 ASP.NET Core 视图模型
- python-3.x - 如何遍历 DataFrame 中的行,计算一个值并使用此 lambda 函数将该值放入一个新列中
- node.js - 使用 loadLayersModel 在 Tensorflow.js 中加载 Keras 模型时“仅支持绝对 URL”
- php - 闪烁消息不起作用,但错误起作用
- azure-devops - Linux VM 上的 Azure DevOps Pipeline PostSharp 失败
- google-drive-api - 如何获得与谷歌驱动器 UI 中可用的相同文件夹结构列表
- html - 为什么边框上这个`
- `标签消失?
- c# - C# 使用 SimpleJSON 写入 json 文件