Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the actual cost of defining new function within react render method?

Tags:

reactjs

I'm trying to clarify the pros/cons of having a new function declaration within react's render method.

Consider a render method like the following:

  render () {
    return (<SomeComponent somePropWithoutEventBind={() => console.log('not so dangerous?')} />)
  }

In the above example, somePropWithoutEventBind doesn't bind to a DOM event: react will check for prop changes and every time render is called this prop has changed - because it's a new function - so it never matches the previous, this is expensive but nothing tremendous.

Now in this case

  render () {
    return (<input onChange={() => console.log('dangerous?')} />)
  }

onChange prop does bind to DOM (doing something like addEventListener) so every render will have to removeEventListener and addEventListener again? Is this the main reason behind avoiding to declare functions inside the render method?

If possible, please justify your answer pointing to react source code.

like image 276
enapupe Avatar asked Jan 31 '18 18:01

enapupe


People also ask

What is actually rendered by React render method?

React renders HTML to the web page by using a function called render(). The purpose of the function is to display the specified HTML code inside the specified HTML element. In the render() method, we can read props and state and return our JSX code to the root component of our app.

Is it mandatory for each React component to have a render () function?

render() The render() method is the only required method in a class component.

Why is React rendering 3 times?

You can see in the console tab, that the render lifecycle got triggered more than once on both the app and greeting component. This is because the React app component got re-rendered after the state values were modified, and it also re-rendered its child components.

What happens when you call setState () inside render () method?

Because setState() function changes the state of the application and causing a change in the state called the render() function again. So if you write something like this then calling the function stack will go for infinity and application gets the crash.

What is the use of reactdom render () method?

The ReactDOM.render () method is used to render react elements or components to a DOM node. If you want to display React elements of components on the web page, then you can use ReactDOM.render () method.

What is an element in react rendering?

Rendering Elements. Elements are the smallest building blocks of React apps. An element describes what you want to see on the screen: const element = <h1>Hello, world</h1>; Unlike browser DOM elements, React elements are plain objects, and are cheap to create. React DOM takes care of updating the DOM to match the React elements. Note:

How to change the state of a react application when rendering?

In the render () method, we cannot change the state, and we cannot cause side effects ( such as making an HTTP request to the webserver). Step 1: Create a React application using the following command. Step 2: After creating your project folder i.e. foldername, move to it using the following command.

What is conditional rendering in react?

Conditional Rendering. In React, you can create distinct components that encapsulate behavior you need. Then, you can render only some of them, depending on the state of your application. Conditional rendering in React works the same way conditions work in JavaScript.


1 Answers

The main reason of avoiding defining new functions in render is to avoid over rendering.

Consider bind a new function onto a DOM element (react element not real DOM) like so: <button onClick={_ => this.setState({ hide: true })}>Hide Me</button>} there's almost none cost at all, since DOM elements gets re-rendered anyways. (site note: react doesn't use native DOM events like add/removeEventListener, it uses SyntheticEvent and your code targets virtual DOM aka react element not real DOM)

However for a custom components (In large codebase we typically have lots of complex Container Component composed of Functional/Class Child Components. Let's say you have something like

render() {
  // you won't run into unnessary re-render issue 
  // when you use `onClick={this.handleClick}` since the function reference doesn't change
  // while most perf tricks done by react bindings are relying on shallow compare of props/state
  return (
    <ComplexContainer onClick={_ => this.setState({ forceReRender: true})}>
      <Child1 />
      <Child2>
        <NestedChild1 />
        <NestedChild2 />
      </Child2>
    </ComplexContainer>
  )
}

If you do this way, this will cause the whole render tree starting from ComplexContainer to re-render, this may have notable negative perf impacts, but you will need DevTools profiling to benchmark.

In fact, the real thing i wanna say is: it might not be that huge as you concern, avoid premature optimization can be more important. Give this awesome reading material a shot: React, Inline Functions, and Performance

A bit more info regarding react synthetic event system here, it's simply a wrapper of native DOM events to normalize the subtle differences of events among different browser vendors. The API would be the same event.preventDefault()/event.preventPropagation() etc works as it is, but you get cross-browser compatibility for free. Regarding how it works internally please see event delegation

like image 91
lxyyz Avatar answered Oct 05 '22 12:10

lxyyz