Javascript 类型错误:记分员不可编辑
下面的代码给出了 类型错误:记分员不可编辑 似乎只有在以下情况下才会出现此问题:Javascript 类型错误:记分员不可编辑,javascript,reactjs,Javascript,Reactjs,下面的代码给出了 类型错误:记分员不可编辑 似乎只有在以下情况下才会出现此问题: existingScorer = true 我在谷歌搜索后找到了这个答案 尝试迭代整数值时引发错误。要解决此错误,请确保迭代的是一个iterable,而不是一个数字。 但是MDN说 一些内置的构造(如spread语法)在后台使用相同的迭代协议 你能告诉我我能做什么吗 提前谢谢 /彼得 编辑:my app.js const[scorers,setScorers]=useState([ {id:nanoid(4)
existingScorer = true
我在谷歌搜索后找到了这个答案
尝试迭代整数值时引发错误。要解决此错误,请确保迭代的是一个iterable,而不是一个数字。
但是MDN说
一些内置的构造(如spread语法)在后台使用相同的迭代协议
你能告诉我我能做什么吗
提前谢谢
/彼得
编辑:my app.js
const[scorers,setScorers]=useState([
{id:nanoid(4),编号:9,总数:99},
{id:nanoid(4),编号:1,总数:11},
{id:nanoid(4),编号:15,总数:9},
]);
const sortedScorers=[…scorers].sort((a,b)=>a.number-b.number);
const onePointScoredHandler=()=>{
常量玩家=[…记分员];
const existingScorer=players.find((player)=>player.number===+number);
if(现有记分员){
log('exist');
existingScorer.totPoints=设置点((prevState)=>prevState+1);
设置记分器(现有记分器);
}否则{
console.log('new');
常数新闻采集器={
id:nanoid(4),
编号:+number,
总积分:总积分+1,
};
记分员([…记分员,新闻记分员]);
//设定值(totPoints);
}
设置编号(“”);
控制台日志(记分器);
};
返回(
个别点
setNumber(e.target.value)}
/>
加1便士
身份证件
数
总分
{分拣机
.sort((a,b)=>a.number-b.number)
.map((播放器)=>(
{player.id}
{player.number}
{player.totPoints}
))}
);
};
正如@aleksxor已经指出的,问题在于以下几行
setScorers(existingScorer);
其中,existingScorer
似乎是单个对象。现在,在上面一行中,您将使用单个对象覆盖现有的记分器数组。因此,当您稍后尝试在扩展语法中使用scorers
数组[…scorers]
时,这不再有效,因为scorers
现在是一个对象而不是数组
一个简单的修复方法是将上面的行替换为
setScorers([existingScorer]);
但是请注意,这将覆盖现有的记分器数组,即,如果它已经包含一些元素,它们将从该数组中消失。因此,您可能需要将新元素附加到现有数组中,或者将值与现有数组中的元素合并
let s = scorers.find(x => x.number === existingScorer.number);
if (s)
s.totPoints = existingScorer.totPoints;
else
setScorers([...scorers, existingScorer])
只要不深度复制玩家,就可能不需要更新scorers
数组中的记分器,因为所有引用都指向同一个对象。因此,只需检查玩家是否已包含在记分者数组中,如果已包含,则不附加它
let s = scorers.find(x => x.number === existingScorer.number);
if (!s)
setScorers([...scorers, existingScorer])
您还可以通过以下方式更改功能逻辑以实现所需的结果:
const onePointScoredHandler = () => {
const players = [...scorers];
const pos = players.map((player) => player.number).indexOf(+number);
if (pos !== -1) {
console.log("exist");
players[pos].totPoints = setTotPoints((prevState) => prevState + 1);
setScorers(players);
} else {
console.log("new");
const newScorer = {
id: nanoid(4),
number: +number,
totPoints: totPoints + 1,
};
setScorers([...scorers, newScorer]);
setTotPoints(totPoints);
}
setNumber("");
console.log(scorers);
};
``
什么是得分者?请给我们看看是什么?(github链接应始终伴随问题本身的代码示例)请将代码的相关部分添加到您的问题中。没有人对在某个github存储库中挖掘感兴趣。。。至于你的问题:似乎scorer
不是数组,所以你不能在扩展语法中使用它。。。没有人知道现有的Scorer是什么,或者它与上面显示的代码有什么关系。。。将该行更改为setScorers([existingScorer])
。我相信现有的记分器本身并不是一个数组。@derpirscher:很抱歉我的失误,答应我下一步做得更好time@evolutionxbox:对不起,我错了,我现在有了原始问题中的代码谢谢你的帮助:-)我为我的答复晚了表示歉意,但我在PICU连续上了很多夜班。
const onePointScoredHandler = () => {
const players = [...scorers];
const pos = players.map((player) => player.number).indexOf(+number);
if (pos !== -1) {
console.log("exist");
players[pos].totPoints = setTotPoints((prevState) => prevState + 1);
setScorers(players);
} else {
console.log("new");
const newScorer = {
id: nanoid(4),
number: +number,
totPoints: totPoints + 1,
};
setScorers([...scorers, newScorer]);
setTotPoints(totPoints);
}
setNumber("");
console.log(scorers);
};
``