Files
SCM-Manager/docs/en/development/common-pitfall.md

82 lines
1.9 KiB
Markdown
Raw Normal View History

---
title: Common pitfall occurred while developing the SCM V2
---
2020-03-09 08:01:43 +01:00
## React Component is loaded unexpectedly
### Bug
A react component is updated without any changes in the props or states.
### Fix
2020-03-31 17:28:30 +02:00
Use the [why-did-you-update](https://github.com/maicki/why-did-you-update) library to analyze the causes of the updates.
2020-03-09 08:01:43 +01:00
2020-03-31 17:28:30 +02:00
A common cause is the definition of [new functions in render()](https://github.com/maicki/why-did-you-update#changes-are-in-functions-only).
2020-03-09 08:01:43 +01:00
### Example
2020-03-31 17:28:30 +02:00
```javascript
2020-03-09 08:01:43 +01:00
class Main extends React.Component<Props> {
render() {
const { authenticated, links } = this.props;
const redirectUrlFactory = binder.getExtension("main.redirect", this.props);
2020-03-31 17:28:30 +02:00
...
const ActivityRoute = ({ authenticated, links }: RouteProps) => {
return (
<ProtectedRoute
path="/activity"
component={() => <Activity activityUrl={links.activity.href} />}
authenticated={authenticated && links.activity.href}
/>
);
};
}
}
2020-03-09 08:01:43 +01:00
binder.bind("main.route", ActivityRoute);
```
2020-03-31 17:28:30 +02:00
2020-03-09 08:01:43 +01:00
the definition of the Component like this:
2020-03-31 17:28:30 +02:00
```javascript
component={() => <Activity activityUrl={links.activity.href} />}
2020-03-09 08:01:43 +01:00
```
triggers a re-render because:
2020-03-31 17:28:30 +02:00
```javascript
() => <Activity activityUrl={links.activity.href} /> !== () => <Activity activityUrl={links.activity.href} />
2020-03-09 08:01:43 +01:00
```
You can avoid it by binding this function in advance and then reusing it on all renders
2020-03-31 17:28:30 +02:00
```javascript
2020-03-09 08:01:43 +01:00
class ActivityRoute extends React.Component<Props> {
constructor(props: Props) {
super(props);
}
renderActivity = () => {
const { links } = this.props;
return <Activity activityUrl={links.activity.href} />;
};
render() {
const { authenticated, links } = this.props;
return (
<ProtectedRoute
path="/activity"
component={this.renderActivity}
authenticated={authenticated && links.activity.href}
/>
);
}
}
binder.bind("main.route", ActivityRoute);
2020-03-31 17:28:30 +02:00
```