scrimba
Reusable React
Components & refs
Implementing useState
Go Pro!Bootcamp

Bootcamp

Study group

Collaborate with peers in your dedicated #study-group channel.

Code reviews

Submit projects for review using the /review command in your #code-reviews channel

Implementing useState
AboutCommentsNotes
Implementing useState
Expand for more info
index.js
run
preview
console
import React, { useState } from 'react';
import ReactDOM from 'react-dom';

// I AM REACT

let element = CharacterCounterInput()
let domTable = {}
domTable.add(element)

let oldElement = element
element = CharacterCounterInput() // new state
diff(element, oldElement)

commit(diff)

CharacterCounterInput()
CharacterCounterInput()
CharacterCounterInput()
CharacterCounterInput()
CharacterCounterInput()

const CharacterCounterInput = ({ text, defaults }) => {
const [message, setMessage] = useState('')
const [error, setError] = useState(false)
const maxLength = 20

return <div className={`counterInput ${message.length > maxLength ? "tooLong" : ""}`}>
<div>
{defaults.map((b) => {
return <button key={b} onClick={() => {
setMessage(b)
}}>{b}</button>
})}
</div>
<textarea
placeholder={text}
value={message}
onChange={(event) => {
setMessage(event.target.value)
if (message.length > maxLength) {
setError(true)
} else {
setError(false)
}
}}
/>
<div>{message.length}/{maxLength}</div>
</div>
}

const App = () => {
let defaultMoods = ["Great", "Okay", "Bad", "TERRIBLE"]

return (
<section>
<h2>Mood Tracker</h2>
<CharacterCounterInput text={"How was your day?"} defaults={defaultMoods}/>
</section>
)
}

ReactDOM.render(<App />, document.getElementById('root'));
Console
/index.html?
-13:12