javascript - 切换边框并在反应中选择onClick
问题描述
我正在尝试使用钩子来更改 onClick 的反应状态。我使用 .map 制作了具有不同道具的“卡片”列表,我想将其制作成一个表单,我可以在其中单击其中一张卡片,边框/css 将更改并且卡片将被选中。
我不确定是否应该将这个钩子放在页面中并传递给组件或直接放在组件中。(现在我在页面中选择了组件中的样式,但它不起作用)
到目前为止,我可以在点击时改变颜色,但如果我点击另一张卡片,它不会改变另一张卡片。我有几页我必须在上面做类似的事情,所以任何建议都值得赞赏!
这是页面的代码:
const LemmeUpgradeYa = () => {
const [path, setPath] = useState('/');
const cardSelector = () => {
// setPath('/${plans.plan}');
console.log(AllPlans.AllPlans);
};
useEffect(() => {
cardSelector();
});
return (
<React.Fragment>
<Card>
<style>
@import url('https://fonts.googleapis.com/css2?family=Martel+Sans:wght@300&display=swap');
</style>
<CardBody className="big-card-plan">
<h1 className="plan-title-one">Upgrade Plan</h1>
<Form>
{AllPlans.AllPlans.map((planItem) => (
<Cards onClick={cardSelector} key={planItem} {...planItem} />
))}
<a href={path}>Continue</a>
</Form>
</CardBody>
</Card>
</React.Fragment>
);
};
export default LemmeUpgradeYa;
这是组件的代码:
const Cards = (plans) => {
const [border, setBorder] = useState('profile-box-one');
const cardSelector = () => {
setBorder('profile-box-two');
setPath('/${plans.plan}');
};
const selectChange = () => {
setBorder('profile-box-one');
};
useEffect(() => {
selectChange();
}, []);
return (
<React.Fragment>
<Card className={border} onClick={cardSelector} onChange={selectChange}>
<Row>
<Col className="float-left max-width-plan">
<div className="plan-selector">Current Plan:</div>
<div className="center-text plan-font">{plans.plan}</div>
</Col>
<Col className="float-right padding-plan-top">
<Row>
<Col className="max-plan-width">
<p className="plan-description">{plans.description}</p>
</Col>
<Col>
<div className="plan-price">${plans.price} / month</div>
</Col>
</Row>
</Col>
</Row>
</Card>
</React.Fragment>
);
};
export default Cards;
解决方案
常见的方法是拥有一个Parent
包含所选子 ID 的状态,您将向下传递给每个Child
当前选择的和要选择的函数。在 child 你可以比较它是否被选中来选择正确的 CSS 类。
obs:在Cards
你命名props
为plans
. 尽管您可以随心所欲地命名,但遵循约定并将其称为props
.
下面是您如何处理应用于您的代码的问题:
const LemmeUpgradeYa = () => {
const [pickedCard, setPickedCard] = useState(null);
return (
<React.Fragment>
<Card>
<style>
@import url('https://fonts.googleapis.com/css2?family=Martel+Sans:wght@300&display=swap');
</style>
<CardBody className="big-card-plan">
<h1 className="plan-title-one">Upgrade Plan</h1>
<Form>
{AllPlans.AllPlans.map((planItem) => (
<Cards pickedCard={pickedCard} setPickedCard={setPickedCard} key={planItem} plans={...planItem} />
))}
<a href={path}>Continue</a>
</Form>
</CardBody>
</Card>
</React.Fragment>
);
};
export default LemmeUpgradeYa;
const Cards = ({ plans, pickedCard, setPickedCard }) => {
const cardSelector = () => {
setPickedCard(plans.plan);
setPath('/${plans.plan}');
};
const selectChange = () => {
setPickedCard(null);
};
return (
<React.Fragment>
<Card className={`profile-box-${pickedCard ? 'two' : 'one' }`} onClick={cardSelector} onChange={selectChange}>
<Row>
<Col className="float-left max-width-plan">
<div className="plan-selector">Current Plan:</div>
<div className="center-text plan-font">{plans.plan}</div>
</Col>
<Col className="float-right padding-plan-top">
<Row>
<Col className="max-plan-width">
<p className="plan-description">{plans.description}</p>
</Col>
<Col>
<div className="plan-price">${plans.price} / month</div>
</Col>
</Row>
</Col>
</Row>
</Card>
</React.Fragment>
);
};
export default Cards;
推荐阅读
- python - 无法从 python 服务器将图像上传到 Firebase 存储
- flutter - 在 null 上调用 getter 'length' 在预先存在的 json 上调用
- html - 如何保持页面固定
- php - PHP DateTime::__construct():无法解析位置 8 (0) 的时间字符串:意外字符
- google-cloud-firestore - 结合 facebook 登录和正常注册的 firebase 规则
- python - 无法通过 windows 中的诗歌安装 torchvision
- python - 将特定 USB 设备(由产品 ID 和供应商 ID 标识)连接到系统后立即触发 python 脚本
- javascript - 如何与两个数组数据进行比较和更改?
- python - 如何使用fuzzywuzzy 获得此输出?
- android-studio - 在我的 android 应用程序中删除夜间模式 | 安卓工作室