javascript - 用于 React 中的对象的 useState
问题描述
我在使用钩子 useState 来处理 React 中的对象时遇到了困难。我有一个按钮,我希望重用它来清理我的代码。
我可以为按钮的每个实例使用一个新函数,但我认为还有另一种方法。也许我可以重组我的变量,我对此有些陌生,所以我不确定最好的方法。
import React, { useState } from "react";
import ProjectVB from "./ProjectVB";
import ProjectBB from "./ProjectBB";
import Up from "../icons/Up.svg";
import Down from "../icons/Down.svg";
import exampleVB from "../icons/projectVB.JPG";
import exampleBB from "../icons/projectBB.jpg";
const Projects = () => {
const [moreInfo, setMoreInfo] = useState({
SC: true,
VF: true,
VB: true,
BB: true,
});
const [aboutButton, setAboutButton] = useState({
BB: Down,
VB: Down,
SC: Down,
VF: Down,
});
const [project, setProject] = useState({
SC: false,
VF: false,
VB: false,
BB: false,
});
const ContinueReadingFunction = value => {
setMoreInfo.value(!moreInfo.value)
if (moreInfo.value === true) {
setProject.value(!project.value);
setAboutButton.value(Up);
} else {
aboutButton.value = Down;
project.value = false;
}
};
return (
<div className="imageContainer">
<div className="buttonBox">
<button
className="aboutButton"
onClick={() => ContinueReadingFunction("BB")}
>
<img
src={aboutButton.BB}
className="logo"
alt="More or less information."
/>
</button>
</div>
<div className="exampleImage">
<img
src={exampleBB}
className="exampleImageImage"
alt="screenshot of the project"
/>
</div>
</div>
{project.BB && <ProjectBB />}
</div>
<div className="projectContainer">
<h3>Vegan Berlin</h3>
<div className="imageContainer">
<div className="buttonBox">
<button className="aboutButton" onClick={ContinueReadingFunction}>
<img
src={aboutButton.VB}
className="logo"
alt="More or less information."
/>
</button>
</div>
<div className="exampleImage">
<img
src={exampleVB}
className="exampleImageImage"
alt="screenshot of the project"
/>
</div>
</div>
{project.VB && <ProjectVB />}
</div>
);
};
export default Projects;
我可以使用一堆单独的函数来实现结果,但我正在尝试重构我的代码以学习新的钩子
解决方案
您的继续阅读功能似乎存在一些问题
useState setter 函数只是将您传递给它们的任何内容设置为新状态,因此您需要再次传递整个对象。看起来您正在尝试对对象本身中的值进行子集化,为此您需要使用 [] 表示法。
尝试这个:
const ContinueReadingFunction = value => {
const newMoreInfo = { ...moreInfo }; // copy moreInfo to avoid mutating state
newMoreInfo[value] = !moreInfo[value];
setMoreInfo(newMoreInfo);
const newAboutButton = { ...aboutButton };
const newProject = { ...project };
if (newMoreInfo[value]) { // no need to use equality check for truthy values
newProject[value] = !project[value];
newAboutButton[value] = Up;
} else {
newProject[value] = false;
newAboutButton[value] = Down;
}
setProject(newProject);
setAboutButton(newAboutButton);
};
推荐阅读
- socket.io - websocket传输的Socket.io问题
- javascript - 我的 FireBase 登录程序不适用于我的学校项目
- python - 在我的本地计算机上正确保存带有英文关键字的波斯文本
- javascript - 如何在逗号分隔的字符串中替换字符串计数逗号?
- boto3 - 如何从 SecretStringTemplate(旋转秘密 cloudformation 模板代码)中的文件递归地传递用户名作为参数?
- opengl-es-3.0 - OpenGL ES 3.2+ 是否有类似早期目标 alpha 测试的东西?
- angular - 当我单击角度按钮时如何实现基于推送的架构?
- c# - 无法获取 TCP 消息
- c++ - 找到连接两个移动对象的矩形的 4 个角
- javascript - 如何将 id 从删除按钮传递到弹出删除按钮