Данные локального хранилища не сохраняются

#javascript #reactjs #local-storage

Вопрос:

ОБНОВЛЕНИЕ: он работает. проблема была в эффекте использования

Когда я пытаюсь «отправить» конкретную задачу, в локальном хранилище отображается, что атрибут статуса не изменен. Интересно, в чем я ошибаюсь? Данные, которые я пытаюсь использовать для обновления локального хранилища, — это initialState.stuff .

Вот мой код для reducer.js:

 const reducer = (state,action)=>{
    if(action.type ==="completed"){
//the relevant attributes to be changed 

        let temp = state.stuff.map((task)=>{
            if(task.id === action.payload){
                return {...task,status:status,enddate:enddate}
            }
            return task;
        });
// the rest of the parts of this code is irrelevant
 

вот мой код для context.js:

 import React, {useState,useContext,useEffect,useReducer} from "react"
import reducer from "./reducer";
const AppContext = React.createContext()

const initialState = {
    stuff: null
}
const AppProvider =  ({children}) =>{
    const [tasks,setTasks] = useState([])
    const [status,changeStatus] = useState("");
    const [state,dispatch] = useReducer(reducer,initialState)
    const complete = (id) =>{
        dispatch({type:"completed",payload:id})
        console.log("done", initialState.stuff)
        setTasks(initialState.stuff)
    }

    const deleted = (id) =>{
        dispatch({type:"deleted",payload:id})
    }

    const getLocalStorage = () =>{
        state.stuff = localStorage.getItem("tasks")
        if(state.stuff){
          state.stuff = JSON.parse(state.stuff)
          return JSON.parse(localStorage.getItem("tasks"))
        }
        else{
          return []
        }
      }
      const fetchData = async()=>{
        setLoading(true)
        setTasks(getLocalStorage());
        setLoading(false);
      }
      useEffect(()=>{
          fetchData()
      },[])

      useEffect(()=>{
        localStorage.setItem("tasks",JSON.stringify(tasks))
      },[tasks])


return <AppContext.Provider
value = {{
    loading,
    tasks,setTasks
}}>
    {children}
</AppContext.Provider>
}


export const useGlobalContext = () =>{
    return useContext(AppContext)
}
export {AppContext,AppProvider}
 

Комментарии:

1. Вы пытаетесь обновить состояние в «state.stuff = localStorage.GetItem…» в getLocalStorage? Потому что мне это кажется неправильным.

2. э-э, да @Zeeshan

3. я на самом деле пытаюсь обновить состояние, а затем обновить локальное хранилище

Ответ №1:

Я думаю, что в вашем коде может быть (я не полностью прочитал ваш код) столкновение переменных. Вы можете попробовать написать window.localStorage вместо localStorage этого и проверить, решает ли это вашу проблему.