From 3f196b98097075b8372faa7a49e11c81f0609520 Mon Sep 17 00:00:00 2001 From: Naruepanart Siangsanan <33704769+naruepanart@users.noreply.github.com> Date: Thu, 20 Jun 2019 00:14:09 +0700 Subject: Update thai language (#36) --- README-th-th.md | 559 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 559 insertions(+) create mode 100644 README-th-th.md (limited to 'README-th-th.md') diff --git a/README-th-th.md b/README-th-th.md new file mode 100644 index 0000000..14ed918 --- /dev/null +++ b/README-th-th.md @@ -0,0 +1,559 @@ +

+ + English | + 中文 | + Русский | + ภาษาไทย + +
+ (Please contribute translations!) +

+ +# Unstated Next + +> ขนาดเพียง 200 ไบต์ ดังนั้น ฉันไม่เคยคิดเรื่อง React state management libraries อีกเลย + +- **React Hooks** ใช้เพื่อจัดการสถานะทั้งหมดของคุณ +- **~200 bytes** มีขนาดเพียง 200 ไบต์เท่านั้น +- **Familiar API** เป็นเพียงส่วนเล็กๆในการเขียน React +- **Minimal API** ใช้เวลาเพียง 5 นาทีในการเรียนรู้ +- **Written in TypeScript** ทำให้การเขียน React สะดวกมากยิ่งขึ้น + +แต่.. คำถามสำคัญคือ มันดีกว่า Redux จริงหรือไม่ ? มาดูคำตอบกัน... + +- **It's smaller.** มีขนาดเล็ก 40 เท่า +- **It's faster.** แก้ปัญหาเรื่องประสิทธิภาพการทำงานให้ดียิ่งขึ้น +- **It's easier to learn.** สิ่งที่คุณจะต้องรู้คือ React Hooks และ Context +- **It's easier to integrate.** ง่ายต่อการนำไปต่อยอดและ สามารถทำงานร่วมกับ React library ได้อย่างสบายๆ +- **It's easier to test.** ลดการระยะเวลาในการทดสอบ +- **It's easier to typecheck.** ออกแบบมาเพื่อทำให้คุณสามารถนำไปพัฒนาต่อได้ +- **It's minimal.** มันเป็นเพียง React + +ดังนั้น ถ้าคุณตัดสินใจ + +### [พัฒนาต่อยอดมาจาก Unstated docs →](#migration-from-unstated) + +## ติดตั้ง + +```sh +npm install --save unstated-next +``` + +## ตัวอย่าง + +```js +import React, { useState } from "react" +import { createContainer } from "unstated-next" +import { render } from "react-dom" + +function useCounter(initialState = 0) { + let [count, setCount] = useState(initialState) + let decrement = () => setCount(count - 1) + let increment = () => setCount(count + 1) + return { count, decrement, increment } +} + +let Counter = createContainer(useCounter) + +function CounterDisplay() { + let counter = Counter.useContainer() + return ( +
+ + {counter.count} + +
+ ) +} + +function App() { + return ( + + + +
+
+ +
+
+
+
+ ) +} + +render(, document.getElementById("root")) +``` + +## API + +### `createContainer(useHook)` + +```js +import { createContainer } from "unstated-next" + +function useCustomHook() { + let [value, setValue] = useState() + let onChange = e => setValue(e.currentTarget.value) + return { value, onChange } +} + +let Container = createContainer(useCustomHook) +// Container === { Provider, useContainer } +``` + +### `` + +```js +function ParentComponent() { + return ( + + + + ) +} +``` + +### `` + +```js +function useCustomHook(initialState = "") { + let [value, setValue] = useState(initialState) + // ... +} + +function ParentComponent() { + return ( + + + + ) +} +``` + +### `Container.useContainer()` + +```js +function ChildComponent() { + let input = Container.useContainer() + return +} +``` + +### `useContainer(Container)` + +```js +import { useContainer } from "unstated-next" + +function ChildComponent() { + let input = useContainer(Container) + return +} +``` + +## คู่มือ + +ถ้าคุณไม่เคยใช้ React Hooks มาก่อน, เราแนะนำให้หยุดและอ่านเอกสารของ React Hooks ก่อน [เอกสารของ React Hooks](https://reactjs.org/docs/hooks-intro.html). + +ดังนั้นโดย hooks คุณอาจสร้างคอมโพเนนต์เหมือนกับตัวอย่างข้างล่างนี้ + +```js +function CounterDisplay() { + let [count, setCount] = useState(0) + let decrement = () => setCount(count - 1) + let increment = () => setCount(count + 1) + return ( +
+ +

