ค้นหาเว็บไซต์

reactjs - Typescript ข้อผิดพลาด - ไม่สามารถหาคอนเท็กซ์ของ react ในคอมโพเนนต์ลูกที่ห่อหุ้มอยู่


ฉันกำลังพยายามตั้งค่าบริบทในส่วนประกอบหลักแบบไดนามิกจากส่วนประกอบลูกโดยใช้โพสต์นี้เป็นแนวทาง

นี่คือไฟล์ App.tsx ของฉัน:

export interface User {
  username: string;
}

export interface iUserContext {
  users: User[];
  setUsers: React.Dispatch<React.SetStateAction<User[]>>;
}

function App() {
  const [users, setUsers] = useState<User[]>([]);
  const value = { users, setUsers };

  // set defaults
  const UsersContext = createContext<iUserContext>({
    users: [],
    setUsers: () => {},
  });

  return (
    <div className="App">
      <Router>
        <UsersContext.Provider value={value}>
          <Layout>
            <Switch>
              <Route path="/generated-links">
                <GeneratedLinks />
              </Route>
              <Route path="/">
                <GenerateLinks />
              </Route>
            </Switch>
          </Layout>
        </UsersContext.Provider>
      </Router>
    </div>
  );
}

จากนั้น ในไฟล์ GenerateLinks.tsx:

const GenerateLinks = () => {
  const history = useHistory();
  const { users, setUsers } = useContext<iUserContext>(UsersContext);

ข้อผิดพลาดที่ฉันได้รับเกิดจากอาร์กิวเมนต์ UsersContext เพียงแค่ตรงนี้ ^:

Cannot find name 'UsersContext'. Did you mean 'useContext'?

ฉันยังไม่เคยใช้ useContext และ TS ร่วมกันมาก่อน ดังนั้นอาจจะมีบางอย่างที่ฉันมองข้ามไป แต่ดูเหมือนว่า TS จะไม่ตรวจจับว่าฉันกำลังห่อคอมโพเนนต์นี้ด้วย providers ของ context ของผู้ใช้และส่งค่าเข้าไป มีไอเดียอะไรบ้างไหม?

คำตอบ #1

UsersContext ควรอยู่นอก App คอมโพเนนต์และทำเครื่องหมายเพื่อการส่งออก

export interface iUserContext {
  users: User[];
  setUsers: React.Dispatch<React.SetStateAction<User[]>>;
}

export const UsersContext = createContext<iUserContext>({
  users: [],
  setUsers: () => {},
});

function App() {
  const [users, setUsers] = useState<User[]>([]);
  const value = { users, setUsers };

  return (
    <div className="App">
      <Router>
        <UsersContext.Provider value={value}>

จากนั้น คุณสามารถนำเข้าได้ใน GenerateLinks:

import { UsersContext, iUserContext } from './App'

บทความที่เกี่ยวข้อง