在 React 中传递对象数组中的嵌套对象的正确方法是什么?
What is the right way to pass nested objects in object array in React?
在下面的地图函数中,我试图访问数据中的嵌套对象。我想说“如果我的 SlideData 中的对象有 属性“列表”,则显示它”。我正在将 props 从数据传递到我的 TextSlide 组件,但是一定有比将大量 props 传递到 TextComponent 更好的方法吗?
function Slideshow(props) {
//MY DATA
const SlideData = [{
{
title: "The Title",
text1: "Monkey",
text2: "D",
text3: "Luffy",
list: [
{
listTitle: "The List",
listItem1: "Zoro",
listItem2: "Nami",
listItem3: "Sanji",
listItem4: "Ussop",
listItem5: "Chopper",
listItem6: "Franky",
},
],
imagesrc: picture,
imagewidth: "100px",
},
}]
//MAP THROUGH DATA (is there a better way to pass multiple props here?? maybe with {...props} ?)
const textSlides = SlideData.map((item),index) => ( <TextSlide
key={index}
title={item.title}
text1={item.text1}
text2={item.text2}
listTitle={item.listTitle}
listItem1={item.listItem1}
listItem2={item.listItem2}
listItem3={item.listItem3}
listItem4={item.listItem4}
listItem5={item.listItem5}
listItem6={item.listItem6}
/>));
return (
<>
{textSlides}
</>
);
}
//文本幻灯片组件//
const TextSlide = (props) => {
return (
<>
<div className="slide">
<div className="standard-grid">
<span className="slide-title title">{props.title}</span>
<div className="content">
<p>{props.text1}</p>
<p>{props.text2}</p>
<p>{props.text3}</p>
{props.list ? <div>
<h4>{props.list2}</h4>
<ul>
<li>{props.listItem1}</li>
<li>{props.listItem2}</li>
<li>{props.listItem3}</li>
<li>{props.listItem4}</li>
<li>{props.listItem5}</li>
<li>{props.listItem6}</li>
</ul>
</div> : null}
</div>
{props.imagesrc ? (<img className="picture" src={props.imagesrc}
style={{ maxWidth: props.imagewidth }} alt="image" />) : null}
</div>
</div>
</>
);
};
export default TextSlide;
你应该更喜欢使用 <TextSlide {...props} />
而不是传递许多 props,它更具可读性。
SlideData.map((slide) => (
<TextSlide key={slide.id} {...slide} />
))
- 快速提示:不要使用索引作为键,您可以阅读更多相关信息here。
我还建议您对代码进行一些重构:
将您的 listData 存储在相关对象而不是数组中
{
id: 1,
title: "The Title",
text1: "Monkey",
text2: "D",
text3: "Luffy",
listData: {
listTitle: "The List",
listItem1: "Zoro",
listItem2: "Nami",
listItem3: "Sanji",
listItem4: "Ussop",
listItem5: "Chopper",
listItem6: "Franky"
},
imagesrc: "picture",
imagewidth: "100px"
}
进行此更改后,您可以更轻松地处理数据,让我们看看您的示例并进行一些更改:
TextSlide 组件
const TextSlide = (props) => {
return (
<>
<div className="slide">
<div className="standard-grid">
<span className="slide-title title">{props.title}</span>
<div className="content">
<p>{props.text1}</p>
<p>{props.text2}</p>
<p>{props.text3}</p>
{props.listData ? (
<div>
<h4>{listData.list2}</h4>
<ul>
<li>{listData.listItem1}</li>
<li>{listData.listItem2}</li>
<li>{listData.listItem3}</li>
<li>{listData.listItem4}</li>
<li>{listData.listItem5}</li>
<li>{listData.listItem6}</li>
</ul>
</div>
) : null}
</div>
{props.imagesrc ? (
<img
className="picture"
src={props.imagesrc}
style={{ maxWidth: props.imagewidth }}
alt="image"
/>
) : null}
</div>
</div>
</>
);
};
export default TextSlide;
由于您似乎对数据结构和格式有一定的控制权,我建议尝试以易于呈现的方式格式化您的数据。在 React 中,列表通常 converted/stored 在数组中,以便它们可以映射到 JSX。
示例:
const SlideData = [
{
title: "The Title",
text: ["Monkey", "D","Luffy", ...];
list: {
title: "The List",
items: [ "Zoro", "Nami", "Sanji", "Ussop", "Chopper", "Franky"],
},
image: {
src: picture,
width: "100px",
},
},
...
];
您之前基本上使用重复的“itemX”键的任何地方都是存储为数组的主要候选对象。
您可以简单地将整个 object 属性 作为 prop 传递,然后渲染并传递任何嵌套属性。
示例:
const textSlides = SlideData.map((item, index) => (
<TextSlide
key={index}
{...item}
/>
));
Child
const TextSlide = ({
title,
text = [],
list,
image,
}) => {
return (
<div className="slide">
<div className="standard-grid">
<span className="slide-title title">{title}</span>
<div className="content">
{text.map((t, i) => <p key={i}>{t}</p>)}
{list && (
<div>
<h4>{list.title}</h4>
<ul>
{list.items.map((item, i) => (
<li key={i}>{item}</li>
))}
</ul>
</div>
)}
</div>
{image && (
<img
className="picture"
src={image.src}
style={{ maxWidth: image.width }}
alt="image"
/>
)}
</div>
</div>
);
};
在下面的地图函数中,我试图访问数据中的嵌套对象。我想说“如果我的 SlideData 中的对象有 属性“列表”,则显示它”。我正在将 props 从数据传递到我的 TextSlide 组件,但是一定有比将大量 props 传递到 TextComponent 更好的方法吗?
function Slideshow(props) {
//MY DATA
const SlideData = [{
{
title: "The Title",
text1: "Monkey",
text2: "D",
text3: "Luffy",
list: [
{
listTitle: "The List",
listItem1: "Zoro",
listItem2: "Nami",
listItem3: "Sanji",
listItem4: "Ussop",
listItem5: "Chopper",
listItem6: "Franky",
},
],
imagesrc: picture,
imagewidth: "100px",
},
}]
//MAP THROUGH DATA (is there a better way to pass multiple props here?? maybe with {...props} ?)
const textSlides = SlideData.map((item),index) => ( <TextSlide
key={index}
title={item.title}
text1={item.text1}
text2={item.text2}
listTitle={item.listTitle}
listItem1={item.listItem1}
listItem2={item.listItem2}
listItem3={item.listItem3}
listItem4={item.listItem4}
listItem5={item.listItem5}
listItem6={item.listItem6}
/>));
return (
<>
{textSlides}
</>
);
}
//文本幻灯片组件//
const TextSlide = (props) => {
return (
<>
<div className="slide">
<div className="standard-grid">
<span className="slide-title title">{props.title}</span>
<div className="content">
<p>{props.text1}</p>
<p>{props.text2}</p>
<p>{props.text3}</p>
{props.list ? <div>
<h4>{props.list2}</h4>
<ul>
<li>{props.listItem1}</li>
<li>{props.listItem2}</li>
<li>{props.listItem3}</li>
<li>{props.listItem4}</li>
<li>{props.listItem5}</li>
<li>{props.listItem6}</li>
</ul>
</div> : null}
</div>
{props.imagesrc ? (<img className="picture" src={props.imagesrc}
style={{ maxWidth: props.imagewidth }} alt="image" />) : null}
</div>
</div>
</>
);
};
export default TextSlide;
你应该更喜欢使用 <TextSlide {...props} />
而不是传递许多 props,它更具可读性。
SlideData.map((slide) => (
<TextSlide key={slide.id} {...slide} />
))
- 快速提示:不要使用索引作为键,您可以阅读更多相关信息here。
我还建议您对代码进行一些重构:
将您的 listData 存储在相关对象而不是数组中
{
id: 1,
title: "The Title",
text1: "Monkey",
text2: "D",
text3: "Luffy",
listData: {
listTitle: "The List",
listItem1: "Zoro",
listItem2: "Nami",
listItem3: "Sanji",
listItem4: "Ussop",
listItem5: "Chopper",
listItem6: "Franky"
},
imagesrc: "picture",
imagewidth: "100px"
}
进行此更改后,您可以更轻松地处理数据,让我们看看您的示例并进行一些更改:
TextSlide 组件
const TextSlide = (props) => {
return (
<>
<div className="slide">
<div className="standard-grid">
<span className="slide-title title">{props.title}</span>
<div className="content">
<p>{props.text1}</p>
<p>{props.text2}</p>
<p>{props.text3}</p>
{props.listData ? (
<div>
<h4>{listData.list2}</h4>
<ul>
<li>{listData.listItem1}</li>
<li>{listData.listItem2}</li>
<li>{listData.listItem3}</li>
<li>{listData.listItem4}</li>
<li>{listData.listItem5}</li>
<li>{listData.listItem6}</li>
</ul>
</div>
) : null}
</div>
{props.imagesrc ? (
<img
className="picture"
src={props.imagesrc}
style={{ maxWidth: props.imagewidth }}
alt="image"
/>
) : null}
</div>
</div>
</>
);
};
export default TextSlide;
由于您似乎对数据结构和格式有一定的控制权,我建议尝试以易于呈现的方式格式化您的数据。在 React 中,列表通常 converted/stored 在数组中,以便它们可以映射到 JSX。
示例:
const SlideData = [
{
title: "The Title",
text: ["Monkey", "D","Luffy", ...];
list: {
title: "The List",
items: [ "Zoro", "Nami", "Sanji", "Ussop", "Chopper", "Franky"],
},
image: {
src: picture,
width: "100px",
},
},
...
];
您之前基本上使用重复的“itemX”键的任何地方都是存储为数组的主要候选对象。
您可以简单地将整个 object 属性 作为 prop 传递,然后渲染并传递任何嵌套属性。
示例:
const textSlides = SlideData.map((item, index) => (
<TextSlide
key={index}
{...item}
/>
));
Child
const TextSlide = ({
title,
text = [],
list,
image,
}) => {
return (
<div className="slide">
<div className="standard-grid">
<span className="slide-title title">{title}</span>
<div className="content">
{text.map((t, i) => <p key={i}>{t}</p>)}
{list && (
<div>
<h4>{list.title}</h4>
<ul>
{list.items.map((item, i) => (
<li key={i}>{item}</li>
))}
</ul>
</div>
)}
</div>
{image && (
<img
className="picture"
src={image.src}
style={{ maxWidth: image.width }}
alt="image"
/>
)}
</div>
</div>
);
};