我正在做我的项目,我注意到当严格模式打开时,它会将两个相同的元素推入我的数组。当严格模式关闭时,它只将一个元素推入数组。有什么解释为什么会这样吗?
import {getRandomNumber} from './utils';
export function registerTicket() {
const newTicket = {
number: getRandomNumber(),
color: 'red',
}
this.setState((prevState) => {
prevState.tickets.push(newTicket);
return {
remainingTickets: --prevState.remainingTickets,
tickets: prevState.tickets,
}
})
}
这是我的状态。
this.state = {
winningNumber: getRandomNumber(),
remainingTickets: 5,
tickets: [],
finished: false
};
反应StrictMode会导致在开发过程中调用渲染函数两次,以识别意外的副作用
通过有意重复调用某些生命周期方法和React钩子,帮助暴露无意的副作用。setState
updater函数被调用两次。我将把深入的解释留给链接的问题。
检测意外的副作用
当您将新元素推入之前的tickets
状态时,以及当您预先减少remainingTickets
状态时,您无意中产生的副作用是之前的tickets
状态的状态突变。帽子戏法是你也不会返回一个新的tickets
array referece。
this.setState((prevState) => {
prevState.tickets.push(newTicket); // <-- mutation!!
return {
remainingTickets: --prevState.remainingTickets, // <-- mutation!!
tickets: prevState.tickets, // <-- same old array reference
}
})
解决方案是将以前的状态数组浅层复制到新的数组引用中,并附加新元素。
this.setState((prevState) => ({
remainingTickets: prevState.remainingTickets - 1,
tickets: [...prevState.tickets, newTicket],
}));
我有一个应用程序在这里呈现在严格模式和非严格模式。在非严格模式下工作正常,模型在onChange中更新,但在严格模式下不工作。有什么想法,为什么以及如何解决这个问题? https://stackblitz.com/edit/react-qvubmx 谢谢
除了正常的运行模式,JavaScript 还有第二种运行模式:严格模式(strict mode)。顾名思义,这种模式采用更加严格的 JavaScript 语法。 同样的代码,在正常模式和严格模式中,可能会有不一样的运行结果。一些在正常模式下可以运行的语句,在严格模式下将不能运行。 设计目的 早期的 JavaScript 语言有很多设计不合理的地方,但是为了兼容以前的代码,又不能改变老的语法,只能不
概述 进入标志 如何调用 语法和行为改变 全局变量显式声明 静态绑定 增强的安全措施 禁止删除变量 显式报错 重名错误 禁止八进制表示法 arguments对象的限制 函数必须声明在顶层 保留字 参考链接 概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:“严格模式”(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。 设立”严格模式“的
ECMAScript 5 最早引入了“严格模式”(strict mode)的概念。通过严格模式,可以在函数内部选择进行较为严格的全局或局部的错误条件检测。使用严格模式的好处是可以提早知道代码中存在的错误,及时捕获一些可能导致编程错误的ECMAScript 行为。 理解严格模式的规则非常重要,ECMAScript 的下一个版本将以严格模式为基础制定。支持严格模式的浏览器包括IE10+、Firefox
主要内容:什么是严格模式,启用严格模式,严格模式中的变化由于 JavaScript 语法不够严谨,一直被人们所诟病,例如在使用一个变量时,可以不使用 var 关键字来提前声明(例如: ),此时 JavaScript 解释器会自动为您创建这个变量。为了使代码更加严谨,JavaScript 中引入了严格模式,一旦使用了严格模式,将不再允许使用那些不严谨的语法。 什么是严格模式 严格模式是在 ECMAScript5(ES5)中引入的,在严格模式下,JavaS
要启用严格模式,只需在创建 Vuex store 的时候简单地传入 strict: true。 const store = new Vuex.Store({ // ... strict: true }) 在严格模式下,只要 Vuex 状态在 mutation 方法外被修改就会抛出错误。这确保了所有状态修改都会明确的被调试工具跟踪。 开发阶段 vs. 发布阶段 不要在发布阶段开启严格模式! 严格