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

React 16 setState 返回 null 的妙用

概述 React 16 为了防止不必要的 DOM 更新,允许你决定是否让 .setState 更来新状态调用 .setState 时返回 null 将不再触发更新。...React 16 对状态性能进行了改进,如果新的状态值与其现有值相同的话,通过 setState 返回 null 来防止来触发更新。 ?...5 }) 6} 因为我们需要基于之前的状态检查和设置状态,而不是传递 setState 和 object,所以我们需要传递一个以前的状态作为参数的函数。...我在下面的两个 GIF 突出显示了 React DevTools 的更新: ? 没有从 setState 返回 null ?...总结 本文介绍了 React 16 怎样从 setState 返回 null。我在下面的 CodeSandbox 添加了 mocktail 选择程序的完整代码,供你使用和 fork。

14.4K20
您找到你想要的搜索结果了吗?
是的
没有找到

React-setState函数必须掌握的pendingState状态

查询对应源码内容觉得比较难以理解所以在下方以一个简单Demo记录下setState不同状态下对应实现原理。...// 为了方便阅读 我将相关方法都简化了这个文件 let isBatchingUpdate = true; // 默认页面未渲染过,react批量异步更新 function transcation(...react内部其实实现原理也是这样,第一次页面渲染前(调用过一次render方法之后)关于setState(obj)的写法都是异步缓存更新的。...但是一旦页面渲染之后,内部pendingState状态改变。此时每次通过setState(obj)更新,每次都会触发单独更新直接更新而不会异步更新。...setState(obj) 首先当我们react内部使用setState(obj)进行调用的时候,如果是第一次render之前,那么所有的修改都会被缓存到pendingState,之后render

1.2K10

React源码分析与实现(二):状态、属性更新 -> setState

React源码分析与实现(二):状态、属性更新 -> setState 原文链接地址:https://github.com/Nealyang 转载请注明出处 状态更新 此次分析setState基于0.3..._pendingState || this.state, partialState)); }, 注释部分说的很明确,setState后我们不能够立即拿到我们设置的值。...IMAGE 所以以上结果我们可以看出,componentWillMount生命周期内setState后this.state不会改变,componentDidMount是正常的。...因为在上一篇文章我们也有说到,mountComponent过程,会把compositeLifeCycleState设置为MOUNTING状态,在这个过程,是不会执行receivePropsAndState...的,所以this.state也就不会更新,同理,receivePropsAndState的过程,会把compositeLifeCycleState置成RECEIVING_PROPS状态,也不会执行state

1.2K40

reactsetState是同步还是异步的

我们都知道,React框架是由数据来驱动视图变化的,基于状态的管理实现对组件的管理,也就是组件当中的state,通过setState方法来修改当前组件的state,以达到视图的变化。...大部分情况下我们写setState会直接将需要修改的状态当做参数传入,其实setStae的参数是这样的: setState(nextState,callback); setState 官方文档中介绍...这是事件处理函数和服务器请求回调函数触发 UI 更新的主要方法。不保证 setState 调用会同步执行,考虑到性能问题,可能会对多次调用作批处理。...setState批量更新节点 ReactsetState函数实现,会根据一个变量 isBatchingUpdate 来判断是直接同步更新this.state还是放到队列异步更新 。...综上来说我们可以简单理解为,在当前的生命周期中,setState为异步批量更新,异步函数,执行的是同步更新的方式。

1.2K20

ReactsetState是异步的吗?

React更新状态,一般的写法都是this.setState({a:1}),而非Vue那样this.a = 1。...其实,这只是React的障眼法。 setState是同步执行的!但是state并不一定会同步更新(异步更新和同步更新都存在) 1....React.setState()的异步更新 setState()中有个特别重要的布尔属性isBatchingUpdates(默认为false,),它决定了state是同步更新还是异步更新。...调用栈如下(涉及到React事务机制,可以参考文章《React进阶篇(四)事务》): ? setState调用.png setState合成事件和钩子函数是“异步更新”的。...React.setState()的同步更新 当然,也是有办法同步获取state更新后的值: setTimeout等异步操作调用setState函数 DOM原生事件 利用setState回调函数 函数式

2.1K10

ReactsetState的同步异步与合并

前言 这篇文章主要是因为自己在学习ReactsetState的时候,产生了一些疑惑,所以进行了一定量的收集资料和学习,并在此记录下来 引入 使用过React的应该都知道,React,一个组件要读取当前状态需要访问...this.state,但是更新状态却需要使用this.setState,不是直接在this.state上修改,就比如这样: //读取状态 const count = this.state.count;...//更新状态 this.setState({count: count + 1}); //无意义的修改 this.state.count = count + 1; 同步和异步 开发我们并不能直接通过修改...的Object.defineProperty或者Vue3的Proxy的方式来监听数据的变化; 我们必须通过setState来告知React数据已经发生了变化; 疑惑:组件并没有实现setState...其实分成两种情况: 组件生命周期或React合成事件setState是异步; setTimeout或者原生dom事件setState是同步; 验证一:setTimeout的更新: changeText

92120

ReactsetState的同步异步与合并

原理图 图片 原理可以用这张图来描述,即在reactsetState通过一个队列机制实现state的更新。...2.判断当前React是否处于批量更新状态,如果是,将当前组件加入待更新的组件队列。...3.如果未处于批量更新状态,将批量更新状态标识设置为true,用事务再次调用前一步方法,保证当前组件加入到了待更新组件队列。 4.调用事务的waper方法,遍历待更新组件队列依次执行更新。...总结 1.钩子函数和合成事件react的生命周期和合成事件react仍然处于他的更新机制,这时isBranchUpdate为true。...也就是前言中的那题的来源 2.异步函数和原生事件 由执行机制看,setState本身并不是异步的,而是如果在调用setState时,如果react正处于更新过程,当前更新会被暂存,等上一次更新执行后执行

1.4K30

React State(状态): React通过this.state来访问state,通过this.setState()方法来更新stateReact State(状态)

React State(状态) React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。...如果将this.state赋值给一个新的对象引用,那么其他不在对象上的state将不会被放入状态队列,当下次调用setState并对状态队列进行合并时,直接造成了state丢失。...React也正是利用状态队列机制实现了setState的异步更新,避免频繁地重复更新state(pending的意思是未定的,即将发生的) //将新的state合并到状态更新队列 var...那么事务和setState方法的不同表现有什么关系,首先我们把4次setState简单归类,前两次属于一类,因为它们同一调用栈执行,setTimeout的两次setState属于另一类。...setState调用之前,已经处在batchedUpdates执行的事务中了。

1.9K30

ReactsetState为什么是异步的?

前言不知道大家有没有过这个疑问,React setState() 为什么是异步的?...(); // 父组件做同样的事需要指出的是, React 应用这是一个很常见的重构,几乎每天都会发生。...所以为了解决这样的问题, React this.state 和 this.props 都是异步更新的,在上面的例子重构前跟重构后都会打印出 0。这会让状态提升更安全。...假设你一个聊天窗口,你正在输入消息,TextBox 组件setState() 调用需要被立即应用。然而,在你输入过程又收到了一条新消息。...此外,等待过程,旧的页面依然可以交互,但是如果花费的时间比较长,你必须展示一个加载动画。事实证明,现在的 React 模型基础上做一些生命周期调整,真的可以实现这种设想。

1.4K30

React 的useState 和 setState 的执行机制

React 的useState 和 setState 的执行机制 useState 和 setState React开发过程 使用很频繁,但很多人都停留在简单的使用阶段,并没有正在了解它们的执行机制...「批量更新优化」也是建立“异步”(合成事件、钩子函数)之上的,原生事件和setTimeout、Promise.resolve().then 不会批量更新,“异步”如果对同一个值进行多次修改,批量更新策略会对其进行覆盖...假如在一个「合成事件」,循环调用了setState方法n次,如果 React 没有优化,当前组件就要被渲染n次,这对性能来说是很大的浪费。...所以,React 为了性能原因,对调用多次setState方法合并为一个来执行。当执行setState的时候,state的数据并不会马上更新。 光怎么说肯定不容易理解,我们来通过几个案例来说明吧。...我 state 里面设置一个对象好不好?

2.9K20

ReactsetState的同步异步与合并(2)

产生影响的; 源码其实是有对 原对象 和 新对象进行合并的: setState本身的合并 this.setState会通过引发一次组件的更新过程来引发重新绘制。...也就是说setState的调用会引起React的更新生命周期的四个函数的依次调用: shouldComponentUpdate componentWillUpdate rende componentDidUpdate...我们都知道,React生命周期函数里,以render函数为界,无论是挂载过程和更新过程,render之前的几个生命周期函数,this.state和Props都是不会发生更新的,直到render函数执行完毕后...React的官方文档有提到过这么一句话: 状态更新会合并(也就是说多次setstate函数调用产生的效果会合并)。...: false时才会调用 // 但一般来说,处于react大事务时,会在render的_renderNewRootComponent中将其设置为true。

61030

从源码的角度再看 React JS setState

在上一篇手记「深入理解 React JS setState,我们简单地理解了 React setState “诡异”表现的原因。...React setState 更新逻辑代码 更新逻辑的部分,可以看到 React 会通过 判断当前的逻辑状态下是否需要进行批量更新。...React 将整个的函数执行过程包裹上了 Transaction,函数执行前与执行后分别有 和 两个方法。...这样的话 React 就有时机函数执行过程,涉及到 setState 的执行,都将缓存下来, 的时候进入到 React 的 state 更新逻辑进行更新判断操作,并最终更新到前台的 DOM 上。...Vue.js 也有类似的设计逻辑,后续如果有时间我们将继续进行相关讨论。 下一篇文章,我们继续来看 React 底层是如何进行 的设计以及更新状态的转换的。

2.1K100

总结:React 的 state 状态

换言之,props 是对外的,state 是对内的 props:只读,父组件通过 props 传递给子组件其所需要的状态;子组件内部不能直接修改props,只能在父组件修改。...本篇会 ✓ 总结 React 的 state 状态 回顾一下1: ① react 有两种原因会导致组件的渲染,其中 State setter 函数 更新变量会触发 React 渲染组件; ②...赋值 map(例子) 排序 reverse,sort 先将数组复制一份(例子) 批量更新 开篇:通过 state 阐述 React 渲染 setInterval 示例中曾提及:一个 state...React 会等到事件处理函数的 所有 代码都运行完毕再处理你的 state 更新。...触发重新渲染 对于初次渲染, React 会使用 appendChild() DOM API 将其创建的所有 DOM 节点放在屏幕上。 对于重渲染, React 将应用最少的必要操作(渲染时计算!)

3000
领券