Join egghead, unlock knowledge.

Want more egghead?

This lesson is for members. Join us? Get access to all 3,000+ tutorials + a community with expert developers around the world.

Unlock This Lesson
Become a member
to unlock all features

Level Up!

Access all courses & lessons on egghead today and lock-in your price for life.


    Optimistically Update Multiple Values in State Using React's setState

    Erik AybarErik Aybar

    We'll add a method to our class-based React component and immediately update state before firing off our request. Using a setState updater function, we will update component state based on previous state and toggle the "liked" status of a tweet upon the user clicking the heart icon. We will simultaneously increment or decrement the target tweet's likes property and appropriately add or remove the tweetId from the likedTweets array.



    Become a Member to view code

    You must be a Member to view code

    Access all courses and lessons, track your progress, gain confidence and expertise.

    Become a Member
    and unlock code for this lesson




    Instructor: So far, we've plugged in our like tweet request function, so that when we click like, we can see these fake requests are being fired off. Let's plug in a proper method here so that this onclick like, and we'll add this method to our app.

    Say, "Onclick like," and we know that this is going to accept the tweet id. We can chain onto this, and once that promise resolves, what we can do is we'll just log out for now.

    We will say, "Resolved cache." We run into an error, and we'll just say, "Cached." Now if we click this, we have resolved. If we click this three or four or fail catch, we'll see that we've caught the error.

    We'll add one more log here, just so that we can see that we've clicked the like. Let's paste these in here just so we can get a clearer picture of what we're doing here. I'll just log in these method names for now.

    What we need to do is since we're making the optimistic update, the first thing that we're going to do is we're going to say, "Update state," for this tweet id. We're going to see we click, we're going to update state which we haven't done yet. Then we're going to fire off our request here.

    We're going to use this .setState, and we're updating it based on our previous state. So this is going to accept a function. The first thing we need to do is we need to determine if the tweet is already liked.

    We can do that by peeking at our state.liked tweets, and we can figure out if that includes our tweet id. Now that we know that, we can return our new state. For now, we'll just update our liked tweets array.

    So liked tweets is going to equal, depending on whether we've already liked it or not, we will return state.liked tweets. In the case that we've already liked it, we're going to filter. We're going to keep only the ones that are not the tweet id.

    In our other case, we'll append that to our state.liked tweets, and we'll append our tweet id. So now if we click this, we should see these updating. We can see the heart toggling on and off.

    The next step, we're going to need to reach in and increment or decrement the tweet's like property. Using the same information knowing if it's already liked, we can update the tweet's array based on the current tweet's state.tweets. And we'll map over each of these.

    I'll give us a tweet that we can now check if tweet id = to our tweet id that we're looking for. What we can do is we're just going to update the single property on it, and that's going to be its likes property.

    We're going to either increment or decrement the current value based on whether the tweet is already liked. If it's already liked, we're going to decrement it. Otherwise, we can increment the property.

    Now you have an error here. If it's not the one we're looking for, go ahead and just return the tweet. Now, if we click this, we'll see that the hearts are toggling on and off, and the like count is incrementing and decrement as we would expect.

    Although, as we can see, we have yet to handle the failure case.