我需要添加一个动态类到常规类的列表,但不知道如何(我使用babel),类似这样的东西:
<div className="wrapper searchDiv {this.state.something}">
...
</div>
什么好主意吗?
我需要添加一个动态类到常规类的列表,但不知道如何(我使用babel),类似这样的东西:
<div className="wrapper searchDiv {this.state.something}">
...
</div>
什么好主意吗?
当前回答
你可以使用这个npm包。它处理所有事情,并基于变量或函数为静态类和动态类提供选项。
// Support for string arguments
getClassNames('class1', 'class2');
// support for Object
getClassNames({class1: true, class2 : false});
// support for all type of data
getClassNames('class1', 'class2', ['class3', 'class4'], {
class5 : function() { return false; },
class6 : function() { return true; }
});
<div className={getClassNames({class1: true, class2 : false})} />
其他回答
尽管上面所有的答案都很好,但引起我注意的是字符串插值解决方案。因此,我想提出一种使用自定义StringBuilder的不同方法。
这是它的实现。
class StringBuilder {
static Builder() {
class Builder {
constructor() {
this.bucket = [];
}
append(str) {
if (str !== null) {
this.bucket.push(str);
}
return this;
}
build() {
return this.bucket.join(' ');
}
}
return new Builder();
}
}
然后在组件中像这样使用它。
const Field = (props) => {
const { label } = props;
const [hasFocus, setFocus] = useState(false);
const labelClasses = new StringBuilder.Builder()
.append('form-control')
.append(hasFocus ? 'has-focus' : null)
.build();
const turnOnFocus = () => setFocus(true);
const turnOffFocus = () => setFocus(false);
return (
<div onClick={turnOnFocus} onBlur={turnOffFocus} className="form-group">
<input
type="text"
defaultValue=""
onChange={setValue}
/>
<label className={labelClasses}>{label}</label>
</div>
);
};
通常,如果您有更多需要动态CSS类的元素,您可以为该特定元素实例化另一个构建器。此外,如果类以相同的逻辑出现在多个元素中,则解决方案是将该逻辑提取到方法或函数中。
如果你需要根据状态条件显示的样式名,我更喜欢使用这种结构:
<div className={'wrapper searchDiv' + (this.state.something === "a" ? " anotherClass" : "")'}>
className={css(styles.mainDiv, 'subContainer')}
这个解决方案在React SPFx中进行了尝试和测试。
同时添加import语句:
import { css } from 'office-ui-fabric-react/lib/Utilities';
const ClassToggleFC= () =>{
const [isClass, setClass] = useState(false);
const toggle =() => {
setClass( prevState => !prevState)
}
return(
<>
<h1 className={ isClass ? "heading" : ""}> Hiii There </h1>
<button onClick={toggle}>Toggle</button>
</>
)
}
我只是简单地创建了一个功能组件。在里面,我采取一个状态,并设置初始值为false..
我有一个按钮切换状态..
每当我们改变状态渲染组件时,如果状态值(isClass)为假,h1的className应该是""如果状态值(isClass)为真,h1的className应该是"heading"
尝试使用钩子:
const [dynamicClasses, setDynamicClasses] = React.useState([
"dynamicClass1", "dynamicClass2"
]);
并将其添加到className属性中:
<div className=`wrapper searchDiv ${[...dynamicClasses]}`>
...
</div>
添加类:
const addClass = newClass => {
setDynamicClasses([...dynamicClasses, newClass])
}
删除类:
const deleteClass= classToDelete => {
setDynamicClasses(dynamicClasses.filter(class = > {
class !== classToDelete
}));
}