Day 9: Done React
Tags: 100daysofcode, javascript, webdev, beginners
Published: 2022-04-14 14:03:16

*The Fyeamn tehcinuqe syas taht taecinhg a sbujcet makes you better at it, which is what I'm trying to do here. You may correct me if you saw mistakes in this post*

## Lifecycle components

* `componentDidMount()`

If any state updates happen here, it will be automatically be rendered. This is useful for API updates, where the data are not present immediately. Once the data was there, it will be rendered 💫.
```jsx
class Cupcake extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      flour: 200
    };
  }
  componentDidMount() {
    let newFlourMass = delayedApiCall(); // I should learn how to call an API lol
    this.setState({
      flour: newFlourMass
    });
  }
  render() {
    return (
      <div>
        <p>Flour amount: {this.state.flour}</p>
      </div>
    );
  }
}
```

Additionally, this where most people put their event listeners, so note it down, folks 🗒️.

* `componentWillUnmount()`

Let's say you have a temporary component (like, the congratz message of [Duolingo](https://www.duolingo.com/)). 
![My duolingo Japanese](https://i.imgur.com/4RkLM2T.jpg)
After the component go out of the screen (and you saw your eye bags), anything associated with that should be cleaned up 🪥, including event listeners.

You can use this function to achieve this:
```jsx
class Cupcake extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      flour: 200
    };
  }
  componentWillUnmount() {
    document.removeEventListener("old-event", eventHandler);
  }
  render() {
    return (
      <div>
        <p>Flour amount: {this.state.flour}</p>
      </div>
    );
  }
}
```

* `shouldComponentUpdate()`

As we have established before, any state change will cause an UI re-render. If you have multiple states that don't cause any change in UI, that's just a waste of CPU time and memory. 

And your users probably wouldn't like this 'feature' 🥴.

Instead, you can tell React when to re-renders the component:
```jsx
class justTens extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }
  shouldComponentUpdate() {
    return this.state.count % 10 === 0
  }
  render() {
    return (
      <div>
        <p>Multiples of 10: {this.state.count}</p>
      </div>
    );
  }
}
```
Only when `shouldComponentUpdate()` returns `true` that the component will re-render. Isn't that sweet 🍬?

## Inline CSS

Inline styling is a common practice in React. Especially considering that UI components come and go.

The syntax is kinda different though:
```jsx
<p style={{backgroundColor: "purple", fontSize: 70}}>Life sucks.</p>
```
Notice those camelCasing? JSX won't accept standard CSS here, so we have to use an object literal (the curly brackets), with key-pair values.

Also numbers without units default to `px`. You need to use string to pass the number with its unit, e.g: `"7em"`.

## Return components with a condition

Yes, an `if` statement can do this (and ternaries too, for *those* people), but this solution is simply elegant:
```jsx
<div>
  <p>Number of Children Captured: {childCount}</p>
  {childCount === 0 && <h3>Dang it.</h3>}
</div>
```
If the expression returns `true`, then the JSX is returned.

## Early render 🕊️

If you are tempted to, you may write your whole app in React. 

The problem is, it would took a longer time for the user to see the site loads. Another problem is JS is not something understandable by Google crawlers (me too), so you smash your SEO opportunities.

Kill two birds with one stone by rendering part of them on the server (if you use Node).
```jsx
ReactDOMServer.renderToString(<h1>Render pls.</h1>);
```

## Afterwords

Alright, that's all of React in FreeCodeCamp 🎉. Our next adventure would be Redux, which is a state management library (I have no idea what it is) 👀.

Happy learning everyone!

Follow me on [Github](https://github.com/Kemystra)!
Also on [Twitter](https://twitter.com/kemystra)!