You clicked {count} times

+ +
+ ) +} +``` + +จากนั้นถ้าคุณต้องการ share logic behind หลังคอมโพเนนต์, คุณสามารถดึงมันออกมาเพื่อเป็น Hooks ที่สามารถกำหนดเองได้ : + + +```js +function useCounter() { + let [count, setCount] = useState(0) + let decrement = () => setCount(count - 1) + let increment = () => setCount(count + 1) + return { count, decrement, increment } +} + +function CounterDisplay() { + let counter = useCounter() + return ( +
+ +

You clicked {counter.count} times

+ +
+ ) +} +``` + +แต่ถ้าคุณต้องการ share state นอกเหนือจาก logic, ควรจะทำอย่างไร ? + +นี่เป็นตัวอย่าง : + +```js +function useCounter() { + let [count, setCount] = useState(0) + let decrement = () => setCount(count - 1) + let increment = () => setCount(count + 1) + return { count, decrement, increment } +} + +let Counter = createContext(null) + +function CounterDisplay() { + let counter = useContext(Counter) + return ( +
+ +

You clicked {counter.count} times

+ +
+ ) +} + +function App() { + let counter = useCounter() + return ( + + + + + ) +} +``` + +มันเยี่ยมมาก , ยอดเยี่ยม, คนส่วนมากควรเขียนโค้ดแบบนี้ + +แต่บางครั้งเราทุกคนจำเป็นต้องมีโครงสร้างเพิ่มเติมเล็กน้อย และ โดยเพื่อ API design ให้มันถูกต้องอย่างสม่ำเสมอ + +โดย เริ่มต้นฟังก์ชัน `createContainer()` , คุณสามารถใช้ Hooks แบบกำหนดเองได้ "containers" และมี API คอยเตือนและ ป้องกันคุณจากการใช้งานผิดพลาด + +```js +import { createContainer } from "unstated-next" + +function useCounter() { + let [count, setCount] = useState(0) + let decrement = () => setCount(count - 1) + let increment = () => setCount(count + 1) + return { count, decrement, increment } +} + +let Counter = createContainer(useCounter) + +function CounterDisplay() { + let counter = Counter.useContainer() + return ( +
+ +

You clicked {counter.count} times

+ +
+ ) +} + +function App() { + return ( + + + + + ) +} +``` + +นี่คือความแตกต่างของการเปลี่ยนแปลง : + +```diff +- import { createContext, useContext } from "react" ++ import { createContainer } from "unstated-next" + + function useCounter() { + ... + } + +- let Counter = createContext(null) ++ let Counter = createContainer(useCounter) + + function CounterDisplay() { +- let counter = useContext(Counter) ++ let counter = Counter.useContainer() + return ( +
+ ... +
+ ) + } + + function App() { +- let counter = useCounter() + return ( +- ++ + + + + ) + } +``` + +หากคุณใช้ TypeScript (ซึ่งฉันขอแนะนำให้คุณเรียนรู้เพิ่มเติม), สิ่งนี้ยังมีประโยชน์ในการสร้าง TypeScript เพื่อสามารถนำไปต่อยอดของทำงานได้ดีขึ้น. + +## เทคนิค + +### เทคนิค #1: Composing Containers + +เพราะ เราสามารถทำงานกับ React hooks แบบกำหนดเองได้, เราสามารถเขียนคอนเทนเนอร์ภายใน hooks อื่นๆ ได้ + +```js +function useCounter() { + let [count, setCount] = useState(0) + let decrement = () => setCount(count - 1) + let increment = () => setCount(count + 1) + return { count, decrement, increment, setCount } +} + +let Counter = createContainer(useCounter) + +function useResettableCounter() { + let counter = Counter.useContainer() + let reset = () => counter.setCount(0) + return { ...counter, reset } +} +``` + +### เทคนิค #2: Keeping Containers Small + +สิ่งนี้มีประโยชน์ในการเก็บในค่าไว้ใน containers เล็กและชัดเจน. ซึ่งมันเป็นสิ่งสำคัญ ถ้าคุณต้องการทำ code split กับ logic ใน containers ของคุณ : แค่ย้ายทั้งหมดไปที่ own hooks และ เก็บค่า state ไว้ใน containers. + +```js +function useCount() { + return useState(0) +} + +let Count = createContainer(useCount) + +function useCounter() { + let [count, setCount] = Count.useContainer() + let decrement = () => setCount(count - 1) + let increment = () => setCount(count + 1) + let reset = () => setCount(0) + return { count, decrement, increment, reset } +} +``` + +### เทคนิค #3: Optimizing components + +ไม่มี "การเพิ่มประสิทธิภาพ" ใน `unstated-next` , เพราะ React ทำการเพิ่มประสิทธิภาพไว้ให้อยู่แล้ว + +#### 1) เพิ่มประสิทธิภาพโดย splitting component ออกเป็นส่วนๆ + +**ก่อน:** + +```js +function CounterDisplay() { + let counter = Counter.useContainer() + return ( +
+ +

You clicked {counter.count} times

+ +
+
+
+
SUPER EXPENSIVE RENDERING STUFF
+
+
+
+
+ ) +} +``` + +**หลัง:** + +```js +function ExpensiveComponent() { + return ( +
+
+
+
SUPER EXPENSIVE RENDERING STUFF
+
+
+
+ ) +} + +function CounterDisplay() { + let counter = Counter.useContainer() + return ( +
+ +

You clicked {counter.count} times

+ + +
+ ) +} +``` + +#### 2) เพิ่มประสิทธิภาพด้วย useMemo() + +**ก่อน:** + +```js +function CounterDisplay(props) { + let counter = Counter.useContainer() + + // Recalculating this every time `counter` changes is expensive + let expensiveValue = expensiveComputation(props.input) + + return ( +
+ +

You clicked {counter.count} times

+ +
+ ) +} +``` + +**หลัง:** + +```js +function CounterDisplay(props) { + let counter = Counter.useContainer() + + // Only recalculate this value when its inputs have changed + let expensiveValue = useMemo(() => { + return expensiveComputation(props.input) + }, [props.input]) + + return ( +
+ +

You clicked {counter.count} times

+ +
+ ) +} +``` + +#### 3) ลดการ re-renders โดยใช้ React.memo() และ useCallback() + +**ก่อน:** + +```js +function useCounter() { + let [count, setCount] = useState(0) + let decrement = () => setCount(count - 1) + let increment = () => setCount(count + 1) + return { count, decrement, increment } +} + +let Counter = createContainer(useCounter) + +function CounterDisplay(props) { + let counter = Counter.useContainer() + return ( +
+ +

You clicked {counter.count} times

+ +
+ ) +} +``` + +**หลัง:** + +```js +function useCounter() { + let [count, setCount] = useState(0) + let decrement = useCallback(() => setCount(count - 1), [count]) + let increment = useCallback(() => setCount(count + 1), [count]) + return { count, decrement, increment } +} + +let Counter = createContainer(useCounter) + +let CounterDisplayInner = React.memo(props => { + return ( +
+ +

You clicked {props.count} times

+ +
+ ) +}) + +function CounterDisplay(props) { + let counter = Counter.useContainer() + return +} +``` + +#### 4) ครอบ elements ของคุณด้วย `useMemo()` + +[via Dan Abramov](https://github.com/facebook/react/issues/15156#issuecomment-474590693) + +**ก่อน:** + +```js +function CounterDisplay(props) { + let counter = Counter.useContainer() + let count = counter.count + + return ( +

You clicked {count} times

+ ) +} +``` + +**หลัง:** + +```js +function CounterDisplay(props) { + let counter = Counter.useContainer() + let count = counter.count + + return useMemo(() => ( +

You clicked {count} times

+ ), [count]) +} +``` + +## สิ่งนี้สัมพันธ์กับ Unstated + +สิ่งนี้โดยสืบทอดมาจาก [Unstated](https://github.com/jamiebuilds/unstated). ฉันสร้าง Unstated เพราะฉันเชื่อว่า React ยอดเยี่ยมมาก ในเรื่องของการจัดการ state อยู่แล้ว และ สิ่งที่ขาดหายไปเพียงอย่างเดียวคือ sharing state และ logic อย่างง่าย. ดังนั้น ฉันสร้าง Unstated เพื่อให้มัน "minimal" ที่สุด และ จะสามารถจัดการเรื่อง sharing React state และ logic. + +อย่างไรก็ตาม, โดย React Hooks เคลมว่า จะสามารถจัดการ sharing state and logic ได้ดีมากยิ่งขึ้น. จนถึงจุดที่ฉันคิดว่า Unstated ได้กลายเป็นสิ่งที่ไม่จำเป็นแล้ว. + +**อย่างไรก็ตาม**, ฉันคิดว่านักพัฒนาซอฟต์แวร์หลายคนดิ้นรน เพื่อดูว่า share state และ logic ทำอย่างไร โดย React Hooks สำหรับ "application state". นั่นอาจเป็นปัญหาของ เอกสาร และ ชุมชน, แต่ฉันคิดว่า API สามารถช่วยเชื่อมโยงสิ่งนั้นได้ โดยอุดช่องว่างของปัญหาที่เกิดขึ้น. + +API นั้นคืออะไร Unstated Next. แทนที่จะเป็น "Minimal API for sharing state and logic in React", ตอนนี้มันเป็น "Minimal API for understanding shared state and logic in React". + +แทนที่จะใช้ Unstated, คุณแค่ต้องการใช้ React, ฉันขอแนะนำว่า. ควรจะเขียนบล็อกเกี่ยวกับสิ่งนั้น !! และ กระจายความรู้ เพื่อเป็นทำให้เกิด community ที่ดีขึ้น + +## ย้ายจาก `unstated` + +ฉันตั้งใจเผยแพร่ นี่เป็นแพ็คเกจแยกต่างหาก เพราะ เป็นการรีเซ็ตที่สมบูรณ์ใน API. วิธีนี้คุณสามารถมีทั้งการติดตั้งและ ย้ายมา เพื่อใช้งานแบบเป็นค่อยไป ทีละ Component. + +โปรดให้ข้อเสนอแนะกับฉัน เกี่ยวกับกระบวนการย้ายมาใช้งาน เพราะในอีกไม่กี่เดือนข้างหน้าฉันหวังว่าจะรับข้อเสนอแนะนั้นและ ทำสองสิ่ง: + +- ตรวจสอบให้แน่ใจ `unstated-next` ตอบสนองทุกความต้องการของผู้ใช้งาน `unstated`. +- ตรวจสอบให้แน่ใจ `unstated` มีกระบวนการโยกย้ายมาใช้งานที่ clean `unstated-next`. + +ฉันอาจเลือกที่จะเพิ่ม API ทั้ง library เพื่อทำให้นักพัฒนา ทำงานได้ง่ายขึ้น. สำหรับ `unstated-next` ฉันสัญญาว่า API ที่เพิ่มจะน้อยที่สุดเท่าที่จะเป็นไปได้ และ ฉันจะพยายามจะเก็บ library ให้มีขนาดเล็กที่สุด. + +ในอนาคต, ฉันคิดว่าจะรวม `unstated-next` เข้าไปใน `unstated` ที่เป็นเวอร์ชันหลักในตอนนี้. `unstated-next` จะยังคงอยู่เพื่อให้คุณสามารถติดตั้งทั้ง `unstated@2` และ `unstated-next` ได้. จากนั้นเมื่อทำการโยกย้ายเสร็จ คุณสามารถอัปเดตเป็น`unstated@3` และ จะลบ `unstated-next` + +แม้ว่านี่เป็นการเปลี่ยนแปลง API ใหม่ที่สำคัญ, ฉันหวังว่าฉันจะทำให้การย้ายครั้งนี้เป็นเรื่องง่ายที่สุดสำหรับคุณ. ฉันจะปรับให้เหมาะสม เพื่อให้คุณใช้งานได้ React Hooks APIs และ ไม่ใช่สำหรับ preserving code ที่เขียนด้วย `Unstated.Container`. และ อย่าลังเลที่จะให้ข้อเสนอแนะเกี่ยวกับวิธีการที่สามารถทำได้ดีกว่าวิธีการที่ฉันคิดไว้ \ No newline at end of file -- cgit v1.2.3