当前位置:首页 > 前端开发 > 正文内容

为什么 useState 屡次更新不收效?

邻居的猫1个月前 (12-09)前端开发1113

问题

在编写 React 代码时,假如你期望屡次更新状况,可能会测验运用 handleClickWrong 中的方法。但是,你会发现实际效果并不如预期:count 只增加了 1,而不是 3。

const root = document.getElementById('root');

const App = () => {
  return (
    <div>
      <h1>Hello World</h1>
      <Counter />
    </div>
  );
};

const Counter = () => {
  const [count, setCount] = React.useState(0);

  const handleClickWrong = () => {
    setCount(count + 1);
    setCount(count + 1);
    setCount(count + 1);
  };

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={handleClickWrong}>Increment</button>
    </div>
  );
};

const rootElement = ReactDOM.createRoot(root);
rootElement.render(<App />);

为什么会呈现这种状况呢?要弄清楚这个问题,咱们需求了解 React 怎么处理状况更新的细节。

React 内部状况更新机制

React 运用了一个内部机制来处理状况更新。咱们能够经过以下源码片段了解这背面的完成:

// React 源码中的根本状况处理器
function basicStateReducer(state, action) {
  // $FlowFixMe: Flow doesn't like mixed types
  return typeof action === 'function' ? action(state) : action;
}

在咱们运用 handleClickWrong 的状况下,React 会依照以下方法处理状况更新:

// 假定初始状况为 0,咱们传递的值是 1
newState = basicStateReducer(0, 1);

因为 basicStateReducer 接收到的 action 不是函数,它会直接回来这个值作为最新状况。因而,newState 会被更新为 1。

回到 handleClickWrong 的比如:

const handleClickWrong = () => {
  setCount(count + 1); // = basicStateReducer(0, 1) => 1
  setCount(count + 1); // = basicStateReducer(0, 1) => 1
  setCount(count + 1); // = basicStateReducer(0, 1) => 1
};

因为 count 在当时 Counter 函数的效果域内,三次 setCount 调用的值都是 count + 1。因而,即便调用了屡次 setCount,因为 React 只处理了最新的 count 值,成果每次都将状况更新为 1。终究烘托时,count 仍然只要 1。

处理方案

了解了原因后,咱们能够改用函数方式的更新来处理这个问题。注意到 basicStateReducer 会查看传入的 action,假如是函数,React 会用当时内部存储的状况作为参数传给这个函数。这样,咱们能够根据最新的状况进行更新。

const handleClick = () => {
  setCount((prevCount) => prevCount + 1); // = basicStateReducer(0, (prevCount) => prevCount + 1) => 0 + 1 => 1
  setCount((prevCount) => prevCount + 1); // = basicStateReducer(1, (prevCount) => prevCount + 1) => 1 + 1 => 2
  setCount((prevCount) => prevCount + 1); // = basicStateReducer(2, (prevCount) => prevCount + 1) => 2 + 1 => 3
};

经过运用函数方式的更新,咱们能够保证每次状况更新都根据前一个状况,然后完成预期的成果。

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=445

标签: React
分享给朋友:

“为什么 useState 屡次更新不收效?” 的相关文章

xampp下载

xampp下载

试验介绍: XAMPP也便是集apache (web服务器软件),mysql (数据库) php (开源通用脚本语言),PERL (计算机程序语言)的集成软件包 一:下载xampp 官网:https://www.apachefriends.org/index.html 在里面按系统选版别 简略看一下...

html多行文本框

html多行文本框

HTML多行文本框:提升网页交互体验的关键元素在网页设计中,多行文本框是一个不可或缺的元素,它允许用户输入大量的文本信息,如文章、评论、反馈等。HTML多行文本框不仅能够提升网页的交互性,还能为用户提供更加便捷的输入体验。本文将详细介绍HTML多行文本框的使用方法、属性设置以及在实际应用中的技巧。...

vue背景图片,背景图片的基本设置

在 Vue 中设置背景图片有几种常见的方法,下面我将逐一介绍:```vue .backgroundimage { backgroundimage: url; backgroundsize: cover; backgroundposition: center; backgroun...

css定位居中,cssd是什么意思

css定位居中,cssd是什么意思

CSS定位居中可以通过多种方法实现,以下是几种常见的方式:1. 使用Flexbox布局: Flexbox是一种非常强大的布局工具,可以轻松实现水平和垂直居中。 ```css .container { display: flex; justifycontent: cente...

css布局框架,什么是CSS布局框架

css布局框架,什么是CSS布局框架

CSS布局框架是用于简化CSS开发过程的一组预定义的CSS类和样式。它们提供了一种快速构建响应式、网格布局和组件的方法,无需从头开始编写所有的CSS代码。这些框架通常包含一系列的CSS规则,用于创建列、行、容器、导航、表单等元素,以及处理不同的屏幕尺寸和设备。一些流行的CSS布局框架包括:1. Bo...

vue导航栏, 导航栏的重要性

vue导航栏, 导航栏的重要性

Vue导航栏:构建高效且响应式的用户界面在Web开发中,导航栏是用户与网站交互的第一步,它不仅提供了访问网站不同部分的入口,还影响了用户体验的整体质量。Vue.js,作为一款流行的前端框架,提供了强大的工具来创建动态和响应式的导航栏。本文将深入探讨如何在Vue项目中实现一个高效且响应式的导航栏。...