Переключатель пользовательского интерфейса материала без изменения пользовательского интерфейса

#reactjs #react-router #material-ui #react-router-dom #uiswitch

#reactjs #react-маршрутизатор #материал-пользовательский интерфейс #react-router-dom #uiswitch

Вопрос:

Я использую переключатель пользовательского интерфейса Material для изменения тем в многостраничном приложении. Единственная ошибка, которая возникает, это то, что переключатель не перемещается слева направо (функциональность пользовательского интерфейса не выполняется), но функциональность onChange работает нормально. Я поиграл с этим, оказывается, что когда я удаляю forceUpdate(), переключатель пользовательского интерфейса материала будет работать, но компонент не будет повторно отображен. Что в forceUpdate мешает работе функциональности коммутатора?

App.tsx :

 import React from "react"
import {Switch, Route, BrowserRouter, Redirect} from "react-router-dom"
import Main from "./Main"
import {createMuiTheme, ThemeProvider} from "@material-ui/core";

class App extends React.Component<any, any>{

darkmode=true

theme=createMuiTheme({
    palette:{
        type:this.darkmode?"dark" : "light"

    },
})

changeTheme=()=>{
    this.darkmode=!this.darkmode;
   
    this.theme = createMuiTheme({
        palette:{
            type:this.darkmode?"dark" : "light"
        }
    })
    this.theme.spacing(10)
    this.forceUpdate()
}


render(){
    return(
       
   
           <div>
                <BrowserRouter>
                    <Switch>
                        <Route  path="/" component={()=>
                            <Main theme={this.theme} changeTheme={this.changeTheme} />
                        }
                                                    
                    </Switch>
                </BrowserRouter>

           </div>

       

    )
}
 

}

Main.tsx:

 class Main extends React.Component<any,any>{
    render(){
        return(
            <div>
                <Switch onChange={()=>this.props.changeTheme()}></Switch>
                <Switch></Switch>
            </div>
        )
    }
}
 

Ответ №1:

вы не использовали состояния, пользовательский интерфейс не будет повторно отображаться, если вы не передадите новое состояние

   constructor(props) {
    super(props);
    this.state = {darkmode: true};
  }
this.setState({
      darkmode: !darkmode
    });
 

здесь вам помогут два фрагмента кода: первый — при инициализации состояния
, а второй — при обновлении

По умолчанию, при изменении состояния или реквизита вашего компонента, ваш компонент будет повторно отображаться. Если ваш метод render() зависит от каких-то других данных, вы можете сообщить React, что компонент нуждается в повторной визуализации, вызвав forceUpdate() .

возьмите из react doc, в котором объясняется, что он делает, в основном, это принудительный принудительный компонент, которого вам следует избегать, чтобы все использовать и выполнять чтение из реквизитов и состояния