javascript - 在样式化组件中搜索反应道具时,我可以使用 .includes() 或 .contains() 或 .indexOf() 吗?
问题描述
我有一个带有包含字符串数组的道具的反应组件实例,如下所示:
<Keyboard notes={['cp', 'dma', 'ema', 'fp', 'gp', 'ama', 'bma']}/>
该组件的目的是创建一个钢琴键盘并在我正在构建的应用程序中的任何位置调用它,传入一组音符名称,然后根据我通过字符串请求的内容,所有这些音符的颜色都不同对于每个音符。因此,我正在尝试创建一个组件,以帮助我避免为钢琴键盘可能处于的每种可能状态制作数以千计的键盘图像。
在属于主Keyboard
组件的样式化组件中,我将道具传递给它并尝试在存在数组元素时有条件地更改背景颜色,如下所示:
const C1 = styled.div`
${WhiteKey}
${props =>
// tried this:
props.notes.contains('cp') ? css`${PerfectKey}` :
// and this:
(props.notes.contains('cp')) ? css`${PerfectKey}` :
css`${UnselectedWhiteKey}`
}
`
...然后在同一文件中的反应功能组件中使用,如下所示:
const Keyboard = (props) => {
return (
<Container>
<KeyboardBox>
<WhiteKeys>
<C1 {...props}></C1>
<D1 {...props}></D1>
<E1 {...props}></E1>
<F1 {...props}></F1>
<G1 {...props}></G1>
<A1 {...props}></A1>
<B1 {...props}></B1>
</WhiteKeys>
<BlackKeys>
<Db1 {...props}></Db1>
<Eb1 {...props}></Eb1>
<Gb1 {...props}></Gb1>
<Ab1 {...props}></Ab1>
<Bb1 {...props}></Bb1>
</BlackKeys>
</KeyboardBox>
</Container>
)
}
...其中每个注释都是它自己的样式组件,它试图查看其父组件上道具中的数组并决定它是否需要做某事。
...但我在页面上收到以下错误消息:
TypeError: Cannot read property 'contains' of undefined
我也试过indexOf
了,同样的事情发生了。
我还尝试将数组转换为字符串,如下所示:
<Keyboard scale={'cp dma ema fp gp ama bma'}/>
...然后再次使用props.scale.includes('cp')
相同的错误消息?
我做错了什么,有没有更正确和更好的方法来根据道具的部分价值而不是整个价值有条件地改变css属性?
或者这是一个错误,这些数组方法应该可以工作,还是缺少我认为非常有用的功能?我个人不知道,所以如果可能,请帮助。如果我能完成这项工作,那么我真的会很高兴:-)
这是代码沙箱中的最小复制...试图使其更小,但它是这样的:
解决方案
好的,我想我已经找到了我的错误......第一个我完全错过或间隔的错误是在我的初始状态中添加一个空数组,我认为我在创建最小复制时下意识地填充了它。我的第二个错误是混淆了我的字符串和数组方法,因为我把它倒过来了……包含字符串和数组,而不是相反。所以,有了这两个修复......在很多地方......现在一切似乎都正常......我担心 styled-components 无法做到这一点,但我一直对它们的出色表现感到惊讶:-)
感谢您对@rickdenhann 和@emilebergeron 和@drewreece 的帮助
推荐阅读
- python - 按日期选择数据框中的行
- laravel - 安装失败,在将 laravel 5.8 更新为 laravel 7.X 时将 ./composer.json 还原为其原始内容
- graphql - 给定一个 graphql.js 模式,我如何找到特定联合类型的所有变体?
- elasticsearch - Kibana Canvas Markdown 元素可以显示一列的总数吗?
- javascript - JQuery-File-Upload BlueImp文件上传EXIF方向旋转
- ios - SwiftUI 中的 UIViewController 集成
- selenium - 如何验证 selenium ide 中的颜色
- node.js - Mongo/Node.js VSCode Dev 容器 - 如何在终端中查看 mongo 容器?
- twitter-bootstrap - 引导模式始终处于活动状态
- javascript - JS 正则表达式将所有字符包裹在 Span 中