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

[docs/korean] Translate official document to Korean #18

Merged
merged 83 commits into from
Apr 19, 2021
Merged
Show file tree
Hide file tree
Changes from 77 commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
c3e5e3a
Create installation_kr.md and translated installation_kr to Korean
alstn2468 May 15, 2020
5b00cc6
Seperate korean translation folder (docs/docs_kr)
alstn2468 May 15, 2020
287b70c
Translate introduction/gettsing-started.mdx to Korean
alstn2468 May 15, 2020
409a8bc
Fix miss typo at docs/krgetting-started.mdx
alstn2468 May 15, 2020
0f4a34a
Fix missing [] at getting-started.mdx -> CRA
alstn2468 May 15, 2020
747578c
Translate docs_kr/basic_tutorial/intro.md to Korean
alstn2468 May 15, 2020
c2a1768
Translate docs_kr/basic_tutorial/atoms.mdx
alstn2468 May 15, 2020
e9b9108
Remove english line at atoms.mdx
alstn2468 May 15, 2020
2bc7076
Remove english line at atoms.mdx
alstn2468 May 15, 2020
7baf77e
Fix miss typo at atoms.mdx
alstn2468 May 15, 2020
a1a3793
Fix miss typo at installation.d & gettig-started.mdx
alstn2468 May 16, 2020
3ee2c60
Translate docs_kr/basic_tutorial/selectors.md
alstn2468 May 16, 2020
b0b8875
Fix miss typo at basic-tutorial/performance.md line 60
alstn2468 May 17, 2020
b6ff106
Translate performace.md to Korean
alstn2468 May 17, 2020
e9043d0
Translate core-concepts to Korean
alstn2468 May 17, 2020
d68f5e6
Fix core-concepts
alstn2468 May 17, 2020
4f3ef50
Merge remote-tracking branch 'upstream/docs' into docs
alstn2468 May 19, 2020
732c44b
Apply lately document from docs to docs_kr
alstn2468 May 19, 2020
646fde6
Fix miss typo at docs_kr - performance section
alstn2468 May 25, 2020
3b58fc6
[docs/kr] Translate introduction/motivation.md
alstn2468 Jun 4, 2020
ff04586
Merge remote-tracking branch 'upstream/docs' into docs
alstn2468 Jun 15, 2020
c0650ca
Add installation ESLint docs korean verstion
alstn2468 Jun 15, 2020
aca8fb7
Translate installation code block comment to Korean
alstn2468 Jun 15, 2020
c1b3dbd
Merge remote-tracking branch 'upstream/docs' into docs
alstn2468 Jul 17, 2020
c24921f
Apply recent changes at selectors.md
alstn2468 Jul 17, 2020
0ccd52f
Apply recent changes at installation.md
alstn2468 Jul 17, 2020
c6e24fb
Translate api-reference/core/RecoilRoot.md
alstn2468 Jul 17, 2020
362198e
Translate sub title at RecoilRoot
alstn2468 Jul 17, 2020
9c91af0
Translate api-reference/core/atom
alstn2468 Jul 17, 2020
1775d95
Translate api-reference/core/selector
alstn2468 Jul 27, 2020
7ff97d6
Merge remote-tracking branch 'upstream/docs' into docs
alstn2468 Aug 18, 2020
879a691
Translate api-reference/core/isRecoilValue
alstn2468 Aug 18, 2020
b3dc9fd
Merge remote-tracking branch 'upstream/docs' into docs
alstn2468 Sep 11, 2020
a925dc8
Merge remote-tracking branch 'upstream/docs' into docs
alstn2468 Oct 20, 2020
6d9fbc2
Sync upstream docs to docs_kr
alstn2468 Oct 20, 2020
fef1a35
Merge remote-tracking branch 'upstream/docs' into docs
alstn2468 Nov 3, 2020
5951804
Sync installation.md
alstn2468 Nov 3, 2020
328c43d
Sync atomFamily.md
alstn2468 Nov 3, 2020
a4b3b87
Sync atom, guides and translate additional atom.md
alstn2468 Nov 3, 2020
4e07591
Merge remote-tracking branch 'upstream/docs' into docs
alstn2468 Nov 13, 2020
2908ba8
Sync asynchronous-data-queries, testing, core-concepts
alstn2468 Nov 13, 2020
b39e246
Fix typo in intro & performance
cos18 Nov 30, 2020
6c20fc7
Merge remote-tracking branch 'upstream/docs' into docs
alstn2468 Apr 5, 2021
36fa13c
Init docusaurus i18n config
alstn2468 Apr 5, 2021
24e9649
Fix locale kr -> ko
alstn2468 Apr 5, 2021
da727f0
Translated: Snapshot.md is now translated into Korean
Mark-Yoo Apr 5, 2021
e2abe8a
Translated: useGotoRecoilSnapshot.md is now translated into Korean
Mark-Yoo Apr 5, 2021
109c465
Translated: Lodable.md is now translated into Korean
Mark-Yoo Apr 5, 2021
22954c3
Translated: useRecoilCallback.md is now translated into Korean
Mark-Yoo Apr 5, 2021
2c6a503
Translated: useRecoilSnapshot.md is now translated into Korean
Mark-Yoo Apr 5, 2021
88cf0f9
Translated: useRecoilState.md is now translated into Korean
Mark-Yoo Apr 5, 2021
f2e1397
Translated: useRecoilStateLoadable.md is now translated into Korean
Mark-Yoo Apr 5, 2021
e0cbf2f
Translated: useRecoilTransactionObserver.md is now translated into Ko…
Mark-Yoo Apr 5, 2021
7d2eb8f
Translated: useRecoilValue.md is now translated into Korean
Mark-Yoo Apr 5, 2021
776cdbf
Translated: useRecoilValueLoadable.md is now translated into Korean
Mark-Yoo Apr 5, 2021
2a27f52
Translated: useResetRecoilState.md is now translated into Korean
Mark-Yoo Apr 5, 2021
a239d37
Translated: useSetRecoilState.md is now translated into Korean
Mark-Yoo Apr 5, 2021
25ecd63
Translated: asynchronous-data-queries.md is now translated into Korean
Mark-Yoo Apr 5, 2021
f65ccee
Translated: atom-effects.md is now translated into Korean
Mark-Yoo Apr 5, 2021
24e6a9e
Translated: dev-tools.md is now translated into Korean
Mark-Yoo Apr 5, 2021
c67a3cd
Translated: testing.md is now translated into Korean
Mark-Yoo Apr 5, 2021
f399004
Sync docs
alstn2468 Apr 5, 2021
3a56dc1
Add useGetRecoilValueInfo.md to ko/api-reference/core
alstn2468 Apr 5, 2021
545d796
Translated: noWait.md is now translated into korean
Apr 6, 2021
4693916
Translated: waitForAny.md is now translated into korean
Apr 6, 2021
c7c7e0c
Translated: waitForAll.md is now translated into korean
Apr 6, 2021
35d996a
Translated: waitForNone.md is now translated into korean
Apr 6, 2021
7980d66
Translated: errorSelector.md is now translated into korean
Apr 6, 2021
3f2ae16
Translated: constSelector.md is now translated into korean
Apr 6, 2021
df49239
Translated: selectorFamily.md is now translated into korean
Apr 6, 2021
fe51533
Translated: useRecoilBridgeAcrossReactRoots.md is now translated into…
Apr 6, 2021
6871580
Translated: atomFamily.md is now translated into korean
Apr 6, 2021
dfd72ab
Merge pull request #1 from alstn2468/ko-translate
alstn2468 Apr 9, 2021
0a4d4b7
Add code.json korean translation
alstn2468 Apr 9, 2021
7b0b920
Add footer.json korean translation
alstn2468 Apr 14, 2021
66c4a73
Add navbar korean translation, fix core concepts title
alstn2468 Apr 14, 2021
f36d342
Add remaining Korean translation data
alstn2468 Apr 14, 2021
05f42e2
Update docs/i18n/ko/code.json
alstn2468 Apr 14, 2021
2a4765b
Fix typo (시그니쳐 -> 시그니처)
alstn2468 Apr 14, 2021
4e13657
Init index, resources page translation follow #377(ee54104)
alstn2468 Apr 15, 2021
ace9980
Merge branch 'docs' of https://github.com/alstn2468/Recoil into docs
alstn2468 Apr 15, 2021
2446615
index.js, resources 페이지 관련 번역 추가
alstn2468 Apr 15, 2021
4c68aa4
Merge branch 'docs' into docs
alstn2468 Apr 19, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/docs/basic-tutorial/performance.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ That helps with the re-renders of `<TodoItemCreator />` and `<TodoListFilters />

Thinking of a todo list as an array of objects is problematic because it forms a tight coupling between each individual todo item and the list of all todo items.

To fix this issue, we need to rethink our state shape by thinking about **normalized state**. In the context of our todo-list app, this means storing the **list** of item ids separately from the **data** for each invididual item.
To fix this issue, we need to rethink our state shape by thinking about **normalized state**. In the context of our todo-list app, this means storing the **list** of item ids separately from the **data** for each individual item.
alstn2468 marked this conversation as resolved.
Show resolved Hide resolved
alstn2468 marked this conversation as resolved.
Show resolved Hide resolved

> For a more detailed discussion on how to think about normalized state, see [this page from the Redux documentation](https://redux.js.org/recipes/structuring-reducers/normalizing-state-shape).

Expand Down
34 changes: 28 additions & 6 deletions docs/docusaurus.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@
* @format
*/

function makeDocsEditUrl(locale, docPath) {
if (locale === 'en')
return `https://github.com/facebookexperimental/Recoil/edit/docs/docs/docs/${docPath}`;
else
return `https://github.com/facebookexperimental/Recoil/edit/docs/docs/i18n/${locale}/docusaurus-plugin-content-docs/current/${docPath}`;
}

module.exports = {
title: 'Recoil',
tagline: 'A state management library for React',
Expand All @@ -15,10 +22,22 @@ module.exports = {
favicon: 'img/favicon.png',
organizationName: 'facebookexperimental', // Usually your GitHub org/user name.
projectName: 'Recoil', // Usually your repo name.
i18n: {
defaultLocale: 'en',
locales: ['en', 'ko'],
localeConfigs: {
en: {
label: 'English',
},
ko: {
label: '한국어',
},
},
},
themeConfig: {
algolia: {
algolia: {
apiKey: '9c5a009951e793525603922b8ca66628',
indexName: 'recoiljs'
indexName: 'recoiljs',
},
googleAnalytics: {
trackingID: 'UA-44373548-46',
Expand All @@ -30,7 +49,7 @@ module.exports = {
src: 'img/logo.svg',
srcDark: 'img/logo--dark.svg',
href: '/',
target: '_self'
target: '_self',
},
items: [
{
Expand All @@ -47,6 +66,10 @@ module.exports = {
label: 'GitHub',
position: 'right',
},
{
type: 'localeDropdown',
position: 'right',
},
],
},
footer: {
Expand Down Expand Up @@ -129,14 +152,13 @@ module.exports = {
{
docs: {
sidebarPath: require.resolve('./sidebars.js'),
editUrl:
'https://github.com/facebookexperimental/Recoil/edit/docs/docs/',
editUrl: ({locale, docPath}) => makeDocsEditUrl(locale, docPath),
},
blog: {
showReadingTime: true,
editUrl:
'https://github.com/facebookexperimental/Recoil/edit/docs/docs/blog/',
feedOptions: {
feedOptions: {
type: 'all',
copyright: `Copyright © ${new Date().getFullYear()} Facebook, Inc.`,
},
Expand Down
194 changes: 194 additions & 0 deletions docs/i18n/ko/code.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
{
"theme.NotFound.title": {
"message": "페이지를 찾을 수 없습니다.",
"description": "The title of the 404 page"
},
"theme.NotFound.p1": {
"message": "원하는 페이지를 찾을 수 없습니다.",
"description": "The first paragraph of the 404 page"
},
"theme.NotFound.p2": {
"message": "사이트 관리자에게 링크가 깨진 것을 알려주세요.",
alstn2468 marked this conversation as resolved.
Show resolved Hide resolved
"description": "The 2nd paragraph of the 404 page"
},
"theme.AnnouncementBar.closeButtonAriaLabel": {
"message": "닫기",
"description": "The ARIA label for close button of announcement bar"
},
"theme.blog.paginator.navAriaLabel": {
"message": "블로그 게시물 목록 탐색",
"description": "The ARIA label for the blog pagination"
},
"theme.blog.paginator.newerEntries": {
"message": "이전 페이지",
"description": "The label used to navigate to the newer blog posts page (previous page)"
},
"theme.blog.paginator.olderEntries": {
"message": "다음 페이지",
"description": "The label used to navigate to the older blog posts page (next page)"
},
"theme.blog.post.readingTime.plurals": {
"message": "약 {readingTime}분",
"description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.tags.tagsListLabel": {
"message": "태그:",
"description": "The label alongside a tag list"
},
"theme.blog.post.readMore": {
"message": "자세히 보기",
"description": "The label used in blog post item excerpts to link to full blog posts"
},
"theme.blog.post.paginator.navAriaLabel": {
"message": "블로그 게시물 탐색",
"description": "The ARIA label for the blog posts pagination"
},
"theme.blog.post.paginator.newerPost": {
"message": "이전 게시물",
"description": "The blog post button label to navigate to the newer/previous post"
},
"theme.blog.post.paginator.olderPost": {
"message": "다음 게시물",
"description": "The blog post button label to navigate to the older/next post"
},
"theme.tags.tagsPageTitle": {
"message": "태그",
"description": "The title of the tag list page"
},
"theme.blog.post.plurals": {
"message": "{count}개 게시물",
"description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.blog.tagTitle": {
"message": "\"{tagName}\" 태그로 연결된 {nPosts}개의 게시물이 있습니다.",
"description": "The title of the page for a blog tag"
},
"theme.tags.tagsPageLink": {
"message": "모든 태그 보기",
"description": "The label of the link targeting the tag list page"
},
"theme.CodeBlock.copyButtonAriaLabel": {
"message": "클립보드에 코드 복사",
"description": "The ARIA label for copy code blocks button"
},
"theme.CodeBlock.copied": {
"message": "복사했습니다",
"description": "The copied button label on code blocks"
},
"theme.CodeBlock.copy": {
"message": "복사",
"description": "The copy button label on code blocks"
},
"theme.docs.sidebar.expandButtonTitle": {
"message": "사이드바 열기",
"description": "The ARIA label and title attribute for expand button of doc sidebar"
},
"theme.docs.sidebar.expandButtonAriaLabel": {
"message": "사이드바 열기",
"description": "The ARIA label and title attribute for expand button of doc sidebar"
},
"theme.docs.paginator.navAriaLabel": {
"message": "문서 탐색",
"description": "The ARIA label for the docs pagination"
},
"theme.docs.paginator.previous": {
"message": "이전",
"description": "The label used to navigate to the previous doc"
},
"theme.docs.paginator.next": {
"message": "다음",
"description": "The label used to navigate to the next doc"
},
"theme.docs.sidebar.responsiveCloseButtonLabel": {
"message": "메뉴 닫기",
"description": "The ARIA label for close button of mobile doc sidebar"
},
"theme.docs.sidebar.responsiveOpenButtonLabel": {
"message": "메뉴 열기",
"description": "The ARIA label for open button of mobile doc sidebar"
},
"theme.docs.sidebar.collapseButtonTitle": {
"message": "사이드바 숨기기",
"description": "The title attribute for collapse button of doc sidebar"
},
"theme.docs.sidebar.collapseButtonAriaLabel": {
"message": "사이드바 숨기기",
"description": "The title attribute for collapse button of doc sidebar"
},
"theme.docs.versions.unreleasedVersionLabel": {
"message": "{siteTitle} {versionLabel} 문서는 아직 정식 공개되지 않았습니다.",
"description": "The label used to tell the user that he's browsing an unreleased doc version"
},
"theme.docs.versions.unmaintainedVersionLabel": {
"message": "{siteTitle} {versionLabel} 문서는 업데이트되지 않습니다.",
"description": "The label used to tell the user that he's browsing an unmaintained doc version"
},
"theme.docs.versions.latestVersionSuggestionLabel": {
"message": "최신 문서는 {latestVersionLink} ({versionLabel})을 확인하세요.",
"description": "The label userd to tell the user that he's browsing an unmaintained doc version"
},
"theme.docs.versions.latestVersionLinkLabel": {
"message": "최신 버전",
"description": "The label used for the latest version suggestion link label"
},
"theme.common.editThisPage": {
"message": "페이지 편집",
"description": "The link label to edit the current page"
},
"theme.common.headingLinkTitle": {
"message": "제목으로 바로 가기",
"description": "Title for link to heading"
},
"theme.lastUpdated.atDate": {
"message": " {date}에",
"description": "The words used to describe on which date a page has been last updated"
},
"theme.lastUpdated.byUser": {
"message": " {user}가",
"description": "The words used to describe by who the page has been last updated"
},
"theme.lastUpdated.lastUpdatedAtBy": {
"message": "{atDate}{byUser} 마지막으로 업데이트했습니다.",
"description": "The sentence used to display when a page has been last updated, and by who"
},
"theme.common.skipToMainContent": {
"message": "본문으로 건너뛰기",
"description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"
},
"theme.SearchPage.documentsFound.plurals": {
"message": "{count}개 문서를 찾았습니다.",
"description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.SearchPage.existingResultsTitle": {
"message": "\"{query}\"개 검색 결과가 있습니다.",
"description": "The search page title for non-empty query"
},
"theme.SearchPage.emptyResultsTitle": {
"message": "문서를 검색합니다.",
"description": "The search page title for empty query"
},
"theme.SearchPage.inputPlaceholder": {
"message": "여기에 검색할 키워드를 입력하세요.",
"description": "The placeholder for search page input"
},
"theme.SearchPage.inputLabel": {
"message": "검색",
"description": "The ARIA label for search page input"
},
"theme.SearchPage.algoliaLabel": {
"message": "Search by Algolia",
"description": "The ARIA label for Algolia mention"
},
"theme.SearchPage.noResultsText": {
"message": "검색 결과가 없습니다.",
"description": "The paragraph for empty search result"
},
"theme.SearchPage.fetchingNewResults": {
"message": "새로운 검색 결과를 얻을 수 있습니다...",
"description": "The paragraph for fetching new search results"
},
"theme.SearchBar.label": {
"message": "검색",
"description": "The ARIA label and placeholder for search button"
}
}
42 changes: 42 additions & 0 deletions docs/i18n/ko/docusaurus-plugin-content-docs/current.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"version.label": {
"message": "버전",
"description": "The label for version current"
},
"sidebar.docs.category.Introduction": {
"message": "소개",
"description": "The label for category Introduction in sidebar docs"
},
"sidebar.docs.category.Basic Tutorial": {
"message": "기본 자습서",
"description": "The label for category Basic Tutorial in sidebar docs"
},
"sidebar.docs.category.Guides": {
"message": "가이드",
"description": "The label for category Guides in sidebar docs"
},
"sidebar.docs.category.API Reference": {
"message": "레퍼런스 API",
"description": "The label for category API Reference in sidebar docs"
},
"sidebar.docs.category.Core": {
"message": "주요 개념",
"description": "The label for category Core in sidebar docs"
},
"sidebar.docs.category.State": {
"message": "상태",
"description": "The label for category State in sidebar docs"
},
"sidebar.docs.category.Snapshots": {
"message": "스냅샷",
"description": "The label for category Snapshots in sidebar docs"
},
"sidebar.docs.category.Misc": {
"message": "기타",
"description": "The label for category Misc in sidebar docs"
},
"sidebar.docs.category.Utils": {
"message": "유틸",
"description": "The label for category Utils in sidebar docs"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
title: class Loadable
sidebar_label: Loadable
---

`Lodable` 객체는 Recoil [atom](/docs/api-reference/core/atom) 혹은 [selector](/docs/api-reference/core/selector)의 최신 상태를 대표합니다. 이 상태는 사용가능한 값을 가지고 있거나 에러 상태이거나 혹은 여전히 비동기 해결 보류 중일 수 있습니다. `Lodable` 은 다음의 인터페이스를 가집니다.

- `state`: atom 혹은 selector의 최신 상태입니다. 가능한 값은 '`hasValue`', '`hasError`', 혹은 '`loading`' 입니다.
- `contents`: `Lodable`에 의해서 대표되는 값입니다. 만약 상태가 `hasValue` 라면, 이는 실제 값입니다. 만약 상태가 `hasError` 라면 이는 던져진 Error 객체입니다. 그리고 만약 상태가 'loading'이라면 `toPromise()`를 사용하여 값의 `Promise`를 얻을 수 있습니다.

Lodable은 최신 상태에 접근하기 위한 도우미 메서드를 가지고 있습니다. *이 API는 아직 불안정합니다:*

- `getValue()` - React Suspense와 Recoil selectors의 시맨틱에 매치되는 값에 접근하기 위한 메서드. 만약 상태가 값을 가지고 있다면 값을 리턴하며, error를 가지고 있다면 해당 error를 던집니다. 만약 여전히 보류중이라면 실행을 연기하거나 보류중인 상태를 전파하기 위해 리렌더링합니다.
- `toPromise()`: selector가 resolve되면 resolve될 `Promise` 를 리턴합니다. selector가 동기이거나 이미 resolve된 상태라면, 즉시 resolve 되는 `Promise` 를 리턴합니다.
- `valueMaybe()` - 가능하다면 값을 리턴하며 다른 경우에는 `undefined` 를 리턴합니다.
- `valueOrThrow()` - 가능하다면 값을 리턴하거나 Error를 던집니다.
- `map()` - Lodable의 값을 변형하기 위한 함수를 받으며 새로운 Lodable을 변형된 값과 함께 리턴합니다. 변형 함수는 값의 매개변수를 받아 새로운 값을 리턴합니다; 던져진 에러나 suspense를 전파할 수도 있습니다.

### Example

```jsx
function UserInfo({userID}) {
const userNameLoadable = useRecoilValueLoadable(userNameQuery(userID));
switch (userNameLoadable.state) {
case 'hasValue':
return <div>{userNameLoadable.contents}</div>;
case 'loading':
return <div>Loading...</div>;
case 'hasError':
throw userNameLoadable.contents;
}
}
```

Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
title: <RecoilRoot ...props />
sidebar_label: <RecoilRoot />
---

값들을 갖는 원자 컨텍스트를 제공한다. Recoil의 hooks를 사용하는 모든 구성 요소의 조상이어야 한다. 여러개의 루트가 같이 존재할 수 있다. 원자는 각각의 루트 안에서 구별되는 값들을 가질 것 이다. 만약 그것들이 중첩되어 있다면, 가장 안쪽의 루트는 완벽하게 바깥쪽의 루트들을 가릴 것이다.

---

**속성**:

- `initializeState?`: `(MutableSnapshot => void)`
- [`MutableSnapshot`](/docs/api-reference/core/Snapshot#transforming-snapshots)을 사용하여 `<RecoilRoot>`의 원자 상태를 초기화하는 옵션 함수. 이것은 초기 렌더링에 대한 상태를 설정하며 이후 상태 변경이나 비동기적인 초기화를 위한 것이 아니다. 비동기 상태 변경에는 [`useSetRecoilState()`](/docs/api-reference/core/useSetRecoilState) 또는 [`useRecoilCallback()`](/docs/api-reference/core/useRecoilCallback)과 같은 Hooks를 사용하십시오.

### 예시

```jsx
import {RecoilRoot} from 'recoil';

function AppRoot() {
return (
<RecoilRoot>
<ComponentThatUsesRecoil />
</RecoilRoot>
);
}
```
Loading