- 首页
- 前端开发
- 无法读取 reactjs 中未定义的属性 0
无法读取 reactjs 中未定义的属性 0
[英] Can not read property 0 of undefined in reactjs
本文介绍了无法读取 reactjs 中未定义的属性 0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当用户可以在组件之间切换时,我有一个应用程序.接下来是应用程序的想法:
- 用户点击
添加字段按钮
,会出现一个带有占位符passenger name
的输入- 用户在该输入中填写一些内容
- 用户点击
向内部添加字段
按钮,会出现一个用户在其中写入值的输入 - 用户点击
提交内部
按钮,应该会出现<Edit/>
组件,其中包含来自输入的最后一个值.
- 当用户点击
返回默认模式
按钮时,<Edit/>
组件消失并显示默认模式和输入.
有问题的组件:
const DynamicFieldSet = props =>{const [fieldsOnEdit, setFieldsOnEdit] = useState([]);const [defaultMode, setDefaultMode] = useState(true);//const onFinish = values =>{//setFormVal(values);//console.log(defaultMode);//console.log(收到的表单值:", values);//setFieldsOnEdit(Array.from({ length: values.users.length }, (v, k) => k));//};const setFieldOnEdit = 索引 =>() =>{setFieldsOnEdit(prevIndexes => [...prevIndexes, index]);设置默认模式(假);控制台日志(默认模式");};控制台日志(道具",道具);返回 (<Form.List name={[props.fieldKey, "inner"]}>{(字段,{添加,删除})=>{返回 (<div>{fields.map((field, index) =>!fieldsOnEdit.includes(index) &&默认模式 === 真?(<空格键={field.key}style={{ display: flex", marginBottom: 8 }}对齐=开始"><Form.Item{...场地}name={[field.name, 第一个"]}fieldKey={[field.fieldKey, 第一个"]}rules={[{ required: true, message: "Missing first name";}]}><输入占位符=名字"/></Form.Item><表单.项目><按钮类型=主要"htmlType="提交"onClick={setFieldOnEdit(index)}>提交内部</按钮></Form.Item></空间>) : (<编辑value={props.values}模式={setDefaultMode}键形式={索引}/>))}<表单.项目><按钮类型=虚线"onClick={() =>{添加();}}堵塞><PlusOutlined/>将字段添加到内部</按钮></Form.Item>
);}}</Form.List>);};导出默认的 DynamicFieldSet;
编辑组件:
export const Edit = ({ mode, value, keyForm }) =>{useEffect(() => {console.log(编辑内的值",值);}, []);const 返回 = () =>{模式(真);};返回 (<div>编辑模式<p>值:{value.names[keyForm].first}</p><button onClick={back}>回到默认模式</button>
);};
问题:当我点击提交内部
按钮时,我收到类型错误:无法读取未定义的属性0"
.
问题:为什么我会收到此错误以及如何修复代码并获得所需的行为?
演示:https://codesandbox.io/s/wonderful-ives-o81ue?file=/Edit.js:339-359
解决方案
尽量定义一个默认值,或者注意准确地使用该数据结构:
export const Edit = ({ mode, value, keyForm }) =>{useEffect(() => {console.log(编辑内的值",值);}, []);const 返回 = () =>{模式(真);};控制台日志(值:",值);//默认值定义const { 名称 = [] } = 值 ||{};const { 内部 = {} } = 名称 [0] ||[];const { 第一个 = ";} = 内部[keyForm] ||{};返回 (<div>编辑模式<p>值:{first}</p><button onClick={back}>回到默认模式</button>
);};
编辑
对于切换问题:
SubForm.js:
const DynamicFieldSet = props =>{const [fieldsOnEdit, setFieldsOnEdit] = useState([]);const toggleSmall = i =>{setFieldsOnEdit(prev => {if(prev.includes(i)) return prev.filter(ea => ea !== i);返回 [...prev, i];})}console.log("fieldsOnEdit", fieldsOnEdit);返回 (<Form.List name={[props.fieldKey, "inner"]}>{(字段,{添加,删除})=>{返回 (<div>{fields.map((field, index) =>!fieldsOnEdit.includes(index) ?(<空格键={field.key}style={{ display: flex", marginBottom: 8 }}对齐=开始"><Form.Item{...场地}name={[field.name, 第一个"]}fieldKey={[field.fieldKey, 第一个"]}rules={[{ required: true, message: "Missing first name";}]}><输入占位符=名字"/></Form.Item><表单.项目><按钮类型=主要"htmlType="提交"键=提交"onClick={()=>切换小(索引)}>提交内部</按钮></Form.Item></空间>) : (<编辑value={props.values}模式={toggleSmall}键形式={索引}/>))}<表单.项目><按钮类型=虚线"onClick={() =>{添加();}}堵塞><PlusOutlined/>将字段添加到内部</按钮></Form.Item>
);}}</Form.List>);};导出默认的 DynamicFieldSet;
Edit.js:
export const Edit = ({ mode, value, keyForm }) =>{useEffect(() => {console.log(编辑内的值",值);}, []);const { 名称 = [] } = 值 ||{};const { 内部 = {} } = 名称 [0] ||[];const { 第一个 = ";} = 内部[keyForm] ||{};返回 (<div>编辑模式<p>值:{first}</p><button onClick={()=>mode(keyForm)}>回到默认模式</button>
);};
I have an application when user has the possibility to toggle between the components.The idea of the application is next:
- User click on
add field button
and there appears a input with placeholder passenger name
- User fill something in that input
- User click on
Add fields to inner
button and there appears a input where user writes a value
- User click on
Submit inner
button and should appear <Edit/>
component with the last value from input.
- When User clicks on on
back to default mode
button, the <Edit/>
component disappears and appear default mode with input.
The component with problem:
const DynamicFieldSet = props => {
const [fieldsOnEdit, setFieldsOnEdit] = useState([]);
const [defaultMode, setDefaultMode] = useState(true);
// const onFinish = values => {
// setFormVal(values);
// console.log(defaultMode);
// console.log("Received values of form:", values);
// setFieldsOnEdit(Array.from({ length: values.users.length }, (v, k) => k));
// };
const setFieldOnEdit = index => () => {
setFieldsOnEdit(prevIndexes => [...prevIndexes, index]);
setDefaultMode(false);
console.log("defaultMode");
};
console.log("props", props);
return (
<Form.List name={[props.fieldKey, "inner"]}>
{(fields, { add, remove }) => {
return (
<div>
{fields.map((field, index) =>
!fieldsOnEdit.includes(index) && defaultMode === true ? (
<Space
key={field.key}
style={{ display: "flex", marginBottom: 8 }}
align="start"
>
<Form.Item
{...field}
name={[field.name, "first"]}
fieldKey={[field.fieldKey, "first"]}
rules={[{ required: true, message: "Missing first name" }]}
>
<Input placeholder="First Name" />
</Form.Item>
<Form.Item>
<Button
type="primary"
htmlType="submit"
onClick={setFieldOnEdit(index)}
>
Submit inner
</Button>
</Form.Item>
</Space>
) : (
<Edit
value={props.values}
mode={setDefaultMode}
keyForm={index}
/>
)
)}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
block
>
<PlusOutlined /> Add field to inner
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
);
};
export default DynamicFieldSet;
Edit component:
export const Edit = ({ mode, value, keyForm }) => {
useEffect(() => {
console.log("value inside edit", value);
}, []);
const back = () => {
mode(true);
};
return (
<div>
edit mode
<p>value: {value.names[keyForm].first}</p>
<button onClick={back}>back to default mode</button>
</div>
);
};
Issues: When i click on Submit inner
button i get the type error: Cannot read property '0' of undefined
.
Question: Why i get this error and how to fix the code and to get the wanted behavior?
demo: https://codesandbox.io/s/wonderful-ives-o81ue?file=/Edit.js:339-359
解决方案
Try to always define a default value, or take care to have exactly that data structure:
export const Edit = ({ mode, value, keyForm }) => {
useEffect(() => {
console.log("value inside edit", value);
}, []);
const back = () => {
mode(true);
};
console.log("VALUE: ", value);
// Default value definitions
const { names = [] } = value || {};
const { inner = {} } = names[0] || [];
const { first = "" } = inner[keyForm] || {};
return (
<div>
edit mode
<p>value: {first}</p>
<button onClick={back}>back to default mode</button>
</div>
);
};
EDIT
For the toggle issue:
SubForm.js:
const DynamicFieldSet = props => {
const [fieldsOnEdit, setFieldsOnEdit] = useState([]);
const toggleSmall = i => {
setFieldsOnEdit(prev => {
if(prev.includes(i)) return prev.filter(ea => ea !== i);
return [...prev, i];
})
}
console.log("fieldsOnEdit", fieldsOnEdit);
return (
<Form.List name={[props.fieldKey, "inner"]}>
{(fields, { add, remove }) => {
return (
<div>
{fields.map((field, index) =>
!fieldsOnEdit.includes(index) ? (
<Space
key={field.key}
style={{ display: "flex", marginBottom: 8 }}
align="start"
>
<Form.Item
{...field}
name={[field.name, "first"]}
fieldKey={[field.fieldKey, "first"]}
rules={[{ required: true, message: "Missing first name" }]}
>
<Input placeholder="First Name" />
</Form.Item>
<Form.Item>
<Button
type="primary"
htmlType="submit"
key="submit"
onClick={()=> toggleSmall(index)}
>
Submit inner
</Button>
</Form.Item>
</Space>
) : (
<Edit
value={props.values}
mode={toggleSmall}
keyForm={index}
/>
)
)}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
block
>
<PlusOutlined /> Add field to inner
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
);
};
export default DynamicFieldSet;
Edit.js:
export const Edit = ({ mode, value, keyForm }) => {
useEffect(() => {
console.log("value inside edit", value);
}, []);
const { names = [] } = value || {};
const { inner = {} } = names[0] || [];
const { first = "" } = inner[keyForm] || {};
return (
<div>
edit mode
<p>value: {first}</p>
<button onClick={()=> mode(keyForm)}>back to default mode</button>
</div>
);
};
这篇关于无法读取 reactjs 中未定义的属性 0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!