React中clsx工具使用疑问:对象类型参数的含义解析
关于clsx中对象参数用法的解释
嘿,我来帮你把这个clsx的用法讲明白~
你已经理解的第一个写法className={clsx(classes.menuButton, open && classes.hide)}是利用了JS的短路求值:classes.menuButton会始终被应用,而只有当open为true时,classes.hide才会被追加进去——因为如果open是false,open && classes.hide的结果就是false,clsx会自动忽略布尔值类型的无效参数。
而第二个例子里的第二个参数{[classes.appBarShift]: open },是clsx支持的另一种更灵活的条件类名写法,核心逻辑是这样的:
- 这个参数是一个对象,clsx会遍历对象里的每一组键值对
- 当某个键对应的值为
true时,clsx就会把这个键作为类名添加进去;如果值为false,就会忽略这个键 - 这里的
[classes.appBarShift]是ES6的计算属性名,意思是用classes.appBarShift变量的实际值(也就是你定义的样式类名)作为对象的键,而不是把字符串"classes.appBarShift"当作类名
举个更直观的扩展例子,如果你有多个条件需要判断,用对象写法会比一堆&&清晰太多:
className={clsx(classes.card, { [classes.cardActive]: isActive, [classes.cardDisabled]: isDisabled, [classes.cardLarge]: currentSize === 'large' })}
这样一眼就能看出来每个类名对应的触发条件,维护起来也更方便。
回到你的问题:这个写法会始终应用classes.appBar,当open为true时,会额外追加classes.appBarShift这个类名;如果open为false,就只会保留classes.appBar。
内容的提问来源于stack exchange,提问作者millport
相关产品推荐
相关产品推荐

