Javascript 反应挂钩,状态未正确更改
在这个项目中,我使用react钩子,这个片段用来改变项目的颜色主题,但有一个问题我无法解决。 常量lightTheme={ ... }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
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另一种选择是,请检查我的答案,它值得投票: