【问题标题】:React's Context API with typescriptReact 的 Context API 和 typescript
【发布时间】:2020-09-21 11:09:34
【问题描述】:

我有一个demo

它是一个使用 Typescript 的简单 React 应用程序。

我正在尝试使用 Reacts Context 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;

【问题讨论】:

  • 有什么错误?

标签: reactjs typescript react-context


【解决方案1】:

你错过了 渲染

import { render } from "react-dom";
render(<App />, document.getElementById("root"));

in your demo

【讨论】:

猜你喜欢
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 2019-06-07
  • 2021-08-21
  • 2018-11-14
  • 1970-01-01
相关资源
最近更新 更多