Coding Recipes
  • Introduction
  • Welcome
    • Introduction
  • SEO Recipes
    • How can I add more metadata to my page to improve SEO?
  • Console Recipes
    • How to colour text in the browser and server console
  • Array Recipes
    • How can I filter out falsey values?
  • Object Recipes
    • How can I clone an object?
    • How can I destructure an object?
    • How can I pretty-print an object?
    • How can I conditionally add a key-value into an object?
    • How can I pull keys, values and entries off an object?
    • How can I build an object with computed property names?
    • What does 'this' mean?
    • How does inheritance work between objects?
    • How can I build a query string from an object?
    • How to instantiate a class using an object of that class?
    • Nested Ternaries vs Switch Statements
  • String Recipes
    • How can I tokenise a string of values into an array?
    • How can I parse a template string into its constant and variable parts?
  • Function Recipes
    • How to find out where your function is being called from
    • How can I simplify argument validation in a function?
    • How would I handle errors?
    • What types of functions can I rebind 'this' on?
    • How can I find out the length of a function's parameter list?
  • Asynchronous Recipes
    • How do I use fetch?
    • How do I use Promises?
    • How do I use async and await?
    • How do I use jQuery to make async calls?
    • How can I use Axios to make async calls?
    • How can I use Web Workers to achieve parallelism?
  • React Recipes
    • How can I DRY-up passing props to a React component?
    • How can I conditionally render JSX?
    • What are the different types of PropTypes I can use?
    • How can I handle a component throwing an uncaught exception?
    • How can I use context to selectively pass data down a component hierarchy? (2 approaches)
    • How to define a Higher Order Component (HOC) in React
    • What are the different lifecycle methods in React?
    • HOCs vs. RenderProps - How To Share State
    • How to use refs in React (3 Approaches)
  • React Router Recipes
    • How do I install react router 4 as an application dependency
    • What are the different types of routes that I can create?
    • How can I navigate between different types of routes?
    • How can I style the link for the route that is currently active?
    • How can I pass parameters to my routes?
    • How can I match routes by making sure parameters match a specific format?
    • How can I parse query parameters from a route?
    • How can I define a default catch-all route?
    • How can I render multiple components for a single route?
    • How can I create nested routes?
    • How can I redirect from one route to another route?
    • How can I intercept transitioning from one route to another route?
  • Conditional Logic Recipes
    • How can I avoid using multiple if..else if...else if style code?
    • How can I check which of several booleans is true?
  • RxJS Recipes
    • How can I subscribe to a series of numbers?
    • How can I subscribe to an array of numbers?
    • How can I transform an array of numbers?
    • How can I listen to double-click events?
    • How can I create an Observable from something else?
  • Redux Recipes
    • Redux - Architecture
    • React-Redux - Architecture
    • How to define custom middleware for Redux
    • How to enable Hot Module Reloading for a React-Redux-Webpack application
  • GraphQL
    • How can I create a simple GraphQL client and server?
    • Stuff
Powered by GitBook
On this page

Was this helpful?

  1. React Recipes

How can I use context to selectively pass data down a component hierarchy? (2 approaches)

// OLD APPROACH

import React, { Component } from 'react'
import PropTypes from 'prop-types'

class Chapter extends Component {
  static childContextTypes = {
    pageTitle: PropTypes.string.isRequired,        // (1) Define a `pageTitle` to add to context
    paragraphTitle: PropTypes.string.isRequired    // (2) Define a `paragraphTitle` to add to context
  }
  getChildContext = () => ({
      pageTitle: 'page title',                     // (3) Add `pageTitle` to context
      paragraphTitle: 'paragraph title'            // (4) Add `paragraphTitle` to context

  })
  render = () => <Page /> 
}
import React, { Component } from 'react'
import PropTypes from 'prop-types'

class Page extends Component {
  static contextTypes = {
    pageTitle: PropTypes.string.isRequired         // (5) Expose `pageTitle` only to this component
  }
  constructor(props, context) {
    super(props)
    console.log('[x] context', context)            // (6) Context will only have `pageTitle` on it
  }
  render = () => {
    console.log('[x] this.context', this.context)  // (7) Context will only have `pageTitle` on it
    return <Paragraph />
  }  
}
import React, { Component } from 'react'
import PropTypes from 'prop-types'

class Paragraph extends Component {
  static contextTypes = {
    paragraphTitle: PropTypes.string.isRequired   // (5) Expose `paragraphTitle` only to this component
  }
  constructor(props, context) {
    super(props)
    console.log('[x] context', context)           // (6) Context will only have `paragraphTitle` on it
  }
  render = () => {
    console.log('[x] this.context', this.context) // (7) Context will only have `paragraphTitle` on it
    return <p>'All Done'</p>
  }  
}

The context object passed into Chapter will have pageTitle and paragraphTitle added to it

The context object passed into Page will only contain `pageTitle` on it.

The context object passed into Paragraph will only contain paragraphTitle on it.

/// NEW APPROACH

import React, { createContext } from 'react'

class MyContext = createContext()

class MyProvider extends Component {
    state = { name: 'henry' }
    render () => <MyContext.Provider>{this.props.children}</MyContext.Provider>
}

const App = () =>
    <MyProvider>
        <Family />
    </MyProvider>

const Family = () => 
    <div>
        <Person />
    </div>

const Person = () => 
    <MyContext.Consumer>
        {(context) => <p>{context.state.name}</p> }
    </MyContext.Consumer>
PreviousHow can I handle a component throwing an uncaught exception?NextHow to define a Higher Order Component (HOC) in React

Last updated 5 years ago

Was this helpful?