reactjs - 从不同的组件访问父元素?
问题描述
我有一个在我的主 app.js 组件中传递的按钮组件,我需要更改按钮的父元素的样式。显然 parentNode 没有遵循反应规则,那么如何以反应方式更改按钮 parentNode 类的样式?有多个“学生容器”。如何显示:仅阻止所选按钮的父元素?
应用程序.js
import Button from "./components/Button";
function App() {
{student
.filter(
(name) =>
name.firstName.toLowerCase().includes(studentFilter) ||
name.lastName.toLowerCase().includes(studentFilter)
)
.map((students) => {
return (
<div key={students.id} className="student-container">
<img alt="students" className="student-img" src={students.pic} />
<div className="student-column">
<p className="student-item">
{" "}
{students.firstName} {students.lastName}
</p>
<div className="display-score-container">
{students.grades.map((test, index) => {
return (
<p key={index} className="student-score">
Test {index + 1}:{" "}
<span className="student-percentage">{test}%</span>
</p>
);
})}
</div>
</div>
<Button></Button>
</div>
);
})}
}
按钮.js
export default function Button() {
const [buttonLabel, setButtonLabel] = useState("+");
const toggleButtonLabel = (e) => {
setButtonLabel(buttonLabel === "+" ? "-" : "+");
//e.target.parentNode.style.display = "block"//
};
return (
<>
<button onClick={toggleButtonLabel} className="expand-btn">
{buttonLabel}
</button>
</>
);
}
解决方案
我的想法是将数组映射的返回值包含到 Button 组件中。然后使用三元检查是否选择了特定按钮,将className
道具添加到该确切组件。我对 props 使用传播语法。
如果条件为真,则将对象{className: 'student-container'}
作为道具传播,如果条件为假,则传播空对象{}
,即不添加任何道具。
应用程序.js
import Button from "./components/Button";
function App() {
return (
<SomeParentComponents>
<SomeOtherParentComponents>
{student
.filter(
(name) =>
name.firstName.toLowerCase().includes(studentFilter) ||
name.lastName.toLowerCase().includes(studentFilter)
)
.map((studentItem) => <Button studentItem={studentItem} />)}
</SomeOtherParentComponents>
</SomeParentComponents>
}
按钮.js
export default function Button(props) {
const {studentItem} = props;
const [buttonLabel, setButtonLabel] = useState("+");
const toggleButtonLabel = () => {
setButtonLabel(buttonLabel === "+" ? "-" : "+");
};
return (
<div key={studentItem.id} ...(buttonLabel === '+' ? {className: 'student-container'} : {})>
<img alt="students" className="student-img" src={studentItem.pic} />
<div className="student-column">
<p className="student-item">
{` ${studentItem.firstName} ${studentItem.lastName}`}
</p>
<div className="display-score-container">
{studentItem.grades.map((test, index) => {
return (
<p key={index} className="student-score">
{`Test ${index + 1}: `}
<span className="student-percentage">{`${test}%`}</span>
</p>
);
})}
</div>
</div>
<button onClick={toggleButtonLabel} className="expand-btn">
{buttonLabel}
</button>
</div>
);
}
这就是 React Component 的美妙之处,对吧。您可以将多个基本 html 组件添加和组合成个性化组件,并调整其样式或状态。
PS我使用一些个人偏好的代码风格作为例子:
- 更喜欢使用带反引号的字符串文字和
${variableName}
- 有一些自由重命名变量名(大胆的,有时是冒犯性的举动!),当然你可以根据你的个人喜好或编码风格标准重命名
推荐阅读
- javascript - Discord.JS:欢迎信息
- python - 根据最大值从 15 分钟间隔重新采样熊猫数据帧到每天
- python - 如何有效地获取过滤后的查询集的随机元素?
- java - 如何使用 apache poi 将自定义项目符号添加到 word 文档
- sql - 带有可分页 SQL 语法错误的 Spring 数据本机查询
- python - 我的 tkinter get() 函数不起作用,我知道为什么
- flutter - 将图像上传到服务器时出现错误
- flutter - 如何在颤动卡刷卡器中制作可重复使用的小部件?
- java - java.lang.NullPointerException:无法调用“java.sql.Statement.executeQuery(String)”,因为“
“ 一片空白 - c++ - 如何在windows中执行makefile和编译C++文件?