5

I want to apply external css to a react component with a link tag. However, when I include the component in another project then the css is applied on the parent project also, which is normal.

How can I avoid this? I want the 'parent css' to be applied on the component but because the component is lazy loaded the css will not do its thing on it.

stijn.aerts
  • 6,026
  • 5
  • 30
  • 46

2 Answers2

1

The best way I've found to use styles in react to avoid that type of problem is the use of styled-components (23k+ stars on github)

Example of styled-components usage:

const Button = styled.a`
  /* This renders the buttons above... Edit me! */
  display: inline-block;
  border-radius: 3px;
  padding: 0.5rem 0;
  margin: 0.5rem 1rem;
  width: 11rem;
  background: transparent;
  color: white;
  border: 2px solid white;

  /* The GitHub button is a primary button
   * edit this to target it specifically! */
  ${props => props.primary && css`
    background: white;
    color: palevioletred;
  `}
`

render(
  <div>
    <Button
      href="https://github.com/styled-components/styled-components"
      target="_blank"
      rel="noopener"
      primary
    >
      GitHub
    </Button>

    <Button as={Link} href="/docs" prefetch>
      Documentation
    </Button>
  </div>
)

Ref: https://www.styled-components.com/

 External CSS

If you are using external css you can parse it with:

import { css } from "styled-components";

// Css loaded as string and passed to css method of styled-components
export const borderBottom = css`
    &:after{
        content: "";
        display: block;
        height: 3px;
        width: 200px;
        background-color: ${props => props.color || "black"};
        /* position */
        position: absolute;
        bottom: 0;
        left: 50%;
        transform: translateX(-50%);
`;

Be aware that if you want to pack your css as string an edit to your webpack config may be needed.

Another way to import existing styles in styled-components

import React, { Component } from "react";
import ReactDOM from "react-dom";
import Styled from "styled-components";

const fetchStyles = () =>
  fetch(
    "https://gist.githubusercontent.com/bionicvapourboy/61d3d7a8546cb42e0e3194eb9505f48a/raw/5432218dd83320d53d1cbc2f230b81c765183585/style.css"
  ).then(response => response.text());

class App extends Component {
  state = {
    style: ""
  };

  componentDidMount() {
    fetchStyles().then(data => this.setState({ style: data }));
  }

  Wrapper = () => Styled.div`
    ${this.state.style}
  `;
  render() {
    const Wrapper = this.Wrapper();
    return (
      <div className="App">
        <Wrapper>
          <h1>Styled</h1>
        </Wrapper>
        <h1>Not Styled</h1>
        <h2>Start editing to see some magic happen!</h2>
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

https://codesandbox.io/s/yw7xmx6x3x

Community
  • 1
  • 1
Mosè Raguzzini
  • 15,399
  • 1
  • 31
  • 43
-1

You can try using this:

import React from 'react'

let cssLoaded = false;

export default class MyComponent extends React.Component {
    render() {
        if (cssLoaded === false) {
            cssLoaded = true;
            import('./MyComponentStyle.css');
        }

        // other stuff
    }
}

And in your css file: @import url('example.com/styles.css'); Source: React: Load component's CSS only when component is rendered

  • The code is in a separate repository so I can't do this. I have Project A which has its own css files and a web-component is loaded in there. I want the css of project A to be applied to the web component – stijn.aerts Apr 24 '19 at 12:17
  • @stijn.aerts can't you create a custom .css file for your component? – ProblemsEverywhere Apr 24 '19 at 12:20