{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/blog/2018-01-28-on-the-importance-of-cleaning-up-after-your-react-component/",
    "result": {"data":{"markdownRemark":{"html":"<p>For the past few months, I've been working on/leading a pretty large feature\ngenerically named \"Assignments.\" It provides the ability for any admin on\nour platform, <a href=\"https://learn.co\">Learn</a>, to give a student something to do.\nThat sounds simple enough in theory, but we had to build this feature with a lot\nof flexibility.</p>\n<p>Each assignment is due at a certain time and can have\nseveral collaborators who are also admins on Learn. In addition, each assignment has\nmultiple tasks that have many types. For example, a task can be either a\ncode challenge or a to-do, can have a submission type of url or checkbox,\nand can have a reviewable type of none, confirmed, or graded.</p>\n<p>The abundance of types makes this project unwieldy. That and the conflation\nof task with assignment because although we were designing this system to be\ngeneric, the primary immediate use case (for code challenges) was incredibly\nspecific. I'm not quite convinced that we handled the types sustainably, but\nit suffices for now. As the credo goes, make it work, make it right, make it\nfast. We definitely made it work...so I'm okay with that.</p>\n<p>Here are some sick gifs from our QA pass of the feature for your viewing pleasure.</p>\n<h3>Admin Assignments Dashboard and Editor</h3>\n<p><img src=\"https://s3-us-west-2.amazonaws.com/talum.github.io/assignmentsadmin.gif\" alt=\"Admin Assignments\"></p>\n<h3>Student Assignment Submission</h3>\n<p><img src=\"https://s3-us-west-2.amazonaws.com/talum.github.io/assignmentssubmission.gif\" alt=\"Student Assignment\"></p>\n<h3>Admin Assignments Grading</h3>\n<p><img src=\"https://s3-us-west-2.amazonaws.com/talum.github.io/admingradeassignment.gif\" alt=\"Admin Assignments Grading\"></p>\n<p>Anyway, the feature has a React-Redux front end and a Rails backend. We\ndesigned the backend using domain-driven design (DDD), and as a result, in\nmany places, the backend feels more like the Phoenix framework than Rails.\nBy the way, Rails gets super angry about autoloading when you heavily\nnamespace. And when Rails gets angry, I also get angry, well, more\nfrustrated than angry.</p>\n<h2>The Problem</h2>\n<p>There are a ton of complex views that need varying amounts of data. But one\nissue that kept cropping up repeatedly while we built this feature was that\nwe kept forgetting to clear out the old assignment data when our routes and\nviews changed.</p>\n<p>We're using React Router to manage routes in our front-end app. This allows\nus to display different components when the routes change, or, in other\nwords, maintain state in the URL. But, when you try to render two different\ncomponents based on the state of a data at the same URL, things can get\ntricky.</p>\n<p>To illustrate the problem, I'll point to a specific case I recently solved.\nWhen an assignment is in a draft state, it's URL is basically\n<code class=\"language-text\">BASE_URL/assignments/:id</code>, where the id is the primary key of the\nassignment record. However, after the assignment is published, the URL\nstays the same, but we instead display a grading view of the assignment\nrather than the editing view. One URL: two very different components.</p>\n<p>To determine which view we display, we need to know some information about the\nassignment. However, we won't know that information at the time the\ncomponent renders because we have to ask the backend for that data.</p>\n<p>I thought about this for a long time and the simplest solution I could think\nof was to have a component that renders and mediates which component to\ndisplay: the <code class=\"language-text\">Editor</code> component or the <code class=\"language-text\">Grading</code> component. I also tossed\naround the idea of having the grading portion live at a different URL, but\nthat became a little unwieldy because the grading view has another two\nsubviews that we display: an overview as well as a master-detail view.</p>\n<p>So, I started with creating a new component I titled the\n<code class=\"language-text\">AssignmentDirector</code>.</p>\n<p>Here's a snippet from the pack file where our primary routes are declared:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>Provider store<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span> store <span class=\"token punctuation\">}</span> <span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Router basename<span class=\"token operator\">=</span><span class=\"token string\">'/admin/assignments'</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span>Switch<span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Route path<span class=\"token operator\">=</span><span class=\"token string\">'/:id(\\d+)/:activeTab?'</span> component<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span> AssignmentDirector <span class=\"token punctuation\">}</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n          <span class=\"token operator\">&lt;</span>Redirect from<span class=\"token operator\">=</span><span class=\"token string\">'*'</span> to<span class=\"token operator\">=</span><span class=\"token string\">'/search/assignments'</span> <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n        <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Switch<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Router<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Provider<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> assignmentsContainer<span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>When the route matches, we render the <code class=\"language-text\">AssignmentDirector</code> component, and we\ndon't yet have the data we need. Even\nthose few microseconds of waiting can throw an error in the view.</p>\n<p>The <code class=\"language-text\">AssignmentDirector</code> component below is a Redux-connected component\nreponsible for determining which sub-component to display.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">AssignmentDirector</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">componentDidMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> fetchAssignment<span class=\"token punctuation\">,</span> history <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> id <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>match<span class=\"token punctuation\">.</span>params\n\n    <span class=\"token function\">fetchAssignment</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> history<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/search/assignments'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">componentDidUpdate</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">prevProps</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> fetchAssignment<span class=\"token punctuation\">,</span> history <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> id <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>match<span class=\"token punctuation\">.</span>params\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>prevProps<span class=\"token punctuation\">.</span>match<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>id <span class=\"token operator\">!==</span> id<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">fetchAssignment</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> history<span class=\"token punctuation\">.</span><span class=\"token function\">replace</span><span class=\"token punctuation\">(</span><span class=\"token string\">'/search/assignments'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>loading<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>Spinner containerHeight<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token number\">125</span><span class=\"token punctuation\">}</span><span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>published<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token operator\">&lt;</span>GradingContainer\n        history<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>history<span class=\"token punctuation\">}</span>\n        id<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>match<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">}</span>\n      <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token operator\">&lt;</span>EditorContainer\n        activeTab<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>match<span class=\"token punctuation\">.</span>params<span class=\"token punctuation\">.</span>activeTab<span class=\"token punctuation\">}</span>\n        history<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>history<span class=\"token punctuation\">}</span>\n      <span class=\"token operator\">/</span><span class=\"token operator\">></span>\n    <span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">mapStateToProps</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>assignments<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    assignment<span class=\"token operator\">:</span> assignments<span class=\"token punctuation\">.</span>editor<span class=\"token punctuation\">.</span>active<span class=\"token punctuation\">,</span>\n    publishAssignmentModalOpen<span class=\"token operator\">:</span> assignments<span class=\"token punctuation\">.</span>editor<span class=\"token punctuation\">.</span>publishAssignmentModalOpen\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>mapStateToProps<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>fetchAssignment<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>AssignmentDirector<span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>When the <code class=\"language-text\">AssignmentDirector</code> component mounts, we ask the backend for\ninformation on that assignment. If it doesn't exist or throws an error, we\nredirect to the dashboard's home. While that assignment is fetching, we\ndisplay a loading indicator. When the assignment data is received, we flip\nthe loading key to false and because the props have changed, the component\nre-renders. As you might be able to tell, the <code class=\"language-text\">AssignmentDirector</code> is\nreading its state from the <code class=\"language-text\">editorReducer</code>.</p>\n<p>In the render function, the next set of logic should execute. If the\nassignment is published, we render the <code class=\"language-text\">GradingContainer</code>. Otherwise, we'll\nrender the <code class=\"language-text\">EditorContainer</code>.</p>\n<p>One complication is that the fetching of the assignment actually returns all\nthe data required for the <code class=\"language-text\">Editor</code> but not the <code class=\"language-text\">Grader</code>. In a perfect world,\nwe'd probably rewrite that, but to cut down on network requests, I think\nthis works for the time being.</p>\n<p>So once again, if the assignment is published, we render the <code class=\"language-text\">GradingContainer</code>, which then\nissues a request to get the grading summary for the assignment. That request\nupdates a different key in our redux store and is actually handled by the\n<code class=\"language-text\">graderReducer</code> rather than the <code class=\"language-text\">editorReducer</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// editorReducer.js</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">state <span class=\"token operator\">=</span> defaultState<span class=\"token punctuation\">,</span> action</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> type<span class=\"token punctuation\">,</span> payload <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> action\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> active <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> state\n\n  <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">case</span> <span class=\"token constant\">RECEIVE_ASSIGNMENT</span><span class=\"token operator\">:</span>\n      <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span> <span class=\"token operator\">...</span>state<span class=\"token punctuation\">,</span>\n        active<span class=\"token operator\">:</span> payload<span class=\"token punctuation\">,</span>\n        loading<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span>\n</code></pre></div>\n<p>Here, the <code class=\"language-text\">editorReducer</code> responds to the <code class=\"language-text\">RECEIVE_ASSIGNMENT</code> action and\nupdates state accordingly.</p>\n<p>Let's say that when this assignment was received, it was actually published.\nIn that case, the <code class=\"language-text\">GradingContainer</code> would render.</p>\n<p>For simplicity, I'm only showing part of the component's code.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// GradingContainer</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">GradingContainer</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">componentDidMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> id<span class=\"token punctuation\">,</span> fetchAssignmentGradingSummary<span class=\"token punctuation\">,</span> history <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props\n    <span class=\"token function\">fetchAssignmentGradingSummary</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">,</span> history<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">componentWillUnmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span><span class=\"token function\">clearActiveStudent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span><span class=\"token function\">clearAssignmentGradingSummary</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token comment\">//some markup</span>\n    <span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">mapStateToProps</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>\n  assignments<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    grader<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      gradingSummary<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        assignment\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      gradingSummaryLoading\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  assignment<span class=\"token punctuation\">,</span>\n  gradingSummaryLoading\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token function\">withRouter</span><span class=\"token punctuation\">(</span><span class=\"token function\">connect</span><span class=\"token punctuation\">(</span>mapStateToProps<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n  clearActiveStudent<span class=\"token punctuation\">,</span>\n  clearAssignmentGradingSummary<span class=\"token punctuation\">,</span>\n  fetchAssignmentGradingSummary\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>GradingContainer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>So, when the <code class=\"language-text\">GradingContainer</code> mounts, we dispatch an action to fetch the\ngrading data. That action eventually updates the state in <code class=\"language-text\">graderReducer</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// graderReducer</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">state <span class=\"token operator\">=</span> defaultState<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> type<span class=\"token punctuation\">,</span> payload <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">case</span> <span class=\"token constant\">RECEIVE_ASSIGNMENT_GRADING_SUMMARY</span><span class=\"token operator\">:</span>\n      <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token operator\">...</span>state<span class=\"token punctuation\">,</span>\n        gradingSummaryLoading<span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n        gradingSummary<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">...</span>payload\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Now, when the <code class=\"language-text\">GradingContainer</code> unmounts, you see that I was smart enough\nto remember to clean up the data in the store, but the <code class=\"language-text\">AssignmentDirector</code>\nis still hooked up to the <code class=\"language-text\">editorReducer</code> and looking at the state of the\nassignment in there.</p>\n<p>This discrepancy resulted in odd behavior on the front end. When you clicked\non a published assignment from the dashboard and then clicked onto an\nunpublished one, you'd momentarily see a flash of the grading view before\nthe assignment fetch resolved. You'd also see a 500 request appear in the\nconsole.</p>\n<p>I spent some time hanging out in the Redux Dev Tools inspector and noticed\nthat the <code class=\"language-text\">FETCH_STUDENT_ASSIGNMENT_GRADING_SUMMARY</code> kept getting called\nbefore the <code class=\"language-text\">FETCH_ASSIGNMENT</code> action. Even though the URL was changing, the\n<code class=\"language-text\">AssignmentDirector</code> was still trying to render the <code class=\"language-text\">GradingContainer</code>!</p>\n<p>And that's when I realized that the\n<code class=\"language-text\">AssignmentDirector</code> wasn't getting updated in the right order when the\nassignment and URL changed.</p>\n<p>To fix this, I added an action to clear the active assignment from the\n<code class=\"language-text\">editorReducer</code> when the <code class=\"language-text\">AssignmentDirector</code> unmounts, which reset the\ndefaults for the assignment and the loading state within the\n<code class=\"language-text\">editorReducer</code> and stop the <code class=\"language-text\">GradingContainer</code> from rendering prematurely.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">  <span class=\"token function\">componentWillUnmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span><span class=\"token function\">clearActiveAssignment</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<p>And that, friends, is why it's important to clean up after your React\ncomponents.</p>","frontmatter":{"title":"On the Importance of Cleaning Up After Your React Component"}}},"pageContext":{"slug":"/blog/2018-01-28-on-the-importance-of-cleaning-up-after-your-react-component/"}},
    "staticQueryHashes": ["3128451518","3649515864"]}