我有一个功能组件,它有一个输入字段,用户可以在其中输入问题并按回车键,然后我将查询发送到后端。
这里是功能组件的简化版
UserQuery.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
代码,那么它不会抱怨并且请求会通过。
我可以在原始功能组件 (UserQuery.js) 中使用 useSelector
并相应地传递参数。但我希望 postQuery
方法只接受 userQuery
参数并从 redux 状态计算其他信息。
我该怎么办?
答案 0 :(得分:1)
钩子只能从 react components or other hooks 调用。您可以在组件中调用它并将用户信息传递给 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) => {
...