--- title: "callOnce" description: "Run a given function or block of code once during SSR or CSR." navigation: badge: New links: - label: Source icon: i-simple-icons-github to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/once.ts size: xs --- ::important This utility is available since [Nuxt v3.9](/blog/v3-9). :: ## Purpose The `callOnce` function is designed to execute a given function or block of code only once during: - server-side rendering but not hydration - client-side navigation This is useful for code that should be executed only once, such as logging an event or setting up a global state. ## Usage The default mode of `callOnce` is to run code only once. For example, if the code runs on the server it won't run again on the client. It also won't run again if you `callOnce` more than once on the client, for example by navigating back to this page. ```vue [app.vue] ``` It is also possible to run on every navigation while still avoiding the initial server/client double load. For this, it is possible to use the `navigation` mode: ```vue [app.vue] ``` ::important `navigation` mode is available since [Nuxt v3.15](/blog/v3-15). :: ::tip{to="/docs/getting-started/state-management#usage-with-pinia"} `callOnce` is useful in combination with the [Pinia module](/modules/pinia) to call store actions. :: :read-more{to="/docs/getting-started/state-management"} ::warning Note that `callOnce` doesn't return anything. You should use [`useAsyncData`](/docs/api/composables/use-async-data) or [`useFetch`](/docs/api/composables/use-fetch) if you want to do data fetching during SSR. :: ::note `callOnce` is a composable meant to be called directly in a setup function, plugin, or route middleware, because it needs to add data to the Nuxt payload to avoid re-calling the function on the client when the page hydrates. :: ## Type ```ts callOnce (key?: string, fn?: (() => any | Promise), options?: CallOnceOptions): Promise callOnce(fn?: (() => any | Promise), options?: CallOnceOptions): Promise type CallOnceOptions = { /** * Execution mode for the callOnce function * @default 'render' */ mode?: 'navigation' | 'render' } ``` ## Parameters - `key`: A unique key ensuring that the code is run once. If you do not provide a key, then a key that is unique to the file and line number of the instance of `callOnce` will be generated for you. - `fn`: The function to run once. This function can also return a `Promise` and a value. - `options`: Setup the mode, either to re-execute on navigation (`navigation`) or just once for the lifetime of the app (`render`). Defaults to `render`. - `render`: Executes once during initial render (either SSR or CSR) - Default mode - `navigation`: Executes once during initial render and once per subsequent client-side navigation