#how to avoid prop drilling in astro.

9 messages · Page 1 of 1 (latest)

sullen peak
#

How can i share a value with child components without prop drilling

astral spearBOT
#

Hi @sullen peak. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave:

#

Astro recommends the use of Nano Stores (https://github.com/nanostores/nanostores) for shared client-side storage. This allows you to share state across components without prop drilling. Here's a basic example of how you can use it:

  1. First, install Nano Stores using your preferred package manager:
npm install nanostores
# or
pnpm add nanostores
# or
yarn add nanostores
  1. Create a store. In this example, the store tracks whether a dialog is open or not:
// src/store.js
import { atom } from 'nanostores';
export const isOpen = atom(false);
  1. Import and use the store in a <script> tag in the components that will share state:
<!-- src/components/Button.astro -->
<button id="openDialog">Open</button>
<script>
import { isOpen } from '../store.js';

// Set the store to true when the button is clicked 
function openDialog() { 
  isOpen.set(true); 
}

// Add an event listener to the button 
document.getElementById('openDialog').addEventListener('click', openDialog);
</script>
<!-- src/components/Dialog.astro -->
<div id="dialog" style="display: none">Hello world!</div>
<script>
import { isOpen } from '../store.js';

// Listen to changes in the store, and show/hide the dialog accordingly 
isOpen.subscribe(open => { 
  if (open) { 
    document.getElementById('dialog').style.display = 'block'; 
  } else { 
    document.getElementById('dialog').style.display = 'none'; 
  } 
})
</script>

In this example, the Button and Dialog components each use the shared isOpen state to control whether a particular <div> is hidden or displayed. This way, you can avoid prop drilling and share state across components.

#

@sullen peak kapa.ai is still learning and improving, please let us know how it did by reacting below

sullen peak
#

without using third party librarires

#

@astral spear without using third party librarires

astral spearBOT
#

Let me check the knowledge base for you. One moment! :books:

#

Astro doesn't currently support a built-in way to share state across components without prop drilling or using third-party libraries like Nano Stores.

However, there's an open discussion on GitHub about making data from pages available in components without passing the data down the component hierarchy. You can follow the discussion here (https://github.com/withastro/astro/issues/1340) for updates.

In the meantime, you might have to pass data down through props or consider using a state management library.

Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: