【问题标题】:Using async await with `useSelector` in React hooks在 React 钩子中使用带有 `useSelector` 的异步等待
【发布时间】:2021-09-05 17:35:25
【问题描述】:

我有一个功能组件,它有一个输入字段,用户在该输入字段中输入问题并按 Enter,然后我将查询发送到后端。

这里是功能组件的简化版

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 状态中获取其他信息。

我该怎么办?

【问题讨论】:

  • 嗨,雷,我的回答对你有帮助吗?如果这种方法不起作用,我很乐意寻找另一种方法

标签: reactjs async-await axios


【解决方案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) => {
...

【讨论】:

  • 嘿抱歉。我正在旅行,没有时间登录堆栈溢出。是的,我使用了与您类似的方法,尽管我仍在研究它,但它停止了抛出错误。但是你给我指明了正确的方向。谢谢..
猜你喜欢
  • 2021-06-04
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2021-04-19
  • 2021-05-06
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多