javascript - 将不存在的布尔值推送到状态并跨组件共享
问题描述
我正在尝试这样做,以便用户可以单击ArtImage
呈现 div 的 a - 一旦这样做,它应该将 的值添加selected
到选定images
状态并显示选定的总数images
,同时还input type="radio"
用于触发图像的点击. 有没有办法在组件之间共享这种状态,同时更新这些值?
数据
const images = [
{
imageUrl: "https://picsum.photos/id/1003/300/300"
},
{
imageUrl: "https://picsum.photos/id/1005/300/300"
},
{
imageUrl: "https://picsum.photos/id/1009/300/300"
},
{
imageUrl: "https://picsum.photos/id/1010/300/300"
},
{
imageUrl: "https://picsum.photos/id/1015/300/300"
},
{
imageUrl: "https://picsum.photos/id/1025/300/300"
},
{
imageUrl: "https://picsum.photos/id/1027/300/300"
},
...
];
const ArtImage = ({ image, currentImage }) => {
const [selected, setSelected] = React.useState(false);
const handleSelect = () => {
setSelected(!selected);
};
return (
<div
onClick={handleSelect}
style={{
display: "inline-block",
position: "relative",
cursor: "pointer"
}}
>
<input type="radio" checked={selected} />
<img src={image.imageUrl} />
</div>
);
};
const ArtSelection = ({ art }) => {
const [images, setImages] = React.useState(art);
return (
<div>
<p>{images.selected}/12 posts selected</p>
{images.map((e, i) => {
return <ArtImage image={e} />;
})}
</div>
);
};
代码笔: https ://codepen.io/adam-ginther/pen/PopwNag ?editors=0110
解决方案
您可以创建图像计数状态并将其传递给子组件。
const ArtSelection = ({ art = [] }) => { //default the art props to an array to prevent error while rendering
const [images, setImages] = React.useState(art);
const [ imageCount, setImageCount ] = React.useState(0);
return (
<div>
<p>{imageCount}/ {images.length} posts selected</p>
{images.map((e, i) => {
return <ArtImage image={e} updateImageCount={setImageCount} />;
})}
<p>Total Selected: {imageCount} </p>
</div>
);
};
然后在子组件中,使用 useEffect 来更新计数器。
const ArtImage = ({ image, currentImage, updateImageCount }) => {
const [selected, setSelected] = React.useState(false);
useEffect(() => {
if (selected) {
updateImageCount(prev => prev+1)
} else {
updateImageCount(prev => prev-1)
}
},[selected])
const handleSelect = () => {
setSelected(!selected);
};
return (
<div
onClick={handleSelect}
style={{
display: "inline-block",
position: "relative",
cursor: "pointer"
}}
>
<input type="radio" checked={selected} />
<img src={image.imageUrl} />
</div>
);
};
推荐阅读
- internet-explorer-11 - angular-auth-oidc-client v10.0.2 在 IE 中不起作用
- mysql - sql - 选择 case 语句以添加时间截止
- angular - 为什么 AuthGuard 中的 observable 总是错误的?
- c++ - 在 C++ 中使用 MATLAB API,matOpen 静默崩溃程序
- c++ - 如何将 TensorFlow C API 限制为总共使用一个且仅使用一个线程
- ios - Apple 帐户需要尽快迁移到联合身份验证
- symfony - 使用表单事件 Symfony 5 动态修改自定义表单类型中的表单选择
- entity-framework - 禁用来自 Microsoft.EntityFrameworkCore.* 的警告
- python - 如何在使用 multiprocessing.Pool(10).map() 下载多个图像时传递多个参数
- spring-boot - jpa 在哪里选择 userbyusername 方法,因为我没有给出任何实现,我也检查了内部类