Demo cách dùng sử dụng useContext

1 useContext là gì?

useContext là 1 tính năng của reactjs giúp chúng ta truyền state từ component này sang component 1 cách đơn giản mà không cần qua nhiều cấp cha 

2 Quy trình dùng useContext

định nghĩa 1 context ===>  bao bọc toàn bộ thành phần DOM của component bằng thẻ Provider ==> dùng useContext để xử lý và truyền các biến giữa các component

3 Demo 

Demo này sẽ tạo provide sử dụng useContext để chuyển chế độ theme light hay dark 

Đầu tiên chúng ta tạo nextjs app hoặc create app .Ở đây mình dùng nextjs app vì mình quen dùng nó với lệnh sau :

npx create-next-app@latest

Sau khi cài đặt xong chúng ta có 1 folder chứa nextjs farmwork

Tạo file src\provide\ThemeProvide.tsx chứa các định nghĩa về context và bao bọc DOM .Code như sau : 

'use client'
import React, { createContext, useState } from 'react'
export const ThemeContext = createContext({ theme: 'light', toggletheme: () => { } })
const ThemeProvide = ({ children }: { children: React.ReactNode }) => {
    const [theme, setTheme] = useState('light');
    const toggletheme = () => {

        setTheme(theme === 'light' ? 'dark' : 'light')
    }

    return (
        <>
            <ThemeContext.Provider value={{ theme: theme, toggletheme }}>
                {children}
            </ThemeContext.Provider>
        </>
    )
}

export default ThemeProvide

Giờ hcúng ta gắn nó vào file src\app\layout.tsx để có thể xử dụng useContext ở mọi component

import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
import ThemeProvide from "@/provide/ThemeProvide";
import Mynavbar from "@/components/Mynavbar";

const inter = Inter({ subsets: ["latin"] });

export const metadata: Metadata = {
  title: "Create Demo useContext",
  description: "Generated by create next app",
};

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <ThemeProvide>
          <Mynavbar />
          {children}
        </ThemeProvide>
      </body>
    </html>
  );
}

Chúng ta sẽ xem cách sử dụng chúng thông qua demo truyền dữ vào vào context và lấy nó ra như sau 

Trong file src\app\post\page.tsx

'use client'
import { ThemeContext } from '@/provide/ThemeProvide'
import React, { useContext } from 'react'

const PostPage = () => {
    const { theme, toggletheme } = useContext(ThemeContext);
    return (
        <div>
            {theme}
        </div>
    )
}

export default PostPage

Trong file src\components\Theme.tsx

'use client'
import { ThemeContext } from '@/provide/ThemeProvide'
import React, { useContext } from 'react'

const Theme = () => {
    const { theme, toggletheme } = useContext(ThemeContext);
    return (
        <>
            <button
                onClick={toggletheme}
                className="inline-flex items-center justify-center px-8 py-4 font-sans font-semibold tracking-wide text-white bg-blue-500 rounded-lg h-[60px]">
                Change theme
            </button>
            <h3>Theme đang dùng {theme}</h3>
        </>
    )
}

export default Theme