Javascript 类型错误:Can';t读取属性';地图';组件在React中上载文件时的未定义值
我是新手。 当props.submitlk===true时(绿色指示灯表示已单击“我的上载”按钮并从另一个组件的表单发送文件) ,我试图用一个新的技术对象更新state setList,但现在只是“SomeObject”。单击后,我得到一个“TypeError无法读取未定义的属性'map'。我试着在一些条件下胡闹,但几个小时后就没什么运气了。这是一个异步问题,映射发生得太快了吗?handleRemove在删除对象时可以正常工作。如果我删除If语句下的函数,它不会在表单提交时抛出错误。此外,对象将变得更大,这就是它当前以这种方式嵌套的原因。谢谢你的回答Javascript 类型错误:Can';t读取属性';地图';组件在React中上载文件时的未定义值,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我是新手。 当props.submitlk===true时(绿色指示灯表示已单击“我的上载”按钮并从另一个组件的表单发送文件) ,我试图用一个新的技术对象更新state setList,但现在只是“SomeObject”。单击后,我得到一个“TypeError无法读取未定义的属性'map'。我试着在一些条件下胡闹,但几个小时后就没什么运气了。这是一个异步问题,映射发生得太快了吗?handleRemove在删除对象时可以正常工作。如果我删除If语句下的函数,它不会在表单提交时抛出错误。此外,对象将
function SampleData(props) {
const [list, setList] = React.useState( [
{
closedguard: [
{
name: "Armbar",
link: "",
x: "X",
id: "1",
},
{
name: "Triangle",
link: "",
x: "X",
id: "2",
},
{
name: "Omaplata",
link: "",
x: "X",
id: "3",
},
] }
] );
if( props.submitClk === true) {
setList([...list, 'SomeObject'])
}
const handleRemove = (id) => {
const newList = list[0].closedguard.filter(move => move.id !== id);
setList([{ closedguard: newList }]);
};
return (
<div className="guard">
<ul className="techUl">
{" "}
Closed Guard
{list.map((pos) =>
pos.closedguard.map((move, id) => (
<li
key={id}
className="techLi"
>{move.name}
<span onClick={(id) => handleRemove(move.id)}> {move.x}</span>
</li>
))
)}
</ul>
</div>
);
}
函数采样数据(props){
const[list,setList]=React.useState([
{
封闭守卫:[
{
名称:“扶手”,
链接:“,
x:“x”,
id:“1”,
},
{
名称:“三角形”,
链接:“,
x:“x”,
id:“2”,
},
{
名称:“Omaplata”,
链接:“,
x:“x”,
id:“3”,
},
] }
] );
if(props.submitck==真){
setList([…list,'SomeObject'])
}
const handleRemove=(id)=>{
const newList=list[0]。closedguard.filter(move=>move.id!==id);
setList([{closedguard:newList}]);
};
返回(
{" "}
封闭式防护
{list.map((pos)=>
位置关闭守卫地图((移动,id)=>(
- {move.name}
handleRemove(move.id)}>{move.x}
))
)}
);
}
首先,如果没有someObject
,您将面临太多的重新渲染。React限制渲染的数量以防止无限循环。
然后更新嵌套对象:
[
{
closedguard: [
{
name: "Armbar",
link: "",
x: "X",
id: "1",
},
{
name: "Triangle",
link: "",
x: "X",
id: "2",
},
{
name: "Omaplata",
link: "",
x: "X",
id: "3",
},
]
}
]
对象数组,然后对象closedguard
位于其中,该数组是一个数组
所以在这种情况下你能做的就是
// think is the some objects
const newObject = [
{
name: "test1",
link: "",
x: "X",
id: "5"
},
{
name: "test2",
link: "",
x: "X",
id: "56"
}
];
setList([{ closedguard: [...list[0].closedguard, ...newObject] }]);
而不是
setList([...list, 'SomeObject'])
如果要更新嵌套对象以将元素添加到
closedguard:
属性数组,请选中@Nafis answer
我认为问题在于,您添加的新对象没有closedguard
属性,因此映射函数无法映射该对象
如果添加具有该属性的对象,则该属性将起作用,例如:
const objToAdd = {closedguard: [
{
name: "newObj1",
link: "",
x: "X",
id: "3",
},
{
name: "newObj2",
link: "",
x: "X",
id: "3",
}]
}
如果要添加具有其他属性的对象,则可能需要映射相应的键,以确保从对象中获取属性,因此需要更改
pos.closedguard.map((移动,id)=>(
作者:
pos[Object.keys(pos)[0]].map((move,id)=>(
例如
因此,如果您的对象没有closedguard
,则该对象的第一个属性将被映射
将完整的申报表与我的提案一起发布,以明确我的提案:
return (
<div className="guard">
<ul className="techUl">
{" "}
Closed Guard
{list.map((pos) =>
pos[Object.keys(pos)[0]].map((move, id) => ( //CHANGE HERE
<li
key={id} className="techLi"
>{move.name}
<span onClick={(id) => handleRemove(move.id)}> {move.x}</span>
</li>
))
)}
</ul>
<button onClick={handleOnClick}>Button</button>
</div>
);
返回(
{" "}
封闭式防护
{list.map((pos)=>
pos[Object.keys(pos)[0]].map((move,id)=>(//在此处更改
- {move.name}
handleRemove(move.id)}>{move.x}
))
)}
按钮
);
更新ur状态的closeguard数组列表
u可以看到@Nafis-answer,但是u
应该使用useEffect挂钩来运行副作用。尝试将此逻辑与@Nafis answer结合起来以更新状态-
if(props.submitlk==true){setList([…list,'SomeObject'])}
在useEffect挂钩内,如下图所示
useEffect(()=>{
if( props.submitClk === true) {
setList([...list, 'SomeObject']) }
},[list])
现在修改list.map函数如下,这样你就不会得到map undefined错误
{list.length > 0 && list.map((pos) =>
pos.closedguard.map((move, id) => (
<li
key={id}
className="techLi"
>{move.name}
<span onClick={(id) => handleRemove(move.id)}> {move.x}</span>
</li>
))
)}
{list.length>0&&list.map((pos)=>
位置关闭守卫地图((移动,id)=>(
{move.name}
handleRemove(move.id)}>{move.x}
))
)}
让我知道它是否工作。pos.closedguard未定义。我认为要使用上一个状态(…list),您希望将其作为setList中函数的参数传递:
setList((prevList)=>{[…list,'SomeObject'])
仍然是相同的错误,但谢谢。通过这种方式,您将向closedguard:
数组属性添加元素。根据操作码[…列表,'SomeObject']
,这将涉及创建另一个完整的父对象,而不是向closedguard数组属性添加元素。不过,你的答案可能是问题的答案……我真的很抱歉,我不是想复制urs。我想复制他的代码。ur在顶部,所以在复制时我可能会误解为他的。Thnx指出他正在获得在列表数组上使用映射函数时出错,当文件从其他组件发送时,此组件在道具中以真实值装载,并且他正试图根据真实情况更新此组件的状态。因此,我只是提出可能导致该错误的原因。请让我知道我的理解是否正确