让我们说出于某种微妙的原因,我有以下反应状态:
{ 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)
,没有任何成功)。有什么想法吗?
答案 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中的字符串是不可变的,但你可以把它变成一个数组,对它进行处理,然后将它连接在一起..还有像substr
和replace
这样的字符串函数返回一个新的字符串,如果适用。
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'