Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[03/20] 상태관리 #99

Open
bada308 opened this issue Mar 20, 2024 · 1 comment
Open

[03/20] 상태관리 #99

bada308 opened this issue Mar 20, 2024 · 1 comment
Assignees

Comments

@bada308
Copy link
Collaborator

bada308 commented Mar 20, 2024

[우아한타스] 10장. 상태 관리

게으른 초기화

useState(new Store()) vs useState(()  new Store())

파생된 값은 상태가 아니다

  • react-query에서 useQuery에 대한 onSuccess, onError, onSettled 콜백 제거

Breaking React Query's API on purpose

BAD

export function useTodos() {
  const [todoCount, setTodoCount] = React.useState(0);
  const { data: todos } = useQuery({
    queryKey: ["todos", "list"],
    queryFn: fetchTodos,
    //😭 please don't
    onSuccess: (data) => {
      setTodoCount(data.length);
    },
  });

  return { todos, todoCount };
}

GOOD

export function useTodos() {
  const { data: todos } = useQuery({
    queryKey: ['todos', 'list'],
    queryFn: fetchTodos,
  })

  const todoCount = todos?.length ?? 0

  return { todos, todoCount }
}

만약 상태가 서버에서 받은 값에 의존할 수 밖에 없다면 (ex. 수정 form)

export const EditForm = () => {
  const [title, setTitle] = useState();
  const { data: formData } = useQuery({
    queryKey: ["data", "form"],
    queryFn: fetchData,
  });

  // title 동기화

  const handleChange = (e) => {
    setTitle(e.target.value);
  };

  return (
    <form>
      <input value={title} onChange={handleChange} />
    </form>
  );
};
  1. 어떻게 동기화 하는 게 좋은 방법일까?
  2. title은 서버 상태에서 파생된 값이므로, 이는 SSOT를 위반하는 것일까?
@bada308 bada308 self-assigned this Mar 20, 2024
@2yunseong
Copy link
Contributor

1. 어떻게 동기화 하는 게 좋은 방법일까?

  • 위에 코드에서는 수정 컴포넌트와 (write) 읽기 컴포넌트(read-only)를 분리

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants