JS-201-ReactFundamentals
  • Part 0: App Overview
  • Part 1: Intro to React
    • 1.0: Packages Setup
    • 1.1: Project Setup
    • 1.2: React Router Dom
  • Part 2: JavaScript Concepts
    • 2.0: ES6 Overview
    • 2.1: classes
    • 2.2: constructors
    • 2.3: extends
    • 2.4: super
    • 2.5: interpolation
    • 2.6: map
    • 2.7: filter
  • Part 3: Functional Components
    • 3.0: Functional Components Overview
    • 3.1: Calling Functional Components
    • 3.2: Single Element Rule
    • 3.3: Arrow Functions
    • 3.4: Challenge
    • 3.4: Solution
    • 3.5: Challenge 2
    • 3.5: Solution 2
  • Part 4: JSX Challenge
    • 4.1: JSX Overview
    • 4.1: Challenge Answer
    • 4.2: className
  • Part 5: Class Concepts
    • 5.1: State
    • 5.2: setState
    • 5.3: Class Components Challenge
    • 5.4: Class Components Challenge Answer
  • Part 6: Props Starter
    • 6.0: Props Overview
    • 6.1: Props Demo and Challenge 1
    • 6.2: Props Answer 2
    • 6.3: Props Passing Functions and Challenge 2
    • 6.4: Props Answer 2
    • 6.5: External Props and Mapping Components
    • 6.6: PropTypes
  • Part 7: Lifecycle Methods
    • 7.0: Lifecycle Overview
    • 7.1: Lifecycle Methods
    • 7.2: Mounting Methods
    • 7.3: Update Methods
    • 7.4: Unmount Methods
  • Part 8: Apps
    • 1.0 - Small Timer Apps
      • 1.1 - Simple Timer
      • 1.2 - Clock App
      • 1.3 - Stop Watch App
      • 1.4 - Challenge
    • 2.0 - Concept List
      • 2.1 - Concept Data
      • 2.2 - Concept App Component
      • 2.3 - Concept Component
      • 2.4 - Concept List Component
    • 3.0 - NYT
      • 3.1 - NytApp Component
      • 3.2 - Nyt Results
    • 4.0 - The Friend List App
      • 4.1 - Friend List App Component
      • 4.2 - Friend Component
    • 5.0 - Movie Search Application
      • 5.1 - Form Component
      • 5.2 - Form Results Component
      • 5.3 - Styled Components
    • 6.0 - YouTube Api
      • 6.1 - Video Component
      • 6.2 - Video Component
      • 6.3 - Video Component
    • 7.0 - Github Api Application
      • 7.1 - The Users
      • 7.2 - Github API Component
      • 7.3 - Github API Card
      • 7.4 - Github API Card Form
      • 7.5 - Github API Card List
      • 7.6 - Github API Search
      • 7.7 - Github API Challenge
    • 8.0 - Bitcoin Api Application
      • 8.1 - Bitcoin API Setup
      • 8.2 - Bitcoin API Fetch
      • 8.3 - Bitcoin API Line Chart
      • 8.4 - Bitcoin API Fetching Data
      • 8.5 - Bitcoin API Info Box
      • 8.6 - Bitcoin API Completed Code
    • 9.0 - Google Maps Api Challenge
    • 10.0 - Sound Cloud App Challenge
    • 11.0 - VR App Challenge
    • 12.0 - React Native Intro
  • Part 9: Project
  • Part 10: Notes
    • 10.1 - Resources
    • 10.2 - Troubleshooting
Powered by GitBook
On this page
  1. Part 6: Props Starter

6.3: Props Passing Functions and Challenge 2

Props are capable of passing so much more than simple strings! Props can pass from parent component to child component strings, objects, arrays, functions, and even JSX. Over the next 2 pages we're going to add state to our class component, build out 4 methods, and pass those methods to our functional component. We'll see that these methods can be triggered from outside the class where they're built.

Inside the PropsDemo component, let's add a constructor to initialize our state:

constructor(){
    super();
    this.state = {
        color: 'white',
        backgroundColor: 'blue',
        borderRadius: '5px',
        borderStyle: 'dashed',
        display: 'inline-block',
        width: '300px',
        textAlign: 'center'
    }
}

This state object is storing style properties that will show up within our parent class component. We'll see these used next. Let's add a new div around our 4 FunctionalComp calls. This div will display our style options. Your updated render should look as follows:

render(){
    return(
        <div className="main">
            <div className="mainDiv">
                <div style={this.state}>
                    <FunctionalComp string="will this display?"/>
                    <FunctionalComp string="Binary Solo! 1001001"/>
                    <FunctionalComp string="Vader > Snoke"/>
                    <FunctionalComp string="You're a wizard, Harry!"/>
                </div>
            </div>
        </div>
    )
}

You should be seeing the following display:

Great! We can see that our state object is being used to control the style attribute of the div inside our render. In our class component, let's go ahead and build out a method that will let us control the style we see. We'll pass this method to FunctionalComp and use them when we click a button. It'll be cool!

Let's add the following code inside our PropsDemo class between the constructor and the render:

    colorToggle = () => {
        this.setState({
            color: this.state.color === 'white' ? 'red' : 'white'
        })
    }

Notice again that we're using an ES6 arrow function to build out our method. The arrow function makes sure that the this keyword in our method body refers to the class object, rather than the FunctionalComp body where it will be used. Let's pass that function down to the child! Update your FunctionalComp calls inside render to look like the following:

    <FunctionalComp string="will this display?" function={this.colorToggle}/>
    <FunctionalComp string="Binary Solo! 1001001" function={this.colorToggle}/>
    <FunctionalComp string="Vader > Snoke" function={this.colorToggle}/>
    <FunctionalComp string="You're a wizard, Harry!" function={this.colorToggle}/>

Finally, let's use that function within our child component. Let's update the return inside our FunctionalComp to look as follows:

<div>
    <p>{props.string}</p>
    <button onClick={props.function}>Press Me!</button>
</div>

You should see the following output, with all 4 buttons being able to control the color of the text/border:

So what's happening? We build out a method (function) in our class component. All it's responsible for is setting the state of our class component. However, this method doesn't get used in the class component. We define a new prop called function, and this prop passes down our function to FunctionalComp. The button we build out in FunctionalComp has an onClick event handler that fires our colorToggle method when it's clicked. Thus, the child component is indirectly affecting the state of our parent component! Pretty cool!

Your challenge to complete for the next page is to do the following--build out 3 more methods within PropsDemo that control backgroundColor, borderRadius, and borderStyle. Each method should toggle something about these style properties in some way. Pass these methods down as separate function props to the bottom 3 FunctionalComp calls inside of render. The end result is that each button will control something different about the DOM!

Previous6.2: Props Answer 2Next6.4: Props Answer 2

Last updated 6 years ago

Our Styled Div
Our New Button HUD