Mutate来自React状态的字符串

时间:2016-10-26 22:33:40

标签: javascript

让我们说出于某种微妙的原因,我有以下反应状态:

{ 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 个答案:

答案 0 :(得分:3)

JavaScript中的字符串是不可变的。您的示例可以缩减为

if let toLearn = word?.text, 
   let recorded = result?.bestTranscription.formattedString  {

    let wordsToLearn = toLearn.components(separatedBy: " ")

    let recordedWords = recorded.components(separatedBy: " ")
}

如果要改变字符串,则需要创建一个新字符串,例如

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

答案 1 :(得分:1)

JS中的字符串是不可变的,但你可以把它变成一个数组,对它进行处理,然后将它连接在一起..还有像substrreplace这样的字符串函数返回一个新的字符串,如果适用。

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

答案 2 :(得分:1)

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

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

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

这样

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