您可以使用jss库从 javascript 操作 css。这是一个非常好的库,可以解决很多情况。看一看。
更新
我会告诉你如何使用它。在主要情况下,组件使用jss-react
如下所示:
import React, { Component } from 'react'
import useSheet from 'react-jss'
// You can use jss directly too!
import jss from 'jss'
import vendorPrefixer from 'jss-vendor-prefixer'
jss.use(vendorPrefixer())
const styles = {
button: {
'background-color': 'yellow'
},
label: {
'font-weight': 'bold'
}
}
class Button extends Component {
render() {
const { classes } = this.props.sheet
return (
<div className={classes.button}>
<span className={classes.label}>
{this.props.children}
</span>
</div>
)
}
}
export default useSheet(Button, styles)
样式是在组件外部定义的,然后使用一个高阶组件来包装它并注入样式。在大多数情况下都可以,但是由于我们需要从组件内部添加 css 规则,因此我们需要使用另一种方法。我们需要使用 jss 作为子元素而不是高阶组件。这将允许我们在方法的帮助下从组件中添加规则addRules()
。
import React, { Component } from 'react';
import ReactCSSTransitionGroup from 'react-addons-css-transition-group'
import useSheet from 'react-jss'
import jss from 'jss'
let styles = {};
const sheet = jss.createStyleSheet(styles, {named: false})
class Foo extends Component {
constructor(props) {
super(props);
this.state ={
isVisible: false
}
}
toggle() {
this.setState({
isVisible: !this.state.isVisible
})
}
render() {
const duration = 500
const { classes } = sheet
sheet.addRules(
{
'.example-enter': {
opacity: 0.01
},
'.example-enter-active': {
color: 'red',
opacity: 1,
transition: 'opacity ' + duration + 'ms ease-in'
},
'.example-leave': {
opacity: 1
},
'.example-leave-active': {
opacity: 0.01,
transition: 'opacity '+ duration +'ms ease-in'
}
}
);
return (
<div className={classes.red}>
<Jss sheet={sheet} />
<a onClick={this.toggle.bind(this)}>Click</a>
<ReactCSSTransitionGroup
transitionName="example"
transitionEnterTimeout={10}
transitionLeaveTimeout={600}>
{ this.state.isVisible ? <div>Visible</div> : null}
</ReactCSSTransitionGroup>
</div>
);
}
}
const map = new WeakMap()
class Jss extends Component {
componentWillMount() {
const {sheet} = this.props
const counter = map.get(sheet) || 0
if (!counter) sheet.attach()
map.set(sheet, counter + 1)
}
componentWillUnmount() {
const {sheet} = this.props
const counter = map.get(sheet) - 1
if (counter) {
map.set(sheet, counter)
} else {
sheet.detach()
map.delete(sheet)
}
}
render() {
return null
}
}
export default Foo
要记住一件事。默认情况下,jss
为类添加一些后缀,以摆脱全局选择器并隔离它们。一个类看起来像:.example-enter-441163035
. 如果我们className
手动设置属性,使用这种方法会很舒服,比如:<div className={classes.button}>
. 因此,或者您必须手动设置转换类,如下所示:
<ReactCSSTransitionGroup
transitionName={{
enter: classes.example-enter,
enterActive: classes.example-enter-active,
leave: classes.example-leave,
leaveActive: classes.example-leave-active.
}}
transitionEnterTimeout={10}
transitionLeaveTimeout={600}>
或者您必须通过设置named
选项来使用全局选择器,就像false
在启动工作表时一样(就像我在示例中所做的那样):
const sheet = jss.createStyleSheet(styles, {named: false})
希望能帮助到你!不过,看看这个库。这真的很酷,并促进了一种非常有趣的 CSS 方法。