Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to share and update array of objects between 2 components

I wonder if anyone can help?

I have a list of base users that I fetch from an API and render to the page via the Dashboard component.

I want to create another list, in a separate route/component (Favorites), that allows for a user to create a personalized user list, like a list of favorites.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

At the moment, I am stuck on what to now do with the array of favorites. How do I get the array sharable from Dashboard to Favorites? Could I create a context? But how would that look?

Below is my dashboard component that contains the base list and the favorites.

A sandbox is https://codesandbox.io/s/affectionate-frost-8zuzw1?file=/src/components/Dashboard/Dashboard.js:304-370 for anyone interested

 const Dashboard = () => {
  const navigate = useNavigate();
  const [favourites, setFavourites] = useState([]);

  const { data: usersData } = useFetchUsers();

  const onClickHandlerAdd = (user) => {
    setFavourites([...favourites, user]);
  };

  return (
    <div>
      <button
        onClick={() => {
          navigate("/myList");
        }}
      >
        Navigate To My List
      </button>
      {usersData?.map((user) => (
        <>
          <div key={user.id}>
            <p>{user.id} </p>
            <p>{user.name}</p>
            <button onClick={() => onClickHandlerAdd(user)}>Add</button>
          </div>
        </>
      ))}
      Another List
      {favourites?.map((user) => (
        <>
          <div key={user.id}>
            <p>{user.id} </p>
            <p>{user.name}</p>
          </div>
        </>
      ))}
    </div>
  );
};

export default Dashboard;

>Solution :

You can create a context in App.js with createContext, create the state and pass it into your components with the Provider of your context like so:

export const FavContext = createContext();

const App = () => {
  const [favourites, setFavourites] = useState([]);

  return (
    <FavContext.Provider value={{ favourites, setFavourites }}>
      <HashRouter>
        <Routes>
          <Route path={"/"} element={<Dashboard />} />
          <Route path={"/favorites"} element={<Favorites />} />
        </Routes>
      </HashRouter>
    </FavContext.Provider>
  );
};

Now you can access the objects passed into the components by importing the context and extract them using useContext:

import { FavContext } from "../../App";

const Favorites = () => {
  const navigate = useNavigate();
  const { favourites } = useContext(FavContext);

  return (
    <div>
      <button
        onClick={() => {
          navigate("/");
        }}
      >
        Navigate To Dashboard
      </button>
      {favourites?.map((user) => (
        <>
          <div key={user.id}>
            <p>{user.id} </p>
            <p>{user.name}</p>
          </div>
        </>
      ))}
    </div>
  );
};

Edit black-rain-q9p5fn

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading