สอนโดย ศิริวัชร์ คุณาพร (จุ้น) Software Engineer @MUI
- คอร์สนี้คืออะไร? สอนการใช้งาน React Material UI v6 สำหรับสร้าง web interface
- เหมาะกับใคร? นักพัฒนาที่มีประสบการณ์ React เบื้องต้นมาแล้ว และยังไม่เคยใช้ Material UI หรือเคยใช้ในเวอร์ชั่นก่อนๆ
- เรียนจบแล้วได้อะไร?
- วิธีการเรียกใช้งาน Material UI component
- เข้าใจการ custom styles ใน Material UI component
- สามารถสร้าง theme ของตัวเองได้ จัดการ font, สี
- ทำให้ app รองรับ light & dark mode ได้
- สร้าง login form ตามมาตรฐานของเว็บได้
- ประยุกต์สร้าง custom component เพื่อใช้งานกับ Material UI ได้
- คอร์สนี้ไม่ครอบคลุมอะไร?
- คอร์สนี้เป็นการทำ mockup UI เท่านั้น ไม่มี application logic
- ไม่มี server เข้ามาเกี่ยวข้อง เป็น client-side และ local ทั้งหมด
ผลลัพธ์สุดท้ายคือหน้า Login Form ที่ผ่านการ theme แล้ว (link to Demo):
Checkout commit "Start from scratch" แล้วสร้าง branch ใหม่ (ใช้ชื่อตัวเอง เพราะหลังจากจบคอร์ส อยากให้เปิด PR มาให้ตรวจครับ)
ควรเปรียบเทียบ Solution ที่ได้กับ solution ในแต่ละ lesson. เรื่องของการเขียน CSS อาจไม่เหมือนกัน ไม่เป็นไร สำคัญที่ได้เรียนรู้วิธีการใช้ Material UI และ theme ในการสร้าง UI.
Requirement: render Button component ของ Material UI ให้ได้
Note:
yarn.lock
เกิดขึ้นจากการใช้ yarn ในการ install package แทน npm ถ้าใช้ npm จะเกิดpackage-lock.json
แทน
Browser จะมีการเซ็ต CSS default ที่ไม่เหมือนกัน CSS reset เลยเป็นที่นิยมเพราะว่าทำให้สไตล์เป็นมาตรฐานเดียวกันระหว่างเบราว์เซอร์ต่างๆ Material UI ก็มี CSS reset เป็นของตัวเองในชื่อ component CssBaseline.
Requirement: render CssBaseline ไว้บนสุดของ app
สำหรับ email input ให้ใช้ TextField component เนื่องจากครอบคลุม parameters ต่างๆในการทำ input
Requirement: render TextField พร้อมทั้งใส่ props ที่เหมาะสมสำหรับ email input
เพิ่ม password input
Requirement: render TextField พร้อมทั้งใส่ props ที่เหมาะสมสำหรับ password input
จะเห็นว่าทั้งสอง input มันติดกันอยู่ เราจะมาจัด layout ให้ดูเป็นระเบียบ น่าใช้งานมากขึ้น ด้วย Stack component. มันจะสร้าง spacing ระหว่าง children ของมันตามที่เราต้องการ
Requirement: render Stack เหนือทั้งสอง fields และใส่ spacing ตามต้องการ
มาจัด layout ของ form ให้อยู่ตรงกลางของหน้าจอ. ใน Material UI เวลาเราต้องการเขียน CSS เพิ่ม ขั้นตอนแรกคือให้ใช้ sx prop. sx prop เป็นคุณสมบัติพิเศษใน Material UI ที่ช่วยให้คุณสามารถเพิ่มสไตล์แบบใช้ครั้งเดียวให้กับคอมโพเนนต์ได้อย่างรวดเร็ว โดย Material UI component ทุกตัวรองรับ sx prop. (ลองใส่ sx ให้กับ Stack)
ในกรณีนี้จะขอแนะนำ component อีกหนึ่งตัวซึ่งหน้าที่ของมันมีแค่ให้เราเขียน sx ได้เท่านั้น component นี้ชื่อ Box, มันจะ render div ออกมาให้ แต่เราสามารถเปลี่ยน element ให้กับมันได้
Requirement: ใช้ Box และ sx prop จัด layout ให้ได้แบบในรูป
Tip: why
marginTop
is better than positionfixed
for making the form centered.
Requirement: เพิ่ม Remember me checkbox
Requirement: เพิ่ม Sign up link โดยใช้ Typography และ Link components ตาม design
Lesson guide, Typography docs, Link docs, Solution
ต่อมาจะเป็นการนำ icon ทั่วๆไปมาใช้กับ Material UI ใน social login
Requirement: สร้าง component GoogleIcon และ FacebookIcon ด้วย svg ที่ให้ และนำไปใช้งานกับ Button เพื่อสร้าง social login buttons
Lesson guide, Button + icon demo, SvgIcon docs, Solution
เพิ่มไตเติ้ล “Sign in” ด้วย Typography (h1)
เราได้ login form ที่พร้อมใช้งานแล้ว ทีนี้เราจะมาปรับ design ให้มันดู minimal มากขึ้น มีความโค้งมนดูสบายตาด้วยการสร้าง theme โดยขั้นตอนแรกเราจะเปลี่ยน สีพื้นหลัง กันก่อน
Requirement: สร้าง file ใหม่ชื่อ AppTheme.tsx โดย export component ชื่อ AppTheme ที่ render ThemeProvider กับ children, จากนั้นสร้าง theme ด้วย createTheme โดยใช้สีพื้นหลังเป็น #f5f5f5
Lesson guide, Theming docs, Solution
ต้อง update Material UI เป็น
6.0.1
หรือมากกว่า
Theme font ด้วย Inter. อย่าลืมว่าต้อง install font ด้วย เนื่องจาก Material UI ไม่ได้จัดการเรื่องการโหลด font ให้
Lesson guide, Theme font docs, Inter fontsource, Solution
Requirement: ปรับค่าของ shape.borderRadius
ให้เป็น 12
Requirement: ปรับ Box sx
prop ให้ใช้ค่า borderRadius
จาก theme ด้วย callback
Requirement: เลือกสีที่ชอบจาก Tailwind CSS color ใส่ใน palette.primary.main
ของ theme
Lesson guide, Theme palette docs, Solution
หลังจากที่จัดการ theme tokens แล้ว เราสามารถที่จะทำ theme ให้กับ component ได้ด้วย เวลาเราเรียกใช้ component ก็จะมีสไตล์ตาม theme ที่เรากำหนดทันที
Requirement: เพิ่ม theme ให้กับ Button ที่มี variant=”contained” และ color=“primary”
Requirement: เพิ่ม theme ให้กับ Button ที่มี variant=”outlined” ให้มี border color ที่อ่อนลง
Theme TextField ให้มี border color ที่อ่อนลง โดยการใช้ CSS selector target ไปที่ fieldset
Theme checkbox ด้วยการแทนที่ icon และปรับให้มี border color ที่อ่อนลง
เพิ่ม dark mode ให้กับเว็บ วิธีนี้จะทำให้เว็บเราปรับสีให้เข้ากับ system preference ที่ผู้ใช้งานตั้งค่าไว้, Debugging using Chrome devtool (emulate prefers-color-scheme)
ปัญหาจะเกิดขึ้นที่ Box เนื่องจากยังไม่ได้รองรับ dark mode ให้แก้โดยการใช้ theme.applyStyles เมื่อต้องการเพิ่ม styles ในแต่ละ mode
Note: ต้อง update Material UI เป็น
6.0.2
หรือมากกว่า
ในหลายๆเว็บไซต์จะมี control ให้ผู้ใช้งานสามารถปรับ mode ได้เอง ให้เพิ่ม Select โดยมี options คือ “System”, “Light”, “Dark” และใช้ useColorScheme hook ในการอ่านค่า mode, setMode
สามารถทำให้การพัฒนาเว็บไซต์ง่ายขึ้นด้วยการใช้ CSS variables ซึ่งปัจจุบันเป็นมาตราฐานของการทำเว็บไซต์ก็ว่าได้
Lesson solution, Docs, Solution
ใช้ predefined UI จาก MUI treasury. การพัฒนาเว็บไซต์จะเร็วขึ้นถ้าเราสามารถ copy โค้ดมาใช้งานในโปรเจคของเราได้
Requirement: เปลี่ยน ColorModeToggle ไปใช้ https://mui-treasury.com/?path=/story/color-scheme-select-icon--icon
เมื่อย่อหน้าจอไปที่ mobile viewport เราต้องการให้พื้นหลังของ Box นั้นหายไป ดังนั้นเราต้องใช้ media query เข้ามาช่วย ลองเขียน media query ตรงๆ แล้วค่อยขยับไปใช้ theme.breakpoints
เราสามารถใช้ Tailwind CSS ร่วมกับ Material UI ได้ โดยการใช้ preset จาก MUI Treasury ซึ่งจะทำให้เราสามารถใช้ Material UI theme tokens จาก Tailwind CSS class ได้
Preset จะทำหน้าที่เชื่อมโยงระหว่าง Material UI theme กับ Tailwind CSS class ให้เราสามารถใช้งานร่วมกันได้ง่ายขึ้น เช่น การใช้งาน color, responsive, elevation, shaddow, typography และอื่นๆ
สามารถดูวิธีการใช้งานได้จาก MUI Treasury - Tailwind Preset
Lesson guide, MUI Tailwind Preset, Solution