React useState:如何使用 onChange 更新我的 useState 用于输入和 OnClick 用于按钮?
React useState: How can I update my useState with onChange for input and OnClick for the button?
我正在尝试更新 useState 挂钩,但对象返回为空。我曾尝试使用类似的东西:<input onChange={e => setFilter(name: e.target.value)} >
但是,它会在每次击键时提交并且按钮毫无意义,并且用户无法完全完成该值(仅复制和粘贴有效)。我做错了什么?
export default function Search() {
const [filter, setFilter] = useState({ name: "Hungary" });
const { data, loading, error } = useQuery(GET_COUNTRY_INFO, {
variables: { filter },
});
if (loading) {
return <Loader />;
}
if (error) return <p>Error</p>;
const userReq = {
name: ''
}
function onChangeHandler (e) {
const userReq = {name: e.target.value}
return userReq
};
const onClickHandler = (e) => {
setFilter(userReq)
}
return (
<div className="body">
<h1>
Get Information
<br /> about Countries!
</h1>
<div className="wrapper">
<input
className="search"
type="text"
id="search"
placeholder="Enter a Country"
onChange={onChangeHandler}
/>
<button className="submit" name="name" type="submit" onClick={onClickHandler}>
Search
</button>
{data?.Country?.[0] && <CountryInfo country={data?.Country[0]} />}
</div>
</div>
);
}
你的 setFilter 是错误的,你正在使用:
setFilter(name: e.target.value)
应该是:
setFilter({ name: e.target.value });
因此,下面的代码应该可以工作,您不需要 'userReq'
变量:
function onChangeHandler(e) {
setFilter({ name: e.target.value });
}
const onClickHandler = (e) => {
console.log(filter);
};
<input type="text" id="search" onChange={onChangeHandler} />
如果你想要 onChange 内联:
onChange={(e) => setFilter({ name: e.target.value })}
您可能需要 2 个独立的状态,
保持当前过滤器的状态
保存当前用户输入的状态
并在单击要将用户输入与过滤器同步的按钮时
看看你的代码,我想你已经解决了这个问题,所以只要让你的 userReq
成为一个状态就可以解决你的问题
基本上改变这个
const userReq = {
name: ''
}
function onChangeHandler (e) {
const userReq = {name: e.target.value}
return userReq
};
至此
const [userReq, setUserReq] = useState({ name: '' })
function onChangeHandler (e) {
setUserReq({ name: e.target.value })
};
我正在尝试更新 useState 挂钩,但对象返回为空。我曾尝试使用类似的东西:<input onChange={e => setFilter(name: e.target.value)} >
但是,它会在每次击键时提交并且按钮毫无意义,并且用户无法完全完成该值(仅复制和粘贴有效)。我做错了什么?
export default function Search() {
const [filter, setFilter] = useState({ name: "Hungary" });
const { data, loading, error } = useQuery(GET_COUNTRY_INFO, {
variables: { filter },
});
if (loading) {
return <Loader />;
}
if (error) return <p>Error</p>;
const userReq = {
name: ''
}
function onChangeHandler (e) {
const userReq = {name: e.target.value}
return userReq
};
const onClickHandler = (e) => {
setFilter(userReq)
}
return (
<div className="body">
<h1>
Get Information
<br /> about Countries!
</h1>
<div className="wrapper">
<input
className="search"
type="text"
id="search"
placeholder="Enter a Country"
onChange={onChangeHandler}
/>
<button className="submit" name="name" type="submit" onClick={onClickHandler}>
Search
</button>
{data?.Country?.[0] && <CountryInfo country={data?.Country[0]} />}
</div>
</div>
);
}
你的 setFilter 是错误的,你正在使用:
setFilter(name: e.target.value)
应该是:
setFilter({ name: e.target.value });
因此,下面的代码应该可以工作,您不需要 'userReq'
变量:
function onChangeHandler(e) {
setFilter({ name: e.target.value });
}
const onClickHandler = (e) => {
console.log(filter);
};
<input type="text" id="search" onChange={onChangeHandler} />
如果你想要 onChange 内联:
onChange={(e) => setFilter({ name: e.target.value })}
您可能需要 2 个独立的状态,
保持当前过滤器的状态
保存当前用户输入的状态
并在单击要将用户输入与过滤器同步的按钮时
看看你的代码,我想你已经解决了这个问题,所以只要让你的 userReq
成为一个状态就可以解决你的问题
基本上改变这个
const userReq = {
name: ''
}
function onChangeHandler (e) {
const userReq = {name: e.target.value}
return userReq
};
至此
const [userReq, setUserReq] = useState({ name: '' })
function onChangeHandler (e) {
setUserReq({ name: e.target.value })
};