我是React和Hooks的新手。
我创建了一个简单的搜索栏,用户可以在其中键入一些文本。
但是,如果我console.log
之后的状态为onChange
,则它总是后面一个字符。
例如:
如果我输入“ pizza”,则console.log
会显示“ pizz”
我的组件
export default function SearchBar({handlerSearchBar}) {
const classes = useStyles();
const [searchBarQuery, setSearchBarQuery] = React.useState([""])
function handleChange(event){
setSearchBarQuery(event.target.value)
// handlerSearchBar(searchBarQuery)
console.log(searchBarQuery)
}
return (
<form className={classes.container} noValidate autoComplete="off">
<TextField
id="standard-full-width"
label="Searchbar"
style={{ marginLeft: 40, marginRight: 40 }}
placeholder="Write your query"
// helperText="The results will appear below!"
fullWidth
margin="normal"
InputLabelProps={{
shrink: true,
}}
onChange={handleChange}
/>
</form>
);
}
经过研究(onChange event updates state with 1 character delay),我知道setState
是异步的。
因此,我尝试了各种解决方案以使其正常工作:
1)解决方案一
function handleChange(event) {
let text = event.target.value;
setSearchBarQuery({
text: text
});
console.log(searchBarQuery)
}
但是我有同样的问题(未捕获最后一个字符)
2)解决方案二
function handleChange(event) {
let text = event.target.value;
setSearchBarQuery({
text: text
}, ()=>console.log(searchBarQuery));
}
但是我得到Warning: State updates from the useState() and useReducer() Hooks don't support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect().
3)解决方案三
async function handleChange(event) {
await setSearchBarQuery({text: event.target.value});
console.log(searchBarQuery)
}
但是我有同样的问题(未捕获最后一个字符)
答案 0 :(得分:1)
您知道,useState是异步函数。当您在功能组件内部使用useState时,必须处理useEffect中的变量才能看到变量的更改,如下所示:
const App = () => {
const [search, setSearch] = useState("");
const onChange = e => {
e.persist();
setSearch(e.target.value);
};
useEffect(() => {
console.log("Search message inside useEffect: ", search);
}, [search]);
return <input onChange={onChange} />;
};