13

How would I go about adding multiple style attributes to my React element?

Some of the components in my app are using the same styles throughout with minor variations in styles. I am trying to accomplish something along the lines of <div style={this.styles.mainStyle, this.styles.variationInStyle}></div>.

These styles are in a file called styles.js hence the this.styles.x. It works with only one style in it. The closest I found to this solution was in a Reddit Post. The solution was <div style={$.extend({}, style1, style2)}></div> but of course, it doesn't work nor does the variation <div style={style1, style2)}></div>.

Any insight would be greatly appreciated! I will also be posting in Reddit and the Reactiflux Discord group if the answer should come from either source, I will post the answer here.

0

2 Answers 2

39

style is just an Object, with css value turn to camelCase, so you could use any way to merge two object, and it should work.

ES6: style={Object.assign({}, style1, style2)}

ES7: style={{...style1, ...style2}}

lodash: style={_.merge({}, style1, style2)}

Sign up to request clarification or add additional context in comments.

4 Comments

How would that work if these styles are in a separate sheet from the component it is being added to? In order to access the styles, I have to type this.styles.style1} Also, the syntax on your ES6 example has an unclosed parenthesis after .assign
I don't get it. What problem are you facing? it just and object, what prevent you from merging two javascript object? If it from two stylesheet then const style1 = require('./style1.css'); const style2 = require('./style2.css'); Or if it's inline style then it's already an object, isn't it?
In React Native you can use an array inside curly brackets: style={[style1, style2]}
@SteffoDimfelt Failed to set an indexed property [0] on 'CSSStyleDeclaration': Indexed property setter is not supported.
11

as @michealmuxica said, the style prop is is just a JS object with camel casing for the keys. So you can set your style on your components as such:

<MyComponent style={{height:"100%", marginLeft:"70%"}} />

I prefer to create another JS file per component to contain the style objects, then import them into the component's file. I feel like this keeps the code more clean and modular:

//in MyComponentStyles.js
var style = {
    base:{
        height:"100%",
        width: "100%",
        marginLeft: "auto",
        marginRight: "auto"
    },
    //...other styles...
};
export default styles;


//in MyComponent.js
import {default as MyComponentStyles} from "./<path to styles>/MyComponentStyles.js;

var App = React.createClass({ 
    render: function() {
        return ( <MyComponent style={MyComponentStyles.base} /> );
    }
});

2 Comments

I'm getting an 'Unexpected token export' error with this
The answer for this question may help: stackoverflow.com/questions/33448675/… I'm using babel and have been caught up on the presets before, too.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.