Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 反应挂钩,状态未正确更改_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 反应挂钩,状态未正确更改

Javascript 反应挂钩,状态未正确更改,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,在这个项目中,我使用react钩子,这个片段用来改变项目的颜色主题,但有一个问题我无法解决。 常量lightTheme={ ... } const darkTheme = { ... } export const ThemeState = ({children}) => { const initialState = { theme: lightTheme } const [state, dispatch] = useReducer(Action

在这个项目中,我使用react钩子,这个片段用来改变项目的颜色主题,但有一个问题我无法解决。 常量lightTheme={ ... }

  const darkTheme = {
     ...
  }
 export const ThemeState = ({children}) => {

  const initialState = {
     theme: lightTheme
  }

  const [state, dispatch] = useReducer(ActionReducer, initialState)

  const {theme} = state 

  const themeToggler = (e) => {
     e.preventDefault()
     console.log(theme)
     if(theme == lightTheme){
        dispatch({type:THEME, payload: darkTheme})
     }
     else if(theme == darkTheme){
        dispatch({type:THEME, payload: lightTheme})
     }
   }
知识是一种美德,是一种美德,是一种美德,是一种美德

我的减速机:

export const ActionReducer = (state, action) => {
         switch(action.type) {
           case THEME:
             return{
               ...state,
               theme: action.payload
            }
           default:
              return state
   }
};

Here is component with toggle button by each click, I need to change theme in state, it clicks correctly: 

我创建了一个关于这种行为的最小示例:

常数暗色={ 颜色:绿色 }; 常量lightTheme={ 颜色:红色 }; 导出默认功能应用程序{ const[useLightTheme,setUseLightTheme]=useStatetrue; 回来 setUseLightTheme!useLightTheme}>切换 一些示例文本 ; }
由于您没有提供所有相关代码,例如减速器,因此我无法解释您的代码。

我创建了一个关于此行为的最小示例:

常数暗色={ 颜色:绿色 }; 常量lightTheme={ 颜色:红色 }; 导出默认功能应用程序{ const[useLightTheme,setUseLightTheme]=useStatetrue; 回来 setUseLightTheme!useLightTheme}>切换 一些示例文本 ; }
由于您没有提供所有相关代码,例如减速器,因此我无法解释您的代码。

您需要的是在按钮单击时切换主题:

所以你可以这样做:

Themstate

从React导入React,{useReducer}; 从./ActionTypes导入{TOGGLE_THEME}; 从导入ActionReducer。/ActionReducer; 常量lightTheme={ 正文:E2, 正文:363537 }; 常数暗色={ 正文:363537, 文本:FAFA }; 常量初始状态={ isLightTheme:真实 }; export const themstate={children}=>{ const[state,dispatch]=usereducationreducer,initialState; const{isLightTheme}=状态; 常数themeToggler=e=>{ e、 防止违约; 调度{type:TOGGLE_THEME}; }; const backgroundColor=isLightTheme?lightTheme.body:darkTheme.body; const fontColor=isLightTheme?lightTheme.text:darkTheme.text; 回来

一些文本

切换主题 当前主题:{isLightTheme?亮:暗} ; }; ActionReducer:

import { TOGGLE_THEME } from "./ActionTypes";

export default function(state, action) {
  switch (action.type) {
    case TOGGLE_THEME:
      return {
        ...state,
        isLightTheme: !state.isLightTheme
      };
    default:
      return state;
  }
}
操作类型:

export const TOGGLE_THEME = "TOGGLE_THEME";

您需要的是在单击按钮时切换主题:

所以你可以这样做:

Themstate

从React导入React,{useReducer}; 从./ActionTypes导入{TOGGLE_THEME}; 从导入ActionReducer。/ActionReducer; 常量lightTheme={ 正文:E2, 正文:363537 }; 常数暗色={ 正文:363537, 文本:FAFA }; 常量初始状态={ isLightTheme:真实 }; export const themstate={children}=>{ const[state,dispatch]=usereducationreducer,initialState; const{isLightTheme}=状态; 常数themeToggler=e=>{ e、 防止违约; 调度{type:TOGGLE_THEME}; }; const backgroundColor=isLightTheme?lightTheme.body:darkTheme.body; const fontColor=isLightTheme?lightTheme.text:darkTheme.text; 回来

一些文本

切换主题 当前主题:{isLightTheme?亮:暗} ; }; ActionReducer:

import { TOGGLE_THEME } from "./ActionTypes";

export default function(state, action) {
  switch (action.type) {
    case TOGGLE_THEME:
      return {
        ...state,
        isLightTheme: !state.isLightTheme
      };
    default:
      return state;
  }
}
操作类型:

export const TOGGLE_THEME = "TOGGLE_THEME";
最初的主题是主体:{e2e2',文本:'363537'}

单击按钮时,您将记录此主题{body:e2e2,text:363537},这是正确的初始主题

记录之后,将主题更新为黑色主题{body:'363537',text:'FAFAFA'}

再次单击按钮后,将记录此操作:{body:363537,text:FAFAFA}

现在问题来了,因为在每个渲染上都创建了暗色调对象,所以引用与上一个不一样,所以如果暗色调==暗色调,则比较失败,因为暗色调对象与上一个暗色调对象不同

将主题对象生成移出组件,这样就不会在每次渲染时生成新的主题对象,或者向主题添加类型:

const lightTheme = {
  body: '#E2E2E2',
  text: '#363537',
  type: "light"
}`
然后比较它们:iftheme.type==darkTheme.type

最初的主题是body:{e2e2',text:'363537'

单击按钮时,您将记录此主题{body:e2e2,text:363537},这是正确的初始主题

记录之后,将主题更新为黑色主题{body:'363537',text:'FAFAFA'}

再次单击按钮后,将记录此操作:{body:363537,text:FAFAFA}

现在问题来了,因为在每个渲染上都创建了暗色调对象,所以引用与上一个不一样,所以如果暗色调==暗色调,则比较失败,因为暗色调对象与上一个暗色调对象不同

将主题对象生成移出组件,这样就不会在每次渲染时生成新的主题对象,或者向主题添加类型:

const lightTheme = {
  body: '#E2E2E2',
  text: '#363537',
  type: "light"
}`

然后比较它们:iftheme.type==darkTheme.type

你能添加你的ActionReducer吗?把状态记录在console.log的哪里?你需要发布你的ActionReducer和theme reducer代码
所以我们可以帮你找到任何issues@Domino987,我把我的减速机别在哪里,你把它记录在哪里@Domino987在if操作符之前,看你能添加你的ActionReducer和你的console.log状态吗?你需要发布你的ActionReducer和theme reducer代码,这样我们可以帮助你找到任何issues@Domino987,我把我的减速机别在哪里,你把它记录在哪里@Domino987之前的if操作符,看我现在提供了reducer我现在提供了reducer谢谢,伙计,你太不可思议了,我现在没有react在渲染后创建新的引用,所以我只是把这个对象从函数中放出来,问题就解决了,谢谢again@AlexKhanas作为替代,请检查我的答案,它值得投票:谢谢,伙计,你太不可思议了,我现在没有说react会在渲染后创建新的引用,所以我只是把这个对象从函数中放出来,问题就解决了,谢谢again@AlexKhanas另一种选择是,请检查我的答案,它值得投票: