eolas/neuron/d0ed26d0-cdc8-4643-8c09-445408195f9b/.neuron/output/React_useState.html

61 lines
15 KiB
HTML
Raw Normal View History

2024-10-20 19:00:04 +01:00
<!DOCTYPE html><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type" /><meta content="width=device-width, initial-scale=1" name="viewport" /><!--replace-start-0--><!--replace-start-5--><!--replace-start-8--><title>useState - My Zettelkasten</title><!--replace-end-8--><!--replace-end-5--><!--replace-end-0--><link href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.8.7/dist/semantic.min.css" rel="stylesheet" /><link href="https://fonts.googleapis.com/css?family=Merriweather|Libre+Franklin|Roboto+Mono&amp;display=swap" rel="stylesheet" /><!--replace-start-1--><!--replace-start-4--><!--replace-start-7--><link href="https://raw.githubusercontent.com/srid/neuron/master/assets/neuron.svg" rel="icon" /><meta content="useState is the primary way in which React updates the application state based on user interaction." name="description" /><meta content="useState" property="og:title" /><meta content="My Zettelkasten" property="og:site_name" /><meta content="article" property="og:type" /><meta content="React_useState" property="neuron:zettel-id" /><meta content="React_useState" property="neuron:zettel-slug" /><meta content="javascript" property="neuron:zettel-tag" /><meta content="react" property="neuron:zettel-tag" /><script type="application/ld+json">[]</script><style type="text/css">body{background-color:#eeeeee !important;font-family:"Libre Franklin", serif !important}body .ui.container{font-family:"Libre Franklin", serif !important}body h1, h2, h3, h4, h5, h6, .ui.header, .headerFont{font-family:"Merriweather", sans-serif !important}body code, pre, tt, .monoFont{font-family:"Roboto Mono","SFMono-Regular","Menlo","Monaco","Consolas","Liberation Mono","Courier New", monospace !important}body div.z-index p.info{color:#808080}body div.z-index ul{list-style-type:square;padding-left:1.5em}body div.z-index .uplinks{margin-left:0.29999em}body .zettel-content h1#title-h1{background-color:rgba(33,133,208,0.1)}body nav.bottomPane{background-color:rgba(33,133,208,2.0e-2)}body div#footnotes{border-top-color:#2185d0}body p{line-height:150%}body img{max-width:100%}body .deemphasized{font-size:0.94999em}body .deemphasized:hover{opacity:1}body .deemphasized:not(:hover){opacity:0.69999}body .deemphasized:not(:hover) a{color:#808080 !important}body div.container.universe{padding-top:1em}body div.zettel-view ul{padding-left:1.5em;list-style-type:square}body div.zettel-view .pandoc .highlight{background-color:#ffff00}body div.zettel-view .pandoc .ui.disabled.fitted.checkbox{margin-right:0.29999em;vertical-align:middle}body div.zettel-view .zettel-content .metadata{margin-top:1em}body div.zettel-view .zettel-content .metadata div.date{text-align:center;color:#808080}body div.zettel-view .zettel-content h1{padding-top:0.2em;padding-bottom:0.2em;text-align:center}body div.zettel-view .zettel-content h2{border-bottom:solid 1px #4682b4;margin-bottom:0.5em}body div.zettel-view .zettel-content h3{margin:0px 0px 0.4em 0px}body div.zettel-view .zettel-content h4{opacity:0.8}body div.zettel-view .zettel-content div#footnotes{margin-top:4em;border-top-style:groove;border-top-width:2px;font-size:0.9em}body div.zettel-view .zettel-content div#footnotes ol > li > p:only-of-type{display:inline;margin-right:0.5em}body div.zettel-view .zettel-content aside.footnote-inline{width:30%;padding-left:15px;margin-left:15px;float:right;background-color:#d3d3d3}body div.zettel-view .zettel-content .overflows{overflow:auto}body div.zettel-view .zettel-content code{margin:auto auto auto auto;font-size:100%}body div.zettel-view .zettel-content p code, li code, ol code{padding:0.2em 0.2em 0.2em 0.2em;background-color:#f5f2f0}body div.zettel-view .zettel-content pre{overflow:auto}body div.zettel-view .zettel-content dl dt{font-weight:bold}body div.zettel-view .zettel-content blockquote{background-color:#f9f9f9;border-left:solid 10px #cccccc;margin:1.5em 0px 1.5em 0px;padding:0.5em 10px 0.5em 10px}body div.zettel-view .zettel-content.raw{background-color:#dddddd}body .ui.label.zettel-tag{color:#000000}body .ui.label.zettel-tag a{color:#000000}body nav.botto
async=""
id="MathJax-script"
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"
></script>
<link
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/themes/prism.min.css"
rel="stylesheet"
/><link rel="preconnect" href="https://fonts.googleapis.com" /><link
rel="preconnect"
href="https://fonts.gstatic.com"
crossorigin
/><link
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Sans+Condensed:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Serif:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap"
rel="stylesheet"
/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/components/prism-core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/plugins/autoloader/prism-autoloader.min.js"></script>
<style>
body .ui.container,
body ul {
font-family: "IBM Plex Sans" !important;
}
body blockquote {
border-left-width: 3px !important;
font-style: italic;
}
.headerFont,
.ui.header,
body h1,
h2,
h3,
h4,
h5,
h6 {
font-family: "IBM Plex Sans Condensed" !important;
}
body p {
line-height: 1.4;
}
.monoFont,
body code,
pre,
tt {
font-family: "IBM Plex Mono" !important;
font-size: 12px !important;
line-height: 1.4 !important;
}
</style>
<!--replace-end-7--><!--replace-end-4--><!--replace-end-1--></head><body><div class="ui fluid container universe"><!--replace-start-2--><!--replace-start-3--><!--replace-start-6--><div class="ui text container" id="zettel-container" style="position: relative"><div class="zettel-view"><article class="ui raised attached segment zettel-content"><div class="pandoc"><h1 id="title-h1"><code>useState</code></h1><p><code>useState</code> is the primary way in which React updates the application state based on user interaction.</p><ul><li><code>useState</code> <strong>receives</strong>: the initial state as an argument</li><li><code>useState</code> <strong>returns</strong>: the current state and a function that updates it</li></ul><p>The two items that are returned are returned as an array. We could refer to them with array syntax (i.e with <code>[0]</code> and <code>[1]</code> ) but it is more concise to use the destructuring syntax. But all thats happening is that a method belonging to the <code>React</code> library (i.e. <code>useState</code> ) is taking an argument (the initial state) and returning two values as an array of two elements. The first of these values is a variable, the second is a function.</p><pre><code class="jsx language-jsx">(1) const [count, setCount] = useState(0);
(2) const handleClick = () =&gt; { setCount(count + 1) };
(3) &lt;span&gt;{count}&lt;/span&gt;
(4) &lt;button onClick={handleClick)&gt;Add one&lt;/button&gt;</code></pre><ul><li>At line 1 we initialise the <code>useState</code> hook.<ul><li>We use destructuring syntax to declare two variables</li><li>The first variable stores our initial state. The value of the initial state is an argument passed to <code>useState</code> , i.e. <code>0</code>. Do not confuse the variable with the value it refers to.</li><li>The second variable is a method that mutates the state referred to by the first variable into some new value, i.e. from <code>0</code> to a different integer</li></ul></li><li>At line 3, which in reality, will be within your JSX and part of the <code>render()</code> block of the function, we render the initial state in the React DOM. This will change and be re-rendered in accordance with the state logic</li><li>At line 4 we have a user interface that executes the function on line 2. This function applies the state change represented by the second variable in the destructuring assignment at line 1 (<code>setCount</code> ): it mutates the initial state (<code>0</code>) by the value of `1.</li></ul><blockquote><p>You can utilise as many <code>useState</code> declarations as your component requires.</p></blockquote><h2 id="passing-variables-as-initial-state">Passing variables as initial state</h2><p>We dont always have to declare the data types within the destructuring assignment. We can store them in variables and pass the variables to the destructuring assignment on <code>useState</code> . Below we do this for a function that mutates a string value:</p><pre><code class="jsx language-jsx">const hi = &quot;hello&quot;;
const bye = &quot;goodbye&quot;;
const [initText, changeText] = useState(hi);
&lt;p&gt;{initText}&lt;/p&gt;
&lt;button onClick={()=&gt;changeText(bye)}&gt;ChangeText&lt;/button&gt;</code></pre><h2 id="lazily-setting-initial-state">Lazily setting initial state</h2><p>Although you will typically use a literal value or variable as your initial state, React provides a way for you to set this value through a function. This will only run once at the first render so as not to interfere with the second update parameter of <code>useState</code>. This is called <strong>lazy initialisation</strong></p><pre><code class="jsx language-jsx">const getInitialState = () =&gt; Number(window.localStorage.getItem(&quot;count&quot;));
const [count, setCount] = React.useState(getInitialState);</code></pre><h2 id="accessing-previous-state">Accessing previous state</h2><p>It is also possible to access the previous state via the <code>useState</code> hook. We can access this as a callback on the updater function.</p><p>Lets say we have a simple counter set up like so:</p><pre><code class="js language-js">const [count, setCount] = useState(0);</code></pre><p>We can access the prior value of <code>count</code> with:</p><pre><code class="js language-js">const getPrevValue = () =&gt; setCount((prev) =&gt; console.log(prev));</code></pre><h3 id="naming-best-practise">Naming best practise</h3><p>When destructuring the two variables from <code>useState</code>, React follows uses the following semantics: <code>[something, setSomething]</code> . This isnt required but it helps to keep everything clear, particularly the fact that the first thing destructured is a variable and the second is a function.</p><blockquote><p><a href="https://stackoverflow.com/questions/54807454/what-is-prevstate-in-reactjs">https://stackoverflow.com/questions/54807454/what-is-prevstate-in-reactjs</a></p></blockquote></div></article><nav class="ui attached segment deemphasized backlinksPane" id="neuron-backlinks-pane"><h3 class="ui header">Backlinks</h3><ul class="backlinks"><li><span class="zettel-link-container cf"><span class="zettel-link"><a href="React_useReducer.html">useReducer</a></span></span><ul class="context-list" style="zoom: 85%;"><li class="item"><div class="pandoc"><p>The <code>useReducer</code> hook is best used in scenarios where you are manipulating state in a way that is too complex for the trivial <span class="zettel-link-container cf"><span class="zettel-link" title="Zettel: useState"><a href="React_useState.html">React_useState</a></span></span> use case. <code>useState</code> is best employed when you are updating a single value or toggling a boolean. If you are updating the state of an object or more complex data structure, it is often more efficient to employ <code>useReducer</code>.</p></div></li></ul></li></ul></nav><nav class="ui attached segment deemphasized bottomPane" id="neuron-tags-pane"><div><span class="ui basic label zettel-tag" title="Tag">javascript</span><span class="ui basic label zettel-tag" title="Tag">react</span></div></nav><nav class="ui bottom attached icon compact inverted menu blue" id="neuron-nav-bar"><!--replace-start-9--><!--replace-end-9--><a class="right item" href="impulse.html" title="Open Impulse"><i class="wave square icon"></i></a></nav></div></div><!--replace-end-6--><!--replace-end-3--><!--replace-end-2--><div class="ui center aligned container footer-version"><div class="ui tiny image"><a href="https://neuron.zettel.page"><img alt="logo" src="https://raw.githubusercontent.com/srid/neuron/master/assets/neuron.svg" title="Generated by Neuron 1.9.35.3" /></a></div></div></div></body></html>