我想更改hasSubmit键的值,就像第一个代码部分一样.我知道这是不推荐的.但是第二段代码是异步的,我不想使用setState的回调函数.

  • this.statesetState的区别是什么?
  • 有没有办法立即更改状态值hasSubmit

第一个代码:

this.state.hasSubmit = false
this.setState({})
//Code that will use `hasSubmit`.

第二个代码:

this.setState({
   hasSubmit: false,
});
//Code that will use `hasSubmit`.

ADD:

情况是:

  1. hasSubmitgetInitialState()false.
  2. 当我点击submit按钮时,hasSubmit将变为false.
  3. 提交时,hasSubmit将更改为true.

第一次单击submit没有问题,hasSubmit将被设置为true.

但是第二次点击submit将错误地使用Second asynchronous code,因为hasSubmit仍然是true,而First Code可以解决问题.

推荐答案

以下是React docs人所说的:

千万不要直接Mutations this.state,因为之后调用setState()可能会替换你所做的Mutations .治疗这个.把它说成是不变的.

setState()不会立即改变这一点.创建一个挂起状态,但创建一个挂起状态.调用此方法后访问this.state可能会返回现有值.

无法保证对setState调用的同步操作,并且可能会对调用进行批处理以提高性能.

如果正在使用可变对象,且逻辑无法在shouldComponentUpdate()中实现,则仅当新状态与前一状态不同时调用setState()将避免不必要的重新渲染.

按照设计的方式使用API总是明智的.如果doctor 说不要改变你的状态,那么你最好不要改变你的状态.

虽然setState()在技术上可能是异步的,但它肯定不会以任何明显的方式变慢.组件的render()函数将在很短的时间内被调用.

直接设置状态的一个缺点是React的生命周期方法(shouldComponentUpdate()componentWillUpdate()componentDidUpdate())依赖于setState()调用的状态转换.如果直接更改状态并使用空对象调用setState(),则无法再实现这些方法.

另一个原因是,这只是糟糕的编程风格.你在两个陈述中所做的是你在一个陈述中所能做的.

此外,这里没有实际的好处.在这两种情况下,在调用setState()(或forceUpdate())之后才会触发render().

你声称需要这样做,却没有真正解释那是什么需要.也许你想更详细地描述一下你的问题.也许有更好的解决办法.

最好与框架合作,而不是与之对抗.

使现代化

以下 comments :

需要的是,我想使用下面更改的hasSubmit.

好吧,我现在明白了.如果需要立即使用future state属性,最好将其存储在局部变量中.

const hasSubmit = false;

this.setState({
  hasSubmit: hasSubmit
});

if (hasSubmit) { 
  // Code that will use `hasSubmit` ...

Reactjs相关问答推荐

如何在react组件中使用formik进行验证

利用OVERPASS API端点计算某建筑的表面积

在Reaction常量函数中未更新状态变量

如何在React中正确地将密码输入类型切换为文本或反之亦然(下一页)

在Reaction中管理多个状态

当项目开始时,它不会从三元运算符(REACT)加载一些tailwind 类名称

Github 操作失败:发布 NPM 包

React-chartjs-2:红色和绿色之间的差距

我如何使用 React toastify (Promise) toast 和邮箱 js

Next.js 和理智 | npm run build 时预渲染页面/时发生错误

如何修改 react/jsx-no-useless-fragment 规则以允许 <>{children}

VideoSDK api 不使用更新状态

FlatList 不在 React Native 中呈现项目

我收到Uncaught TypeError: props.handleSelect is not a function

虽然通过了身份认证,但并没有导航到请求的页面

DatePicker MUI 如何在日历左侧显示清除文本

添加新行时自动打开可扩展表格(Antd 表格,ReactJS)

如果传递给挂钩的数据需要事先修改,如何使用自定义挂钩?

如何解决在 react.js 中找不到模块错误

如何使用 React Router 在 React 中正确同步 useEffect 和 useLocation 挂钩?