将一个不存在的布尔值推送到状态并跨组件共享
Push a non-existing boolean value to state and share across components
我正在努力做到这一点,以便用户可以单击呈现 div 的 ArtImage
- 一旦它这样做,它应该将 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>
);
};
我正在努力做到这一点,以便用户可以单击呈现 div 的 ArtImage
- 一旦它这样做,它应该将 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>
);
};