【发布时间】:2019-12-22 05:44:31
【问题描述】:
我正在使用 react,我有一个组件,它只需要渲染孩子并根据条件为他们添加一个类。 最好的方法是什么?
【问题讨论】:
-
This 应该可以帮到你。
标签: reactjs
我正在使用 react,我有一个组件,它只需要渲染孩子并根据条件为他们添加一个类。 最好的方法是什么?
【问题讨论】:
标签: reactjs
我一周前想通了,这就是我想要的:
export default class ContainerComponent extends React.Component {
constructor(props) {
super(props);
this.modifyChildren = this.modifyChildren.bind(this);
}
modifyChildren(child) {
const className = classNames(
child.props.className,
{...otherClassses}
);
const props = {
className
};
return React.cloneElement(child, props);
}
render() {
return (<div>
{React.Children.map(this.props.children, child => this.modifyChildren(child))}
</div>);
}
}
【讨论】:
为了简单起见:
const StyleInjector = ({ children }) => {
const StyledChildren = () =>
React.Children.map(children, child =>
React.cloneElement(child, {
className: `${child.props.className} ${PUT_YOUR_CLASS_HERE}`
})
);
return <StyledChildren />;
};
【讨论】:
{children, className} 和 PUT_YOUR_CLASS_HERE 为 className。使用示例:<StyleInjector className="classsss"><li>dd1</li><li>dd2</li></StyleInjector>.
几周前,我有一个场景要在 react 中实现,没有什么特别的,只是简单地切换活动类。我遵循了这个方法,就像一个魅力,但让我知道这是一个好方法。
{
this.props.children.map((slide, index) => {
return React.cloneElement(slide, {
key: index,
className: (this.state.currentActiveIndex === index) ?'active' : ''
});
})
}
【讨论】:
cloneElement 是 IMO 的最佳方法。您实际上正在使用它的 API。
您可以将一个 prop 向下传递给孩子,它可以选择要应用的类(或者只传递类名,但这更符合语义):
<Parent contentVisible={true}>
<Child />
</Parent>
在您的子渲染中:
const classes = [];
if (props.contentVisible)
classes.push('visible');
<div className={classes.join(' ')} />
【讨论】:
组件的内部渲染方法:
var childClasses = [],
childClassNames;
if (condition) {
childClasses.push('my-class-name');
}
childClassNames = childClasses.join(' ');
return (<div className={childClassNames}>
.... (your component here)
</div> );
【讨论】: