Today I Learned ... react.js
🙋♂️ *Reference Lecture
🙋 My Dev Blog
React Hooks 강의
import React, { useState } from 'react';
export default function App() {
const [item, setItem] = useState(1);
const incrementItem = () => setItem(item + 1);
const decrementItem = () => setItem(item - 1);
return (
<div className="App">
<h1>Hello CodeSandbox {item}</h1>
<button onClick={incrementItem}>+1</button>
<button onClick={decrementItem}>-1</button>
</div>
);
}
import React, { useState } from "react";
import "./styles.css";
const useInput = (initialValue) => {
const [value, setValue] = useState(initialValue);
return { value } ;
};
const App = () => {
const name = useInput("Mr.");
return (
<div>
<h1>Hello</h1>
<input placeholder="Name" value={name.value} />
</div>
);
}
export default App;
-> useInput Hook 생성.
name = useInput()을 해주면
name에는 { value } 가 저장됨. 즉, name.value에 value(state
)값이 저장됨.
<input placeholder="Name" {...name} />
name 안에 있는 것을 풀어줘서 (spread)
value 어트리뷰트에 value(state
)값이 들어간다.
name은 { value : Mr. }라는 객체임.
객체를 풀어주면 value: Mr.이 되므로 value 어트리뷰트의 값에 Mr. 이 들어가게 되는 것.
import React, { useState } from "react";
import "./styles.css";
const useInput = (initialValue) => {
const [value, setValue] = useState(initialValue);
const onChange = (e) => {
const {
target: { value }
} = e;
setValue(value);
};
return { value, onChange };
};
export default function App() {
const name = useInput("Mr.");
const email = useInput("@");
return (
<div>
<h1>Hello</h1>
<input placeholder="Name" {...name} />
<input placeholder="Email" {...email} />
</div>
);
}
spread(...) 이용
return { value, onChange } 를 해주므로,
name = { value: Mr. , onChange: onChange } 이고
spread 하면 value 어트리뷰트에 Mr.가 들어가고,
onChange 어트리뷰트에는 onChange함수가 들어감.
useInput
의 인자로 initialValue와 함께 validator
을 넣어준다.import React, { useState } from "react";
import "./styles.css";
const useInput = (initialValue, validator) => {
const [value, setValue] = useState(initialValue);
const onChange = (e) => {
const {
target: { value }
} = e;
let willUpdate = true;
if (typeof validator === 'function') {
willUpdate = validator(value);
}
if (willUpdate) {
setValue(value);
}
};
return { value, onChange };
};
export default function App() {
const maxlength = (value) => value.length <= 10;
const name = useInput("Mr.", maxlength);
return (
<div>
<h1>Hello</h1>
<input placeholder="Name" {...name} />
</div>
);
}
validator
값은 함수가 될수도 있고, 유효성 검사가 불필요한 경우에는 인자로 전달해주지 않으면 undefined가 될수도 있다.
- validator의 값이 undefinded라면 (기본)
-> willUpdate는 true이고,
if(willUpdate) { setValue(value) } 가 동작하게 한다.
- validator의 값이 함수라면
->typeof
validator === 'function'이면
-> willUpdate = validator(value);
-> validator 함수에 인자로 value를 넣어주고
리턴값이 true면 setValue가 되고,
false면 setValue가 되지 않음.
useTabs.js
import { useState } from "react";
const content = [
{
tab: "Section 1",
content: "I'm the content of the Section 1"
},
{
tab: "Section 2",
content: "I'm the content of the Section 2"
},
]
const useTabs = (initialTab, allTabs) => {
if(!allTabs || !Array.isArray(allTabs)) {
return;
}
const [currentIndex, setCurrentIndex] = useState(initialTab);
return {
currentItem : allTabs[currentIndex],
changeItem : setCurrentIndex
}
}
const App = () => {
const { currentItem, changeItem } = useTabs(0, content);
return (
<div>
{content.map((section, index) =>
<button onClick={() =>changeItem(index)}
>{section.tab}</button>)}
<div>
{currentItem.content}
</div>
</div>
);
}
useState
를 이용함.