2016-10-26 257 views
1

发起比方说,一些微妙的原因,我有以下反应过来状态:变异字符串从阵营状态

{ superGreeting: 'Hello!!!' } 

现在,假设我有这样复杂的操作,基本上采取superGreeting串并工作就可以了,在结束替换特定位置上的字符。那么新的状态应该是:

{ superGreeting: 'Hullo!!!' } 

那么,就不会有我的行动:

action = (index) => { 
    var { superGreeting: newGreeting } = this.state; 
    newGreeting[index] = 'u'; 
    this.setState({superGreeting: newGreeting}); 
} 

可惜的是,这种方法是行不通的,结尾是: TypeError: Cannot assign to read only property '1' of string 'Hello!!!',表示该行违规之一: newGreeting[index] = 'u'

我使用react.js,ES6,没有redux,没有mobx,没有immutable.js。认为这个问题是由于字符串仍然被相关/由即将到来的状态使用,所以我认为创建一个副本将工作(我试过newGreeting = newGreeting.toString(),'' + newGreeting,`$ {newGreeting}`,''.concat(newGreeting),没有任何成功)。有任何想法吗?

回答

3

JavaScript中的字符串是不可变的。您的例子可以下调至

(function(){ 
    "use strict"; 
    var str = 'Hullo!!!'; 
    str[1] = 'e'; 
})(); 

如果你想发生变异的字符串,你需要创建一个新的字符串,例如

(function(){ 
    "use strict"; 
    var str = 'Hullo!!!'; 
    str = str.slice(0, 1) + 'e' + str.slice(2); 
})(); 
1

字符串在JS是不可变的,但你可以把它变成一个数组,它的工作,然后再加入它一起回来..也有像substrreplace字符串函数它会返回一个新的字符串,如果这些都适用。

var split = superGreeting.split('') 
split[index] = 'u' 
var newGreeting = split.join('') 
1

这里的问题与反应没有任何关系。 JavaScript中的字符串是不可变的。

您可以创建以下辅助函数:

var replaceCharAt = function(str, index, c) { 
    return str.slice(0, index) + c + str.slice(index+1) 
} 

使

replaceCharAt('012', 1, 'x') === '0x2' 
+0

谢谢!我已经修正了这个例子。 – Eoin

+0

完美,谢谢! – loganfsmyth