Afficher des campagnes par IP visiteur dans Vue React

Auteur:Lisa Farrell·2026-06-01

Les landing pages Vue, React et Next.js se prêtent bien aux modules de campagne régionaux. Après le contenu par défaut, le navigateur peut appeler l’interface IP et changer bannière, CTA ou lien.

Objectif de conception

Pour « Afficher des campagnes par IP visiteur dans Vue React », la page doit rester utile avant la fin de la requête IP. Le résultat géographique n’est qu’un enrichissement : il est validé, limité à une décision précise et ignoré si les données sont incomplètes.

Flux de requête et de décision

Afficher des campagnes par IP visiteur dans Vue React: Le flux ci-dessous est propre à cette implémentation et ne reprend pas une liste générique de contrôle IP.

  1. Étape 1 — État par défaut: DEFAULT_CAMPAIGN
  2. Étape 2 — Requête: getCountry()
  3. Étape 3 — Validation: sessionStorage
  4. Étape 4 — Décision: cleanup / onScopeDispose
  5. Étape 5 — Repli: CAMPAIGNS record

Exemple orienté production

Afficher des campagnes par IP visiteur dans Vue React: L’exemple ajoute un délai maximal, la validation de la réponse, un repli déterministe et une gestion adaptée au cycle de vie du framework.

// geoClient.ts
export async function getCountry(signal?: AbortSignal): Promise<string | null> {
  const cached = sessionStorage.getItem('ipin_country_v2');
  if (cached && /^[A-Z]{2}$/.test(cached)) return cached;
  const timeout = new AbortController();
  const timer = setTimeout(() => timeout.abort(), 2200);
  const combined = signal ? AbortSignal.any([signal, timeout.signal]) : timeout.signal;
  try {
    const response = await fetch('https://my.ipin.io/info', {signal: combined});
    if (!response.ok) throw new Error(`HTTP ${response.status}`);
    const data: unknown = await response.json();
    const value = typeof data === 'object' && data !== null && 'country' in data
      ? String((data as {country?: unknown}).country || '').toUpperCase() : '';
    if (!/^[A-Z]{2}$/.test(value)) return null;
    sessionStorage.setItem('ipin_country_v2', value);
    return value;
  } finally { clearTimeout(timer); }
}

// React
const DEFAULT = {title: 'Global webinar', url: '/events/global'};
const CAMPAIGNS = {JP:{title:'Tokyo webinar',url:'/events/jp'}, DE:{title:'Berlin webinar',url:'/events/de'}};
export function GeoCampaign() {
  const [campaign, setCampaign] = React.useState(DEFAULT);
  React.useEffect(() => {
    const controller = new AbortController();
    getCountry(controller.signal)
      .then(code => { if (code && CAMPAIGNS[code]) setCampaign(CAMPAIGNS[code]); })
      .catch(error => { if (error.name !== 'AbortError') console.warn(error); });
    return () => controller.abort();
  }, []);
  return <a href={campaign.url}>{campaign.title}</a>;
}

// Vue 3 composable
export function useGeoCampaign() {
  const campaign = ref(DEFAULT);
  const controller = new AbortController();
  getCountry(controller.signal)
    .then(code => { if (code && CAMPAIGNS[code]) campaign.value = CAMPAIGNS[code]; })
    .catch(error => { if (error.name !== 'AbortError') console.warn(error); });
  onScopeDispose(() => controller.abort());
  return {campaign};
}

Matrice de tests

Avant de publier « Afficher des campagnes par IP visiteur dans Vue React », exécutez ces cas avec des réponses simulées ou une sortie VPN contrôlée.

ConditionEntrée / configurationRésultat attendu
T1SSR: window=undefinedDEFAULT markup
T2country=JPJP campaign
T3unmount before responseabort; no state update
T4country=<script>DEFAULT; storage unchanged

Test automatisé / smoke test

it('keeps the default campaign for an invalid payload', async () => {
  vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
    ok: true, json: async () => ({country: '<script>'})
  }));
  render(<GeoCampaign />);
  expect(screen.getByRole('link')).toHaveTextContent('Global webinar');
});

Gestion des échecs

Afficher des campagnes par IP visiteur dans Vue React: Une erreur doit être visible dans les journaux ou les outils de développement, sans laisser un bloc vide ni casser le paiement.

ÉchecCauseRéponse
hydration mismatchserver ≠ client statesame DEFAULT object
AbortErrorroute changeignore cancellation
stale storageconfig versionversioned key / TTL
data=nullresponse shapetype guard

Cas pratique

Un usage réaliste de « Afficher des campagnes par IP visiteur dans Vue React » : une page de webinaire rend d’abord une campagne par défaut compatible SSR, puis passe à l’événement régional après validation de la réponse côté client.

Notes de mise en production

Afficher des campagnes par IP visiteur dans Vue React: Conservez un HTML par défaut complet. La localisation IP ne prouve pas l’identité et ne doit pas servir de contrôle d’autorisation côté client.

Conclusion

« Afficher des campagnes par IP visiteur dans Vue React » dispose désormais de son propre parcours d’implémentation, de tests concrets et d’un comportement de repli défini.