모듈
actions / index. js
reducers / todos.js, index.js , ...
counter 모듈
todos 모듈
모듈 합치기
rootReducer
combineRedeucers({todos, counter})
store 생성
const store = createStore(rootReducer)
리액트 프로젝트에 적용 (react-redux
)
<Provider store={store}>
<App/>
</Provider>
const {control} = useForm();
해당 객체에 직접 프로퍼티를 넣지 말것. 오직 내부에서만 사용한다.
{...register("username")}
input에서 값을 불러오기 위한 함수
옵션으로 validation이 가능하다.
값을 확인하기 위한 방법 ? console.log(watch())
함수를 인자로 받는다. (handleSubmit(함수))
이 함수에 data라는 인자를 넘겨줌
export default function App(){
const {register, handleSubmit} = useForm();
// =========== 인자로 들어갈 놈 ============
const onSubmit = (data) => {
console.log(data);
}
// ======================================
return (
<div className="App">
<form onSubmit={handleSubmit(onSubmit)}>
<input type="text" placeholder="username" {...register("username")} />
<input type="submit" />
</form>
</div>
)
}
useForm({mode : 'onChange'});
이렇게 하면 react hook form 이 실시간 유효성 검사를 해준다.
import React from "react";
import { useForm } from "react-hook-form";
import "./styles.css";
export default function App() {
const { register, handleSubmit, errors } = useForm({ mode: "onChange" });
const onSubmit = (data) => {
console.log(data);
};
const onError = (error) => {
console.log(error);
};
return (
<div className="App">
<form onSubmit={handleSubmit(onSubmit, onError)}>
<input
type="text"
placeholder="username"
{...register("username", {
minLength: {
value: 5,
message: "Username must be longer than 5 characters"
}
})}
/>
<input type="submit" />
</form>
{errors && <h1>{errors?.username?.message}</h1>}
</div>
);
}
styled components
context API ?
redux vs contextAPI