reactjs - 使用 Gatsby.js 在重定向中捕获参数
问题描述
我有一个快速而肮脏的问题。
是否可以从 Gatsby.js 应用程序内部的服务器重定向中捕获查询参数?
我们有一个 Pardot 跟踪链接,它确实重定向到我们在 Gatsby.js 中构建的感谢页面,我想通过该重定向将一些查询参数传递给它自己的应用程序。
例如:
www.trackedlink.com/thank-you?programme_code=CODE_FROM_REDIRECT_ON_SERVERSIDE
将重定向到:
www.gatsbyapplicationthatwillreadthequery.com/thank-you?programme_code=CODE_FROM_REDIRECT_ON_SERVERSIDE
如果它来自应用程序外部,是否可以在应用程序内部读取该查询?
干杯,祝您度过愉快的一周!
解决方案
如果它们在客户端触发,则应用程序将捕获重定向,是的,如果它们来自应用程序外部或使用标准锚点,则有可能。不使用@reach/router
(<Link>
组件,因为它是一个限制)。
一种干净且可扩展的使用方法是在gatsby-browser.js
配置中添加函数:
import React from 'react';
import { checkUrlFunction } from './src/services/yourCheckUrlFunction';
export const onClientEntry = () => checkUrlFunction();
gatsby-browser.js
使用API添加函数onClientEntry
将在页面加载后触发您的函数。从文档中:
onClientEntry Function (_: emptyArg, pluginOptions: pluginOptions) => undefined
在 Gatsby 浏览器运行时首次启动时调用。
您的函数应如下所示:
export const checkUrlFunction = () => {
if (typeof window !== 'undefined') {
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const programmeCode= urlParams.get('programme_code')
if(programmeCode) window.localStorage.setItem('programmeCode', programmeCode)
console.log(programmeCode); // will output CODE_FROM_REDIRECT_ON_SERVERSIDE
};
};
如果在触发函数时未定义对象,请注意typeof window !== 'undefined'
避免出现问题的必要条件window
嗨 Ferran,感谢您的解决方案,但不幸的是,重定向发生时它不起作用。仅当查询字符串在应用程序内部时才有效
是的,添加函数的想法gatsby-browser.js
是避免checkUrlFunction()
在每个页面、模板或组件中添加。缺点是你失去了一点控制,但它节省了大量的覆盖代码并提高了可伸缩性和可读性。
谢谢,Ferran,如果你能给我看一个例子——那就太棒了!这个cookie主题对我来说是一种未知的水
因此,随着您的规范更新,我添加了该localStorage
方法,因为在这样的非 IDE 环境中更容易实现,但想法完全相同。
在函数中设置一个 Vault(
cookie
或localStorage
)自动化gatsby-browser.js
if(programmeCode) window.localStorage.setItem('programmeCode', programmeCode)
这将设置一个 localStorage 键/值对 ( 'programmeCode'
(key)/ programmeCode
(value)
在您的组件中访问该保管库。使用
componentDidMount
生命周期或useEffect
钩子来确保在挂载 DOM 树之前加载。useEffect(()=>{ if(typeof window !== undefined) console.log(window.location.getItem('programmeCode') }, [])
推荐阅读
- android - 删除导航栏上方不必要的空白
- c - C中 pow 的精度是否取决于参数的比例?
- python - 为什么 DNN 不学习?
- css - 将十六进制 CSS 变量与 alpha 值组合
- java - 正则表达式模式以查找模式的出现
- python - Vscode 中的 Python 调试 - 使其类似于 PyCharm?
- azure-devops - Azure DevOps 管道触发问题消息不会消失
- javascript - 如何使用javascript删除具有特定类的li中的重复ID?
- r - 如果使用预期比例而不是 R 中的计数,则卡方结果不相等
- vue.js - 努力访问vuex的状态