【发布时间】:2020-04-28 15:58:07
【问题描述】:
我有这个函数组件用于将跨度呈现为条形。当我渲染组件时,我将 scrolled 作为 false 传递。然后,当我滚动 150 像素时,jQuery 将属性更新为 true。我知道使用 jQuery 不是一个好习惯,我正在从中迁移。目前,我想让它发挥作用,因为我仍在学习功能组件。
export default function Button(props) {
const [scrolled, setScrolled] = useState( props.scrolled );
useEffect(() => {
setScrolled(props.scrolled);
}, [scrolled]);
return (
<HamburgerButton scrolled={scrolled}>
<p>{scrolled}</p>
<span></span>
</HamburgerButton>
);
}
还有这个样式化的组件定义:
const HamburgerButton = styled.div`
...
span {
background: ${props => props.scrolled === 'false' ? props.theme.white : props.theme.black};
}
...
`;
当我滚动时,我看到属性 scrolled 在 DOM 中从“假”变为“真”,但跨度保持白色。此外,带有{scrolled} 的段落标签不会从false 更改。
【问题讨论】:
-
您正在使用
===进行严格的相等性检查,但是将布尔值与字符串进行比较,因此它们永远不会相等。应该只是props.scrolled === false -
@Jayce444 实现此更改使元素保持白色,并且在
scrolled属性更改时不会更改。看来,当 jQuery 更改属性时,它会将布尔值转换为字符串。 -
@Casey
!props.scrolled || props.scrolled === 'false' ? props.theme.white : props.theme.black?涵盖两种情况 -
我试过
background: ${props => !props.scrolled || props.scrolled === false ? props.theme.white : props.theme.black};,但是当scrolled="true"作为组件的属性应用时,它仍然没有更新颜色。 -
反应钩子的目的是什么?似乎您可以将
props.scrolled直接传递给HamburgerButton。您所做的只是将初始props.scrolled值保存在状态中,并在第一次调用效果时使用相同的值更新它,并且没有其他任何东西会更改scrolled的值以再次触发效果。
标签: reactjs styled-components react-functional-component