【发布时间】:2021-02-24 17:16:13
【问题描述】:
突出我的问题。我正在尝试向图像道具添加条件渲染。我从 API 中提取的一些“故事”没有图像,所以我需要考虑这一点,所以我没有收到“TypeError:无法读取 null 的属性 '0'”错误,但这仍然不起作用我添加了三元运算符。
<Story
key={idx}
title={story.title}
abstract={story.abstract}
img={story.multimedia[0].url ? story.multimedia[0].url : null} // why doesn't this work?
alt={story.multimedia[0].caption ? story.multimedia[0].caption : null} // why doesn't this work?
link={story.url}
/>;
我可以向“占位符”图片网址添加后备链接吗?
img={story.multimedia[0].url ? story.multimedia[0].url : "https://www.example.com/example.png"}
这里是完整的组件
export default function News() {
const [error, setError] = useState(null);
const [stories, setStory] = useState(null);
useEffect(() => {
const getCurrentPage = () => {
const url = new URL(window.location.href);
const page = url.pathname.split("/").pop();
return page ? page : "home";
};
const section = getCurrentPage();
fetch(
`https://api.nytimes.com/svc/topstories/v2/${section}.json?api-key=4fzCTy6buRI5xtOkZzqo4FfEkzUVAJdr`
)
.then((res) => res.json())
.then((data) => {
setTimeout(() => setStory(data), 1500);
console.log("Success ", data);
})
.catch((error) => {
console.log("Error", error);
setError(error);
});
}, []);
if (error) {
return <div>Error: {error.message}</div>;
} else if (!stories) {
return <LoadingBar type={"cylon"} color={"#193152"} />;
} else {
return (
<>
<ul className="stories">
{stories.results.map((story, idx) => {
return (
<Story
key={idx}
title={story.title}
abstract={story.abstract}
img={story.multimedia[0].url ? story.multimedia[0].url : null} // why doesn't this work
alt={ story.multimedia[0].caption ? story.multimedia[0].caption : null } // why doesn't this work?
link={story.url}
/>
);
})}
</ul>
<Spacer height={100} />
</>
);
}
}
【问题讨论】:
-
问题是
story.multimedia为空。在三元条件下会引发错误,因此您需要使用story.multimedia ? story.multimedia[0].url : ...来检查条件中的空值,或者,如果您的目标是现代浏览器,则使用可选链接;story.multimedia?.[0]?.url ? story.multimedia[0].url : ... -
我不知道这是否有帮助,但如果你尝试这样的事情:img={!story.multimedia[0].url ? null : story.multimedia[0].url}
-
如果你使用optional chaining,你可能甚至不需要三元
img={story?.multimedia?.[0]?.url},因为这是JSX,babel 无论如何都会编译它,所以很可能不用担心浏览器支持.
标签: javascript reactjs