onChange 是一个延迟字符 - Hooks

2024-02-07

我是 React 和 Hooks 的新手。

我创建了一个简单的搜索栏,用户可以在其中输入一些文本。

然而,如果我console.log之后的状态onChange,它总是落后一个字符。

例如: 如果我输入“披萨”,console.log鞋子“披萨”

我的组件

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 事件以 1 个字符延迟更新状态 https://stackoverflow.com/questions/35557512/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)
    }

但我有同样的问题(最后一个字符没有被捕获)


如您所知,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} />;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

onChange 是一个延迟字符 - Hooks 的相关文章

随机推荐

  • 全局安装 Composer 以供 Laravel 使用?

    我在全局安装作曲家时遇到一些问题 我将 Composer 安装到 C wamp bin php php5 4 12 目录中 我使用的是 WAMP 并使用以下命令在 C wamp www project 中创建一个项目 php compose
  • 无法清除 WPF ListBox.SelectedItems 集合

    我似乎无法清除数据绑定 WPF ListBox 的 SelectedItems 集合 我尝试过调用 ListBox SelectedItems Clear 尝试将 SelectedIndex 设置为 1 将 SelectedItem 设置为
  • 菜单项的自定义视图

    我需要有动态菜单项 用户定义颜色的圆圈 如下所示 触摸此菜单项将打开一个颜色选择器 现在 我有示例 ColorPickerIcon 扩展了 View public class ColorPickerIcon extends View pri
  • Python subprocess.Popen.wait() 即使发生错误也返回 0

    我正在通过 Python 的子进程模块运行命令行实用程序 我使用命令行参数和 stdout subprocess PIPE 创建一个 subprocess Popen 对象 然后使用 subprocess wait 等待任务完成并返回返回代
  • 在 Google 图表中显示/隐藏线条/数据

    我正在尝试制作一个包含 2 条线的谷歌折线图 您应该能够通过两个复选框打开和关闭它们 显示 隐藏 有人有任何想法可以做到这一点 或者只是给出一些指示吗 我的猜测是一些 onClick jQuery 的东西
  • TS2307:找不到模块“类验证器”

    我正在尝试使用类验证器 https github com pleerock class validatorTypescript 项目中的模块 但是 当我编译打字稿时 会发出以下警告 src main ts domain Order ts 1
  • 获取并在 Woocommerce 单一产品页面上显示税率

    我正在尝试找到一种方法 如何仅显示产品所具有的税率 16 或 7 基本上 这个想法是应该有一个静态税 价格包含16 税费 or 价格含7 税 因此 百分比利率应该根据产品的利率而动态变化 知道如何解决这个问题 我找到的所有解决方案都显示完整
  • RabbitMQ 中的消息序列出现意外行为

    我想实现类似于选项 3 的 RabbitMQ 拓扑here https engineering nanit com rabbitmq retries the full story ca4cc6c5b493 除了一些差异 新拓扑每天应该处理几
  • 为什么我要使用无限超时的 Sleep() ?

    据 MSDN 报道 Sleep http msdn microsoft com en us library ms686298 VS 85 aspx可以提供INFINITE值并且 表明暂停不应超时 为什么我要调用 Sleep INFINITE
  • 是否有工具可以找出 PC 上安装了哪个 .NET 框架?

    我知道官方的方法是注册表 但这有点耗时 我必须检查几台电脑上安装的版本 它们都没有 VisualStudio 但它们全部 可能 a NET 框架的版本 既然热水可能已经存在 那么我在哪里可以找到它呢 这是一个免费的轻量级工具 可以快速完成此
  • 我们的记录中不存在 AWS 访问密钥 ID

    我创建了一个新的访问密钥并在 AWS CLI 中配置了该密钥aws configure 它创造了 ini文件输入 aws config 当我跑步时aws s3 ls它给 调用 ListBuckets 操作时发生客户端错误 InvalidAc
  • PHP 网址问题

    有没有办法可以使用 PHP 从链接中删除变量 例如 如果我有一个读取的链接http localhost link index php s 30 p 3我该如何去掉 s 30 p 3所以我的链接是这样的http localhost link
  • 如何将 URL 中的图像附加到 FormData - Javascript

    这是我的小 JavaScript 代码
  • Caffe:如何通过代码获取`solver.prototxt`参数?

    我想访问solver prototxt参数如base lr 基础学习率 或weight decay来自Python代码 有什么方法可以从solver net目的 谢谢 根据本教程 http nbviewer jupyter org gith
  • iOS 15 safari 工具栏现在在元素内滚动时隐藏

    在 iOS 15 上 无论您有顶部还是底部工具栏 在元素内滚动都会导致窗口调整大小 工具栏消失 在 iOS 14 上 只有当主体滚动时才会发生这种情况 请参阅下面的 gif 注意 黄色区域是一个带有溢出滚动的 div 并且主体不滚动 iOS
  • 使用 JavaScript 截断文本并附加省略号

    如何截断字符串并附加省略号 我想截断类似的东西 this is a very long string to this is a ve function truncate input if input length gt 5 return i
  • 检查 Activity 是否正在从 Service 运行

    怎样才能一个Service检查其应用程序之一是否Activity正在前台运行 使用以下方法和您的包名称 如果您的任何活动位于前台 它将返回 true public boolean isForeground String myPackage
  • urlopen() gbk 页面时 Python 中的编码问题

    我的代码在这里 coding utf 8 if name main from urllib2 import urlopen url http iccna blog sohu com 164572951 html data urlopen u
  • java中pdf解析为文本

    我有一个阿拉伯语 PDF 我想使用 Java 将其解析为文本文档 我已经尝试了很多次 英语单词解析成功 但阿拉伯语单词解析失败 谁能推荐一个可以正确转换阿拉伯语单词的解决方案 我想到了几个图书馆 阿帕奇蒂卡 http tika apache
  • onChange 是一个延迟字符 - Hooks

    我是 React 和 Hooks 的新手 我创建了一个简单的搜索栏 用户可以在其中输入一些文本 然而 如果我console log之后的状态onChange 它总是落后一个字符 例如 如果我输入 披萨 console log鞋子 披萨 我的