Cor*_*ene 2 reactjs graphql react-apollo apollo-client react-hooks
我尝试使用 React-Hooks 和 GraphQL-Apollo Client 在我的管理系统中实现搜索功能。当界面显示成功时,当我按下“搜索”按钮时,它出现了一个错误,名为:
无效的钩子调用。钩子只能在函数组件的主体内部调用。
我很确定useQuery是在函数内部调用的,所以我不明白是什么导致了这种情况。显示所有用户和添加新用户等其他功能运行良好。
我尝试了几种方法来实现搜索功能并在网上搜索,但仍然无法解决。这也是我第一次遇到 React-Hooks。
这是我在searchUser组件中的当前代码
import React from 'react'
import {useQuery} from 'react-apollo-hooks';
import {searchUserQ} from '../queries/queries';
const SearchUserForm = () => {
let name = '';
let content;
return (
<div id="edit-user">
<div className="field">
<label htmlFor="name">Search UserName</label>
<input type="text" id="name" onChange={ (event) => {
name = event.target.value }}/>
<button onClick={(event) => {
event.preventDefault();
const { data, loading, error } = useQuery(searchUserQ, {
variables: { name: name },
suspend: false
});
if (loading) {
content = <p>Loading User...</p>
}
if (error){
console.log(`Error Occur: ${ error }`);
content = <p>Error Occur!</p>
}
content = data.users.map(user => (
<p key={user.id}>Username: {user.name} ID: {user.id}</p>
));
}}>
Submit
</button>
<p>{ content }</p>
</div>
</div>
)
}
export default SearchUserForm;
Run Code Online (Sandbox Code Playgroud)
有人能帮忙吗?
还有一个问题是我每次执行查询时data似乎都会返回undefined。我的查询有问题吗?这是查询:
const searchUserQ = gql`
query User($name: String!){
user(name: $name){
id
name
email
}
}
`;
Run Code Online (Sandbox Code Playgroud)
感谢并感谢您的帮助!
根据Hooks 规则:
不要从常规 JavaScript 函数调用 Hook。相反,您可以:
? 从 React 函数组件调用 Hook。
? 从自定义 Hooks 调用 Hooks(我们将在下一页了解它们)。
如果您需要手动调用查询以响应事件,请直接使用 Apollo 客户端。您可以使用useApolloClient在组件中获取客户端的实例:
const SearchUserForm = () => {
const client = useApolloClient();
...
return (
...
<button onClick={async (event) => {
try {
const { data } = client.query({
query: searchUserQ,
variables: { name: event.target.value },
});
// Do something with data, like set state
catch (e) {
// Handle errors
}
}} />
Run Code Online (Sandbox Code Playgroud)
您还可以使用useQuery,如下所示:
const SearchUserForm = () => {
const [name, setName] = useState('')
const { data, loading, error } = useQuery(searchUserQ, {
variables: { name },
});
...
return (
...
<button onClick={async (event) => {
setName(event.target.value)
...
}} />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4725 次 |
| 最近记录: |