- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 React 应用程序中使用 redux,其中使用 ChartJS 库来制作图表。我注意到有时当我从全局 redux 状态获取数组时,它会像这样:
ejeY: Array(7)
0: 43783
1: 85001
2: 100960
3: 75271
4: 22117
5: 27542
6: 0
length: 7
pop: ƒ ()
push: ƒ ()
shift: ƒ ()
splice: ƒ ()
unshift: ƒ ()
_chartjs: {listeners: Array(1)}
__proto__: Array(0)
__proto__: Object
它具有数组原型(prototype),对应于可以应用于数组的方法,但在数组原型(prototype)之外,它还有另一种方法。当数组像这样,并且我想使用某种方法更改数组或使用数组作为值更改组件的状态时,它会更改 redux 状态而不分派(dispatch) redux 操作。假设 redux 属性是只读的,但这会在不分派(dispatch)操作的情况下更改 redux 状态。例如,我使用此方法对两个数组进行排序:
sortMaxToMinEjeX: (array1, array2) => {
var list = [];
for (var j = 0; j < array2.length; j++)
list.push({ 'elemento1': array1[j], 'elemento2': array2[j] });
list.sort((a, b) => {
return ((a.elemento1 > b.elemento1) ? -1 : ((a.elemento1 === b.elemento1) ? 0 : 1));
});
for (var k = 0; k < list.length; k++) {
array1[k] = list[k].elemento1;
array2[k] = list[k].elemento2;
}
return { ejeY: Object.values(array2), ejeX: Object.values(array1) }
}
然后我使用新的排序数组来更改 react 组件 Prop ,克隆组件并使用新的排序数组作为 Prop :
cambiarGrafica: ({ labels, datasets }) => {
console.log(labels, datasets);
const { graficas, indice } = this.state;
let nuevasGraficas = graficas.filter((componente, index) => index !== indice);
let graficaSeleccionada;
if (datasets) {
graficaSeleccionada = React.cloneElement(graficas[indice], { labels, datasets });
} else {
graficaSeleccionada = React.cloneElement(graficas[indice], { labels });
}
nuevasGraficas.splice(indice, 0, graficaSeleccionada);
this.setState({ graficas: Object.values(nuevasGraficas) });
}
在 cambiarGraficas
方法中设置状态之前,redux 状态不会改变,因为它应该是这样,但是当我将 graficas
的状态设置为新数组时具有新 props 的组件,当它更改 redux 状态而不分派(dispatch)操作时,这是不应该发生的事情。为什么会发生这种情况以及如何避免这种情况?为什么数组采用这种格式?
最佳答案
看起来,您复制了指针并更改了您不想做的事情的值。当你做类似的事情时:
list.push({ 'elemento1': array1[j], 'elemento2': array2[j] });
进入elemento1
,您将获得array1[j]
中项目的指针这意味着当您稍后获取此列表并对其执行某些操作时,您基本上会更改数组 1 的原始数据源。
当您使用React.cloneElement
时也会发生同样的情况。它创建一个浅拷贝:
"Clone and return a new React element using element as the starting point. The resulting element will have the original element’s props with the new props merged in shallowly"
https://reactjs.org/docs/react-api.html#cloneelement
对于您的解决方案,我在此处链接您: https://medium.com/@gamshan001/javascript-deep-copy-for-array-and-object-97e3d4bc401a在这里你可以看到深拷贝和浅拷贝的区别。
在复制函数的入口处,您可以使用Array.from()
For array we will use ‘Array.from()’. The Array.from() method creates a new Array instance from an array-like or iterable object.
使用浅拷贝更改真实数据可能会带来很多麻烦,使用 redux 也是如此。
关于javascript - 具有改变 redux 状态的原型(prototype)的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57527421/
好吧,我怀疑这是一个独特的情况,所以要么有人这样做了,要么有人认为这是不可能的,至少以我所要求的方式。 我有 2 个原型(prototype)变量(函数),一个是父变量,另一个是助手。我想做的是从助手
这是 JavaScript 大师的问题。我正在尝试更优雅地使用 JavaScript 原型(prototype)模型。这是我的实用程序代码(它提供了真实的原型(prototype)链并正确使用 ins
我们知道在 JavaScript 中有一个用于数组的 .forEach() 方法。但是字符串没有内置该方法。 那么,下面的代码片段有没有问题:String.prototype.forEach = Ar
我们知道在 JavaScript 中有一个用于数组的 .forEach() 方法。但是字符串没有内置该方法。 那么,下面的代码片段有没有问题:String.prototype.forEach = Ar
我看到了两种不同的模式和解释。来自 DailyJS 和许多其他人的一篇:矩形.prototype = new Shape(); 然后是 Crockford 的 here 这意味着只是 矩形.proto
尝试在 Object.prototype 以及 String.prototype 和 Number.prototype 上定义一个 hashCode 方法>。我正在使用以下方法定义原型(prototy
在本教程中,您将借助示例了解 JavaScript 中的原型。 在学习原型之前,请务必查看以下教程: JavaScript 对象 JavaScript 构造函数 如您所知,您可以使用对象构造函
当构造新对象时,该对象被设置为委托(delegate)任何尚未显式设置为其构造函数原型(prototype)的属性。这意味着我们可以稍后更改原型(prototype),并且仍然可以看到实例中的更改。
我正在努力获得更好的 JavaScript 实用知识。所以,我买了 Douglas Crockford 的书“JavaScript the good parts”。 我现在很难掌握原型(prototy
我的理解是相同类型的所有对象将共享相同的原型(prototype)。因此对原型(prototype)的更改将反射(reflect)在每个对象上。但是值类型的属性似乎不是这样。这种属性是如何存储的? f
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: JavaScript: Class.method vs. Class.prototype.method 创建
为什么在 MDN 函数中 polyfills 使用“if (!Array.prototype.filter)”? if (!Array.prototype.filter) { Array.prot
这个问题已经有答案了: Assigning prototype methods *inside* the constructor function - why not? (6 个回答) 已关闭 7 年
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
面向对象有一个特征是继承,即重用某个已有类的代码,在其基础上建立新的类,而无需重新编写对应的属性和方法,继承之后拿来即用; 。 在其他的面向对象编程语言比如Java中,通常是指,子类继承父类的属性和
OOP 中原型(prototype)设计模式最重要的部分之一是我们不会从头开始创建新对象,我们只是使用 clone() 函数从现有对象克隆它们。 那么clone()函数是深拷贝还是浅拷贝? 如果它是一
在进行原型(prototype)设计时,您在多大程度上放弃了最佳实践来支持代码和修复黑客攻击?当然,代码并不打算在完整的生产环境中保留。 补充:我正在研究一个用 Python 制作的相当大的半工作原型
我开始学习设计模式。我知道原型(prototype)是用来制作我已经拥有的对象的精确副本,而享元是用来制作类似的对象。 我已经编写了 2D 平台游戏,例如马里奥(Java)。有很多相同的敌人,唯一的区
我正在使用 Maven 生成原型(prototype)。我能够使原型(prototype)生成正常,并且它生成的项目模板按预期工作。唯一的问题是在我的 shell 脚本中。脚本中注释掉的任何内容都会被
我想用 primefaces 配置一个 Java EE 项目。我在某处读到可以使用 mvn arechetype:generate 创建项目结构。当我使用它时,我只看到了 41 个选项,而在该教程中,
我是一名优秀的程序员,十分优秀!