React 的 Context API with typescript
React's Context API with typescript
我有一个demo
它是一个使用 Typescript 的简单 React 应用程序。
我正在尝试使用 Reacts 上下文 api
我创建了一个上下文 ThemeContext
,其中包含简单的主题样式值以用于其他组件。
然后我尝试使用这个主题上下文来设置图书列表的样式 - Booklist.tsx
我的问题是我根本无法让它工作并且没有任何显示
抱歉,我知道它很模糊,但任何人都可以帮忙看看我哪里出错了。
index.tsx
import React from 'react';
import BookList from './Booklist';
import ThemeContextProvider from './ThemeContext';
const App:React.FC = () => {
return (
<div className="App">
<ThemeContextProvider>
<BookList />
</ThemeContextProvider>
</div>
);
}
export default App;
ThemeContext.tsx
import React, {createContext} from 'react'
export interface Props {}
export interface State {
lightTheme: boolean
light:{syntax: string, ui: string, bg: string}
dark:{syntax: string, ui: string, bg: string}
toggleTheme:boolean
}
const defaultState:State = {
lightTheme: true,
light:{syntax:'', ui:'', bg:''},
dark:{syntax:'', ui:'', bg:''},
toggleTheme:false
}
export const ThemeContext = createContext(defaultState)
class ThemeContextProvider extends React.Component<Props, State> {
constructor(props: Props){
super(props)
this.state = {
lightTheme: true,
light: {syntax: '#555', ui: '#ddd', bg: '#eee'},
dark: {syntax: '#ddd', ui: '#333', bg: '#555'},
toggleTheme: false
}
}
render() {
return (
<ThemeContext.Provider value={{...this.state}}>
{this.props.children}
</ThemeContext.Provider>
);
}
}
export default ThemeContextProvider;
Booklist.tsx
import React from 'react'
import { ThemeContext } from './ThemeContext';
export interface Props {}
export interface State {
lightTheme: boolean
light:Darkness
dark:Darkness
}
interface Darkness{
syntax: string
ui: string
bg: string
}
class BookList extends React.Component<Props, State> {
render() {
return(
<ThemeContext.Consumer>
{(state) => {
const { lightTheme, light, dark} = this.state
const theme = lightTheme ? light : dark
return(
<div style={{color: theme.syntax, background: theme.bg}}>
<ul>
<li style={{background:theme.ui}}>Book One</li>
<li style={{background:theme.ui}}>Book Two</li>
</ul>
</div>
)
}}</ThemeContext.Consumer>
)
}
}
export default BookList;
你不见了
渲染
import { render } from "react-dom";
render(<App />, document.getElementById("root"));
我有一个demo
它是一个使用 Typescript 的简单 React 应用程序。
我正在尝试使用 Reacts 上下文 api
我创建了一个上下文 ThemeContext
,其中包含简单的主题样式值以用于其他组件。
然后我尝试使用这个主题上下文来设置图书列表的样式 - Booklist.tsx
我的问题是我根本无法让它工作并且没有任何显示
抱歉,我知道它很模糊,但任何人都可以帮忙看看我哪里出错了。
index.tsx
import React from 'react';
import BookList from './Booklist';
import ThemeContextProvider from './ThemeContext';
const App:React.FC = () => {
return (
<div className="App">
<ThemeContextProvider>
<BookList />
</ThemeContextProvider>
</div>
);
}
export default App;
ThemeContext.tsx
import React, {createContext} from 'react'
export interface Props {}
export interface State {
lightTheme: boolean
light:{syntax: string, ui: string, bg: string}
dark:{syntax: string, ui: string, bg: string}
toggleTheme:boolean
}
const defaultState:State = {
lightTheme: true,
light:{syntax:'', ui:'', bg:''},
dark:{syntax:'', ui:'', bg:''},
toggleTheme:false
}
export const ThemeContext = createContext(defaultState)
class ThemeContextProvider extends React.Component<Props, State> {
constructor(props: Props){
super(props)
this.state = {
lightTheme: true,
light: {syntax: '#555', ui: '#ddd', bg: '#eee'},
dark: {syntax: '#ddd', ui: '#333', bg: '#555'},
toggleTheme: false
}
}
render() {
return (
<ThemeContext.Provider value={{...this.state}}>
{this.props.children}
</ThemeContext.Provider>
);
}
}
export default ThemeContextProvider;
Booklist.tsx
import React from 'react'
import { ThemeContext } from './ThemeContext';
export interface Props {}
export interface State {
lightTheme: boolean
light:Darkness
dark:Darkness
}
interface Darkness{
syntax: string
ui: string
bg: string
}
class BookList extends React.Component<Props, State> {
render() {
return(
<ThemeContext.Consumer>
{(state) => {
const { lightTheme, light, dark} = this.state
const theme = lightTheme ? light : dark
return(
<div style={{color: theme.syntax, background: theme.bg}}>
<ul>
<li style={{background:theme.ui}}>Book One</li>
<li style={{background:theme.ui}}>Book Two</li>
</ul>
</div>
)
}}</ThemeContext.Consumer>
)
}
}
export default BookList;
你不见了 渲染
import { render } from "react-dom";
render(<App />, document.getElementById("root"));