[TIL] 220316
📝 今日作った
📚 習ったこと
useState/props/memo/propTypes/useEffect
1.「やり直し」の練習
1)単位変換器の作成
変数をinputのvalueに割り当て、その値が変化したときに要素を再レンダリングし、onChange関数にイベントを検出します.target.valueの値をinputの値にします.
2)todo listの作成
import { useState } from "react";
function App() {
const [todo, setTodo] = useState("");
const [todos, setTodos] = useState([]);
const onChange = (event) => setTodo(event.target.value);
const onSubmit = (event) => {
event.preventDefault();
if (todo === "") {
return;
}
setTodo(""); // 이걸 먼저 작성해도
setTodos(currentArray => [todo, ...currentArray]); // 여기서 todo가 ""는 아니다. (∵ 아직 리렌더링 x)
};
return (
<div>
<form onSubmit={onSubmit}>
<input onChange={onChange} value={todo} />
<button>추가</button>
</form>
<ul>
{todos.map((todo, index) => <li key={index}>{todo}</li>)}
</ul>
</div>
);
}
export default App;
3)コイン追跡装置の製作
(コードチャレンジ)
世界中のすべての暗号化通貨の種類をもたらします.
通貨を選択して金額を入力すると、ドル硬貨の価値が表示されます.// App.js
import { useState, useEffect } from "react";
import Input from "./Input";
function App() {
const [loading, setLoading] = useState(true);
const [coins, setCoins] = useState({});
const [amount, setAmount] = useState(0);
const [selectValue, setSelectValue] = useState("select");
const [disabled, setDisabled] = useState(true);
const onInputValueChange = (event) => setAmount(event.target.value);
const onSelectValueChange = (event) => {
setSelectValue(event.target.value);
event.target.value === "select" ? setDisabled(true) : setDisabled(false);
setAmount(0);
};
useEffect(() => {
fetch("https://api.coinpaprika.com/v1/tickers")
.then((response) => response.json())
.then((json) => {
setCoins(json);
setLoading(false);
});
}, []);
return (
<div>
<h1>Coin Traker {loading ? "" : `(${coins.length})`}</h1>
{loading ? (
<h3>로딩 중입니다...</h3>
) : (
<select onChange={onSelectValueChange} value={selectValue}>
<option value="select">Select the currency</option>
{coins.map((coin) => (
<option
value={coin.quotes.USD.price}
key={coin.id}
>{`${coin.name}(${coin.symbol})`}</option>
))}
</select>
)}
<br />
<Input onChange={onInputValueChange} value={amount} disabled={disabled} />
<br />
<Input
value={selectValue === "select" ? 0 : amount * selectValue}
disabled={disabled}
readOnly={true}
/>
</div>
);
}
export default App;
// Input.js
import PropTypes from "prop-types";
function Input({ onChange, value, disabled, readOnly }) {
return (
<input
onChange={onChange}
value={value}
disabled={disabled}
readOnly={readOnly}
></input>
);
}
Input.propTypes = {
onChange: PropTypes.func,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
disabled: PropTypes.bool.isRequired,
readOnly: PropTypes.bool,
};
export default Input;
明日作った
作成
1)単位変換器の作成
変数をinputのvalueに割り当て、その値が変化したときに要素を再レンダリングし、onChange関数にイベントを検出します.target.valueの値をinputの値にします.
2)todo listの作成
import { useState } from "react";
function App() {
const [todo, setTodo] = useState("");
const [todos, setTodos] = useState([]);
const onChange = (event) => setTodo(event.target.value);
const onSubmit = (event) => {
event.preventDefault();
if (todo === "") {
return;
}
setTodo(""); // 이걸 먼저 작성해도
setTodos(currentArray => [todo, ...currentArray]); // 여기서 todo가 ""는 아니다. (∵ 아직 리렌더링 x)
};
return (
<div>
<form onSubmit={onSubmit}>
<input onChange={onChange} value={todo} />
<button>추가</button>
</form>
<ul>
{todos.map((todo, index) => <li key={index}>{todo}</li>)}
</ul>
</div>
);
}
export default App;
3)コイン追跡装置の製作
(コードチャレンジ)
世界中のすべての暗号化通貨の種類をもたらします.
通貨を選択して金額を入力すると、ドル硬貨の価値が表示されます.
// App.js
import { useState, useEffect } from "react";
import Input from "./Input";
function App() {
const [loading, setLoading] = useState(true);
const [coins, setCoins] = useState({});
const [amount, setAmount] = useState(0);
const [selectValue, setSelectValue] = useState("select");
const [disabled, setDisabled] = useState(true);
const onInputValueChange = (event) => setAmount(event.target.value);
const onSelectValueChange = (event) => {
setSelectValue(event.target.value);
event.target.value === "select" ? setDisabled(true) : setDisabled(false);
setAmount(0);
};
useEffect(() => {
fetch("https://api.coinpaprika.com/v1/tickers")
.then((response) => response.json())
.then((json) => {
setCoins(json);
setLoading(false);
});
}, []);
return (
<div>
<h1>Coin Traker {loading ? "" : `(${coins.length})`}</h1>
{loading ? (
<h3>로딩 중입니다...</h3>
) : (
<select onChange={onSelectValueChange} value={selectValue}>
<option value="select">Select the currency</option>
{coins.map((coin) => (
<option
value={coin.quotes.USD.price}
key={coin.id}
>{`${coin.name}(${coin.symbol})`}</option>
))}
</select>
)}
<br />
<Input onChange={onInputValueChange} value={amount} disabled={disabled} />
<br />
<Input
value={selectValue === "select" ? 0 : amount * selectValue}
disabled={disabled}
readOnly={true}
/>
</div>
);
}
export default App;
// Input.js
import PropTypes from "prop-types";
function Input({ onChange, value, disabled, readOnly }) {
return (
<input
onChange={onChange}
value={value}
disabled={disabled}
readOnly={readOnly}
></input>
);
}
Input.propTypes = {
onChange: PropTypes.func,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
disabled: PropTypes.bool.isRequired,
readOnly: PropTypes.bool,
};
export default Input;
明日作った
作成
Reference
この問題について([TIL] 220316), 我々は、より多くの情報をここで見つけました https://velog.io/@leesyong/TIL-220316テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol