首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用react-hooks在事件监听中state不更新问题

2021-04-21 16:56:43 在使用react开发网站时,使用事件监听是常有的事情,但是有时候你会发现一个问题,就是这个state有时候不更新,始终是一个值,让人很是费解。...所获得的count值显然是从外围作用域对象obj上找到的, 而obj的count属性是const修饰的,它不可能在App内发生改变的,因此打印的始终是1(这就是我们经常出现异常的地方,发现count没能更新...另一种state不生效的场景 另一中state不生效的场景其本质也是闭包,也是由于useEffect的第二个参数为[]引起的,不知道大家遇到过没有,个人初次遇到时很是懵逼。...需要在初次生成组件时生成编辑器对象,而且只在初次时生成,内部需要在内容修改是调用父组件的onChange事件,为了简化使用上面的例子也能看出效果。...从上面的例子中我们可以发现执行后count也是不会发生变化的,其根本原因也是在于useEffect的闭包,解决方案和签名相同,在这里说一下只是想提醒大家在遇到此类问题时一脸懵逼。

7.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    React 源码深度解读(九):单个元素更新

    本系列文章基于 React 15.4.2 ,以下是本系列其它文章的传送门: React 源码深度解读(一):首次 DOM 元素渲染 - Part 1 React 源码深度解读(二):首次 DOM 元素渲染...- Part 2 React 源码深度解读(三):首次 DOM 元素渲染 - Part 3 React 源码深度解读(四):首次自定义组件渲染 - Part 1 React 源码深度解读(五):首次自定义组件渲染...):单个元素更新 React 源码深度解读(十):Diff 算法详解 正文 在前面的系列文章里,已经对 React 的首次渲染和 事务(transaction)作了比较详细的介绍,接下来终于讲到它最核心的一个方法...在实际开发过程中,如果需要基于之前的 state 值连续进行运算的话,如果直接通过对象去 setState 往往得到的结果是错误的,看以下例子: // this.state.count = 0 this.setState...原因很简单,因为 3 次 setState 的时候,取到的this.state.count都是 0 (state 在 set 完后不会同步更新)。

    63510

    React中传入组件的props改变时更新组件的几种实现方法

    我们使用react的时候常常需要在一个组件传入的props更新时重新渲染该组件,常用的方法是在componentWillReceiveProps中将新的props更新到组件的state中(这种state...现在点击‘编辑’和‘新建’按钮,输入框中的文字并不会切换,因为点击‘编辑’和‘更新’时,虽然UserInput的props改变了但是并没有触发state的更新。...所以需要实现props改变引发state更新,在UserInput中增加代码: componentWillReceiveProps(nextProps) { this.setState({...{ user: props.user }; } 这样就实现了UserInput每次接收新的props的时候自动更新state。...发生改变时,我们可以通过传入一个不一样的key来重新创建一个component的实例来实现页面的更新。

    5.2K30

    2022react高频面试题有哪些

    在 HTML 中,表单元素如 、和通常维护自己的状态,并根据用户输入进行更新。当用户提交表单时,来自上述元素的值将随表单一起发送。...函数中间件的主要目的就是修改dispatch函数,返回经过中间件处理的新的dispatch函数redux使用:实际就是再次调用循环遍历调用reducer函数,更新state使用 React Hooks...Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props。可以把context当做是特定一个组件树内共享的store,用来做数据传递。...;componentWillReceiveProps:在初始化render的时候不会执行,它会在组件接受到新的状态(Props)时被触发,一般用于父组件状态更新时子组件的重新渲染shouldComponentUpdate...在 React Diff 算法中 React 会借助元素的 Key 值来判断该元素是新近创建的还是被移动而来的元素,从而减少不必要的元素重渲染。

    4.5K40

    83.精读《React16 新特性》

    当组件比较庞大,更新操作耗时较长时,就会导致浏览器唯一的主线程都是执行组件更新操作,而无法响应用户的输入或动画的渲染,很影响用户体验。...,这个回调函数返回的是真正渲染子组件的元素; 针对普通场景来说,react-call-return 有点过度设计的感觉,但是如果针对一些特定场景的话,它的作用还是非常明显,比如,在渲染瀑布流布局时,利用...来更新 state。...为了配合未来的 React 异步渲染机制,React v16.4 对 getDerivedStateFromProps 做了一些改变, 使其不仅在 props 更新时会被调用,setState 时也会被触发...Suspense 作用是在等待组件时 suspend(暂停)渲染,并显示加载标识。

    79340

    浅析 5 种 React 组件设计模式

    适用场景: 动态表单元素: 在需要动态添加或删除表单元素的情况下,受控组件模式可以很容易地实现。通过使用数组来保存表单元素的状态,可以动态渲染和更新表单。...模态框控制: 当需要通过 props 控制模态框的显示或隐藏状态时,可以使用受控组件模式。 3. 自定义 Hooks 模式 自定义Hooks模式是一种将组件逻辑提取为可重用的函数的方法。...适用场景: 数据过滤: 在一个数据展示组件中,通过 Props Getters 模式可以将数据过滤逻辑提取出来,允许外部根据特定条件获取过滤后的数据。...State Reducer 模式 State Reducer 模式是一种通过将组件的状态更新逻辑委托给一个函数,实现更灵活的状态管理方式。这种模式通常在处理复杂的状态逻辑时非常有用。...异步状态更新: 当需要进行异步状态更新时,State Reducer 模式可以帮助处理异步回调,以确保状态正确更新。

    58910

    使用 yum update 在CentOS下更新时保留特定版本的软件

    有时需要保留特定版本的软件不升级,但升级其他软件,这时就需求用到下面的技巧。当CentOS/RHEL/Fedora下的Linux服务器使用 yum update 时命令如何排除选定的包呢?...您需要放置exclude指令来定义要更新或安装中排除的包列表。这应该是一个空格分隔的列表。允许使用通配符*和?)。 当我使用yum update时,如何排除php和内核包?...打开/etc/yum.conf文件,输入: vi /etc/yum.conf 在[main]部分下面添加以下行,输入: exclude=php* kernel* 最后,它应如下所示: [ main ]...这里: all:禁用所有排除 main:禁用yum.conf中[main]中定义的排除 repoid:禁用为给定repo id定义的排除 yum -exclude 命令行选项 最后,您可以使用以下语法在命令行上跳过...yum命令更新: 注意:上述语法将按名称排除特定包,或者从所有存储库的更新中排除。

    2.5K00

    【面试题】412- 35 道必须清楚的 React 面试题

    主题: React 难度: ⭐⭐⭐ 在 HTML 中,表单元素如 、和通常维护自己的状态,并根据用户输入进行更新。...当用户提交表单时,来自上述元素的值将随表单一起发送。 而 React 的工作方式则不同。...包含表单的组件将跟踪其状态中的输入值,并在每次回调函数(例如onChange)触发时重新渲染组件,因为状态被更新。以这种方式由 React 控制其值的输入表单元素称为受控组件。...componentWillReceiveProps:在初始化render的时候不会执行,它会在组件接受到新的状态(Props)时被触发,一般用于父组件状态更新时子组件的重新渲染 shouldComponentUpdate...在使用ES6类时,应该在构造函数中初始化state,并在使用React.createClass时定义getInitialState方法。

    4.3K30

    常见react面试题(持续更新中)

    但在 React 中会有些不同,包含表单元素的组件将会在 state 中追踪输入的值,并且每次调用回调函数时,如 onChange 会更新 state,重新渲染组件。...使用好处: 在这个生命周期中,可以在子组件的render函数执行前获取新的props,从而更新子组件自己的state。...componentWillReceiveProps在初始化render的时候不会执行,它会在Component接受到新的状态(Props)时被触发,一般用于父组件状态更新时子组件的重新渲染。...Hooks 的设计初衷是为了改进 React 组件的开发模式。在旧有的开发模式下遇到了三个问题。组件之间难以复用状态逻辑。过去常见的解决方案是高阶组件、render props 及状态管理框架。...元素element可以在它的属性props中包含其他元素(译注:用于形成元素树)。创建一个React元素element成本很低。元素element创建之后是不可变的。

    2.6K20

    面试官最喜欢问的几个react相关问题

    setState(fn),在fn中返回新的state对象即可,例如this.setState((state, props) => newState);使用函数式,可以用于避免setState的批量更新的逻辑...中解绑事件;在componentDidMount中进行数据的请求,而不是在componentWillMount;需要根据 props 更新 state 时,使用getDerivedStateFromProps...state、 各种组件生命周期钩子等,但是在函数定义中,我们却无能为力,因此 React 16.8 版本推出了一个新功能 (React Hooks),通过它,可以更好的在函数定义组件中使用 React...如下所示, username没有存储在DOM元素内,而是存储在组件的状态中。每次要更新 username时,就要调用 setState更新状态;每次要获取 username的值,就要获取组件状态值。...表单如何呈现由表单元素自身决定。如下所示,表单的值并没有存储在组件的状态中,而是存储在表单元素中,当要修改表单数据时,直接输入表单即可。有时也可以获取元素,再手动修改它的值。

    4K20

    React Hooks踩坑分享

    我们的事件处理程序应该有一个特定的props和state。 然而在类组件中,我们通过this.state读取的数据并不能保证其是一个特定的state。...handleClick事件处理程序并没有与任何一个特定的渲染绑定在一起。 从上面的例子,我们可以看出React Hooks在某一个特定渲染中state和props是与其相绑定的,然而类组件并不是。...所以在用这类API时我们要特别注意,在依赖数组内一定要填入依赖的props、state等值。...唯有在依赖数组中传入了num,React才会知道你依赖了num,在num的值改变时,需要更新函数。...(其实这些归根究底,就是React Hooks会形成闭包) 三、如何在React Hooks中获取数据 在我们用习惯了类组件模式,我们在用React Hooks中获取数据时,一般刚开始大家都会这么写吧:

    2.9K30

    美团前端一面必会react面试题4

    state 更新流程: 这个过程当中涉及的函数:shouldComponentUpdate: 当组件的 state 或 props 发生改变时,都会首先触发这个生命周期函数。...props 是不可修改的,所有 React 组件都必须像纯函数一样保护它们的 props 不被更改。state 是在组件中创建的,一般在 constructor中初始化 state。...方法更新state,就会触发视图的重新渲染,完成表单组件的更新受控组件缺陷: 表单元素的值都是由React组件进行管理,当有多个输入框,或者多个这种组件时,如果想同时获取到全部的值就必须每个都要编写事件处理函数...元素element可以在它的属性props中包含其他元素(译注:用于形成元素树)。创建一个React元素element成本很低。元素element创建之后是不可变的。...这样 React在更新DOM时就不需要考虑如何处理附着在DOM上的事件监听器,最终达到优化性能的目的。说说 React组件开发中关于作用域的常见问题。

    3K30

    35 道咱们必须要清楚的 React 面试题

    主题: React 难度: ⭐⭐⭐ 在 HTML 中,表单元素如 、和通常维护自己的状态,并根据用户输入进行更新。...当用户提交表单时,来自上述元素的值将随表单一起发送。 而 React 的工作方式则不同。...包含表单的组件将跟踪其状态中的输入值,并在每次回调函数(例如onChange)触发时重新渲染组件,因为状态被更新。以这种方式由 React 控制其值的输入表单元素称为受控组件。...问题 18:什么是 React Hooks? 主题: React 难度: ⭐⭐⭐ Hooks是 React 16.8 中的新添加内容。它们允许在不编写类的情况下使用state和其他 React 特性。...在使用ES6类时,应该在构造函数中初始化state,并在使用React.createClass时定义getInitialState方法。

    2.6K21

    年前端react面试打怪升级之路

    (1)受控组件 在使用表单来收集用户输入时,例如等元素都要绑定一个change事件,当表单的状态发生变化,就会触发onChange事件,更新组件的state...方法更新state,就会触发视图的重新渲染,完成表单组件的更新受控组件缺陷: 表单元素的值都是由React组件进行管理,当有多个输入框,或者多个这种组件时,如果想同时获取到全部的值就必须每个都要编写事件处理函数...(2)非受控组件 如果一个表单组件没有value props(单选和复选按钮对应的是checked props)时,就可以称为非受控组件。在非受控组件中,可以使用一个ref来从DOM获得表单值。...Hooks 的设计初衷是为了改进 React 组件的开发模式。在旧有的开发模式下遇到了三个问题。组件之间难以复用状态逻辑。过去常见的解决方案是高阶组件、render props 及状态管理框架。...props更新到相应的 state 上去。

    2.2K10

    React核心技术浅析

    这意味着当树上有1000个元素时, 需要10亿次比较, 显然远远不够高效.React在基于以下两个假设的基础上, 提出了一套复杂度为 O(n) 的启发式算法不同类型(即标签名、组件名)的元素会产生不同的树....同一类型的元素当元素的标签相同时, React保留此DOM节点, 仅对比和更新有改变的属性, 如className、title等, 然后递归对比其子节点.对于 style 属性, React会继续深入对比..., 仅更新有改变的属性, 如color、fontSize等.同一类型的组件当组件的props更新时, 组件实例保持不变, React调用组件的 componentWillReceiveProps() componentWillUpdate...表明本次更新的 wipFiber树 构建完成, 进入下一步的提交更新阶段.3.4 提交更新阶段在进入本阶段时, 新的Fiber树已构建完成, 需要进行替换、更新或删除的Fiber节点也在其 effectTag...props .除了更新真实DOM外, 在提交更新阶段还需要在特定阶段调用和处理生命周期方法、执行Hooks操作, 本文不再详述.在此参考了 pomb.us/build-your-… 中提供的 useState

    1.6K20

    前端二面react面试题整理

    什么是 React Hooks?Hooks是 React 16.8 中的新添加内容。它们允许在不编写类的情况下使用state和其他 React 特性。...HTML 元素为什么不直接更新 state 呢 ?...在 React中元素( element)和组件( component)有什么区别?简单地说,在 React中元素(虛拟DOM)描述了你在屏幕上看到的DOM元素。...componentWillReceiveProps:在初始化render的时候不会执行,它会在组件接受到新的状态(Props)时被触发,一般用于父组件状态更新时子组件的重新渲染shouldComponentUpdate...所以 diff 算法一定存在这样一个过程:触发更新 → 生成补丁 → 应用补丁。React 的 diff 算法,触发更新的时机主要在 state 变化与 hooks 调用之后。

    1.1K20
    领券