React:如果值是按值传递的,那么为什么有必要拥有不可变的道具呢
React: Why is it necessary to have immutable props if values are passed as by value anyway?
我对JavaScript没有太深入的了解。因此做了这个修补:
var demo = 'test';
var obj = {
x: 'abc'
}
function foo(str) {
str += '_123';
return str;
}
var ret = foo(demo);
var retObj = foo(obj.x);
console.log('Result: %s', ret); // => 'test_123'
console.log('Used parameter: %s', demo); // 'test'
console.log('Result: %s', retObj); // 'abc_123'
// The value of the property is still unchanged. So
// it has been passed in as by value. As as copy.
console.log('Used parameter: %s', obj.x); // 'abc'
我将一个字符串传递给函数。一次作为基元变量,下一次作为对象属性。
之后原始数据保持不变。=>外部系统没有改变。
现在我想知道:
为什么它们在React中具有这些不变性?
我的意思是:他们说一个函数应该做一些事情并作为结果提供。但并没有改变整个体系。
但是,如果数据是按值传递的呢?为什么具有不变性会成为一件大事?
在这两个例子中,您都将一个字符串传递给函数。obj
是一个对象,但obj.x
是一个字符串。
JavaScript将字符串和数字(基元)视为不可变的。所以,如果你这样做:
var a = "bob";
var b = a;
b = "jack";
原始字符串a
将保持不变。
但是对象是不同的。如果你这样做:
var propsObj = { name: "bob" };
var newPropsObj = propsObj;
newPropsObj.name = "jack";
那么propsObj
也将改变,所以propsObj
现在是{ name: "jack" }
。
React使用您传递的东西作为道具和状态来创建其虚拟DOM。因为react使用这些来查看是否有任何更改,并且只渲染发生更改的内容,所以react依赖于代码在传递给react后不会更改道具或状态。
在第二个示例中,这将导致react认为新道具和旧道具仍然相同,因此react将(错误地)得出不需要重新渲染的结论。
相关文章:
- 如何将不可变的js导入angular 2(alpha)
- JavaScript Array unshift() 以一种不可变的方式
- 将对象从另一个不可变的Map分配给Map是否意味着深度克隆
- 函数在不可变的js和redux存储中
- 如何在JS中创建对象的可变和不可变副本
- 使用动态键返回不可变状态
- 不可变的JS映射或列表
- 如何使用不可变表示此数组重新排序示例
- 不可变,在映射内更新不返回正确的对象
- 不可变的Chai断言错误,而预期的结果等于
- 使用扩展运算符和析构函数运算符修改不可变对象的最短方法是什么
- 如何在类似Om的不可变应用程序状态下对关系数据进行建模
- javascript中不可变的值
- 不可变的js修改所有嵌套的记录
- WebSQL:SQLResultSetRowList 中的返回行是不可变的
- 如何在不可变/反应文档页面上阅读代码示例
- 在不可变JS中更新列表中的对象
- Object.seal(Object.prototype)是否使所有对象不可变?
- React:如果值是按值传递的,那么为什么有必要拥有不可变的道具呢
- React-What'It’拥有不可变的道具有很大的好处