在React中使用内联样式和纯CSS字符串
Use inline style in React with plain CSS string
我正在ReactJS中重写基于AngularJS的现有应用程序。在应用程序中,用户可以提供一个CSS样式字符串来设置某些元素的样式。在AngularJS中,这是没有问题的,我只是将'style'属性设置为给定的字符串。在ReactJS中,我不能再这样做了,因为ReactJS需要一个样式对象。我不想改变应用程序的行为,也不想要求用户现在提供一个与ReactJS兼容的样式对象。是否有任何方法在ReactJS只是使用一个普通的CSS样式字符串来设置元素的样式?
您可以在componentDidMount和componentDidUpdate中使用setAttribute('style', ...)
设置样式字符串
您只需要能够获得对React创建的DOM节点的引用。你可以使用refs
这里有一个例子。这个组件接受一个styleString
道具,并将其设置为它所呈现的<div/>
的样式。
import React from 'react';
class StyledDiv extends React.Component {
componentDidMount() {
this.refs.theDiv.setAttribute('style', this.props.styleString);
}
componentDidUpdate() {
this.refs.theDiv.setAttribute('style', this.props.styleString);
}
render() {
return (
<div ref="theDiv" />
);
}
}
StyledDiv.propTypes = {
styleString: React.PropTypes.string,
};
export default StyledDiv;
这是我为试剂发现的一个hack,但我相信它同样适用于原始反应版本>= 16(其中自定义dom属性被传递)。只需使用大写的STYLE
属性,而不是小写的style
,这是由React拦截。
如果你用的是styled-components
,那就不要看其他答案了。使用v4,您可以直接将字符串传递给css prop到任何html标签或样式组件。
<div css="margin-top: 4px;">
Yes it works just like that :).
</div>
猜猜看,你甚至不需要导入styled-components
。所有你需要做的就是添加这个babel插件。它会把任何带有css prop的元素变成有样式的组件。
做了一个模块来处理这个,叫做Style。这很简单,我想我们都应该回到简单地写CSS。
将样式字符串作为prop传入。
npm install style-it --save
函数语法 (JSFIDDLE)
import React from 'react';
import ReactDOM from 'react-dom';
import Style from 'style-it';
class Intro extends React.Component {
render() {
return Style.it(
this.props.cssText,
<p className="intro">CSS-in-JS made simple -- just Style It.</p>
);
}
}
ReactDOM.render(
<Intro cssText=".intro { color: red; }"/>,
document.getElementById('container')
);
JSX语法 (JSFIDDLE)
import React from 'react';
import ReactDOM from 'react-dom';
import Style from 'style-it';
class Intro extends React.Component {
render() {
return (
<Style>
{this.props.cssText}
<p className="intro">CSS-in-JS made simple -- just Style It.</p>
</Style>
}
}
export default Intro;
ReactDOM.render(
<Intro cssText=".intro { color: red; }"/>,
document.getElementById('container')
);
补充Taylor michels的回答
function CSSstring(string) {
const css_json = `{"${string
.replace(/; /g, '", "')
.replace(/: /g, '": "')
.replace(";", "")}"}`;
const obj = JSON.parse(css_json);
const keyValues = Object.keys(obj).map((key) => {
var camelCased = key.replace(/-[a-z]/g, (g) => g[1].toUpperCase());
return { [camelCased]: obj[key] };
});
return Object.assign({}, ...keyValues);
}
return <div style={CSSstring("margin-top: 4px; top: 100px")}></div>
将样式字符串转换为javascript对象
这是我的解决方案。我生成了一个json对象,像这样
const generatedStyles = {
"background-image": "url('"http:/someurl/foo.JPEG'"),
"background-size": "auto 30px",
"background-position": "center center"
}
我需要一个方法来将它转换为一个新的对象,为响应样式对象使用camelcase键。我已经在我的组件中定义了这个
renameKeys(obj) {
const keyValues = Object.keys(obj).map(key => {
var camelCased = key.replace(/-([a-z])/g, function (g) { return g[1].toUpperCase(); });
return { [camelCased]: obj[key] };
});
return Object.assign({}, ...keyValues);
}
,可以在渲染中使用,如<a style={this.renameKeys(generatedStyles)}>styled link</a>
- 如果文本字段为空,则使用JavaScript应用CSS样式
- FF和Chromium中CSS样式按钮的外观差异
- CSS样式属性留空
- 使用javascript单击同一按钮,在两种样式之间更改css值
- 用CSS在CKEditor中设置预览样式
- Javascript+动态菜单+当前链接样式(CSS)+基于PHP的网站
- 如何使用jQuery转换所有带有动态类的内联样式css
- iFrame 中的实时预览和保存样式.css每 30 秒一次
- 如何更改 jquery UI 数据选择器的样式 (CSS)
- 在Javascript中设置左样式CSS属性以移动滑块
- css+jQuery样式.css切换器,用于新的jQuery版本
- Chrome 29样式/Css问题
- 如何更改工具提示的样式/css
- 字体Awesome与半样式CSS
- Angular2组件样式/css没有被浏览器应用在ngafterviewit中
- 如何改变网页内容,而不删除任何样式/css/图形
- 使用Javascript在不影响打印样式的情况下更改显示样式(CSS)
- 使用 Get Time Javascript 更改样式 CSS
- 自定义下拉列表样式(CSS/JS与ASP.. NET c#连接)
- 为输入类型文件按钮添加禁用样式(css)