- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了 this ( github ) google auth 的 html 起始页,我想把它变成一个 astro 组件。我想将其转换为 .astro
文件并能够从后端传入 CLIENT_ID 和 API_KEY 的变量。我
这是来自谷歌的 HTML 代码:
<!DOCTYPE html>
<html>
<head>
<title>Google Calendar API Quickstart</title>
<meta charset="utf-8" />
</head>
<body>
<p>Google Calendar API Quickstart</p>
<!--Add buttons to initiate auth sequence and sign out-->
<button id="authorize_button" onclick="handleAuthClick()">Authorize</button>
<button id="signout_button" onclick="handleSignoutClick()">Sign Out</button>
<pre id="content" style="white-space: pre-wrap;"></pre>
<script type="text/javascript">
/* exported gapiLoaded */
/* exported gisLoaded */
/* exported handleAuthClick */
/* exported handleSignoutClick */
// TODO(developer): Set to client ID and API key from the Developer Console
const CLIENT_ID = '<YOUR_CLIENT_ID>';
const API_KEY = '<YOUR_API_KEY>';
// Discovery doc URL for APIs used by the quickstart
const DISCOVERY_DOC = 'https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest';
// Authorization scopes required by the API; multiple scopes can be
// included, separated by spaces.
const SCOPES = 'https://www.googleapis.com/auth/calendar.readonly';
let tokenClient;
let gapiInited = false;
let gisInited = false;
document.getElementById('authorize_button').style.visibility = 'hidden';
document.getElementById('signout_button').style.visibility = 'hidden';
/**
* Callback after api.js is loaded.
*/
function gapiLoaded() {
gapi.load('client', intializeGapiClient);
}
/**
* Callback after the API client is loaded. Loads the
* discovery doc to initialize the API.
*/
async function intializeGapiClient() {
await gapi.client.init({
apiKey: API_KEY,
discoveryDocs: [DISCOVERY_DOC],
});
gapiInited = true;
maybeEnableButtons();
}
/**
* Callback after Google Identity Services are loaded.
*/
function gisLoaded() {
tokenClient = google.accounts.oauth2.initTokenClient({
client_id: CLIENT_ID,
scope: SCOPES,
callback: '', // defined later
});
gisInited = true;
maybeEnableButtons();
}
/**
* Enables user interaction after all libraries are loaded.
*/
function maybeEnableButtons() {
if (gapiInited && gisInited) {
document.getElementById('authorize_button').style.visibility = 'visible';
}
}
/**
* Sign in the user upon button click.
*/
function handleAuthClick() {
tokenClient.callback = async (resp) => {
if (resp.error !== undefined) {
throw (resp);
}
document.getElementById('signout_button').style.visibility = 'visible';
document.getElementById('authorize_button').innerText = 'Refresh';
await listUpcomingEvents();
};
if (gapi.client.getToken() === null) {
// Prompt the user to select a Google Account and ask for consent to share their data
// when establishing a new session.
tokenClient.requestAccessToken({prompt: 'consent'});
} else {
// Skip display of account chooser and consent dialog for an existing session.
tokenClient.requestAccessToken({prompt: ''});
}
}
/**
* Sign out the user upon button click.
*/
function handleSignoutClick() {
const token = gapi.client.getToken();
if (token !== null) {
google.accounts.oauth2.revoke(token.access_token);
gapi.client.setToken('');
document.getElementById('content').innerText = '';
document.getElementById('authorize_button').innerText = 'Authorize';
document.getElementById('signout_button').style.visibility = 'hidden';
}
}
/**
* Print the summary and start datetime/date of the next ten events in
* the authorized user's calendar. If no events are found an
* appropriate message is printed.
*/
async function listUpcomingEvents() {
let response;
try {
const request = {
'calendarId': 'primary',
'timeMin': (new Date()).toISOString(),
'showDeleted': false,
'singleEvents': true,
'maxResults': 10,
'orderBy': 'startTime',
};
response = await gapi.client.calendar.events.list(request);
} catch (err) {
document.getElementById('content').innerText = err.message;
return;
}
const events = response.result.items;
if (!events || events.length == 0) {
document.getElementById('content').innerText = 'No events found.';
return;
}
// Flatten to string to display
const output = events.reduce(
(str, event) => `${str}${event.summary} (${event.start.dateTime || event.start.date})\n`,
'Events:\n');
document.getElementById('content').innerText = output;
}
</script>
<script async defer src="https://apis.google.com/js/api.js" onload="gapiLoaded()"></script>
<script async defer src="https://accounts.google.com/gsi/client" onload="gisLoaded()"></script>
</body>
</html>
我很快发现无法将这些变量模板化到 <script>
中标签。我尝试将变量附加到 window
和其他偷偷摸摸的东西都没有用。
最佳答案
您可以通过定义define:vars
将服务器变量共享到客户端<script />
上的属性或 <style />
.astro
中的标签模板。
阅读 astro 文档 here获取更多信息。
示例如下(来源:Astro 文档)
---
const foregroundColor = "rgb(221 243 228)"; // CSS variable shared
const backgroundColor = "rgb(24 121 78)"; // CSS variable shared
const message = "Astro is awesome!"; // Javascript variable shared
---
/* CSS variables to share */
<style define:vars={{ textColor: foregroundColor, backgroundColor }}>
h1 {
background-color: var(--backgroundColor);
color: var(--textColor);
}
</style>
/* Javascript variables to share */
<script define:vars={{ message }}>
alert(message);
</script>
There is also a concept of sharing states using
nanostore
stated in documentation . Itallows sharing states between components at framework level onclient-side. Not between client and server.Theoretically sharing states from server to client can be done usinghydration technique by combining
define:vars
andnanostore
librarymap
api during theonLoad
event may be 🧪.
关于astrojs - 如何将服务器变量传递给 astro 中的客户端 JS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73511984/
我定义了 nano store在src/themeStore.ts中: import { atom } from 'nanostores'; export const theme = atom('bl
我有一个 Astro.js 布局文件,其中包含页眉、页脚以及我希望在网站每个页面上显示的所有其他内容。我想将页面内容放入两个区域(名称槽)。中的一个区域和中的一个区域(页眉和页脚之间) 粗略地说,这是
我找到了 this ( github ) google auth 的 html 起始页,我想把它变成一个 astro 组件。我想将其转换为 .astro文件并能够从后端传入 CLIENT_ID 和 A
从 Play 商店下载应用程序的人可以使用 Astro Manager 和其他相关应用程序 轻松获取应用程序的 APK 文件。这些 apk 将通过一系列步骤进一步反编译以获取相应应用程序的所有资源文件
我正在计划一个网站,将主要是一个使用Astro的小册子网站。该网站的一个功能将是一个小型的Laravel应用程序。我的问题是,我应该将它们构建为两个独立的项目,并在它们之间建立链接,还是可以将它们组合
我想使用 Astro 在单个页面上呈现多个 .md 文件的内容。 我有这个文件结构: pages/ items/ item-1.md item-2.md item-3.md
请谁能帮助我如何在 astro.build 中使用 swiper 或任何其他 slider ? 就像我们在 React 中使用的那样。 最佳答案 如果您想将轮播实现为 React 组件,client:
我正在学习 Astro。我考虑在 Astro 组件中使用 MUI 的 Material 组件,例如 Button、Typography 等,因为我已经启用了 React 集成。 astro.confi
使用 Astro 和 TypeScript,我正在创建一个可重用的 UI 组件。该组件只是 的包装器HTML 标签。问题是我必须定义接口(interface) Props具有 的所有常规 HTML
如何在 Astro 中将 Markdown 转换为 HTML?如果您在 Astro 中导入 MD 文件,内容将 automatically be converted在后台转换为 HTML。 但我使用
我正在为我的 astro 项目使用一个 react 组件,但没有调用 onclick 事件。我只是想在按下链接时打印 link clicked,但我看不到任何事件被调用。这是我的 react 组件 -
我正在为我的 astro 项目使用一个 react 组件,但没有调用 onclick 事件。我只是想在按下链接时打印 link clicked,但我看不到任何事件被调用。这是我的 react 组件 -
我真的很喜欢 Android 版 Astro 应用程序中的工具栏,我想知道:您知道它是否是可重用组件,它是否开源,如果是 - 在哪里可以找到它;如果没有 - 您能否提供指向类似开源组件的链接。 最佳答
我正在使用带有严格类型检查的Astro。。我有一个名为“公文包”的收藏,我有几个惯例,在哪里存储我的公文包的图像。大概是这样的:。有没有办法将这样的逻辑附加到集合条目上?如果我能做到这一点就太好了:。
我正在使用带有严格类型检查的Astro。。我有一个名为“公文包”的收藏,我有几个惯例,在哪里存储我的公文包的图像。大概是这样的:。有没有办法将这样的逻辑附加到集合条目上?如果我能做到这一点就太好了:。
我们公司的一个项目是使用 Astro 和 Svelte 构建的。在此项目中,必须对 CMS 进行 API 调用才能动态创建博客文章。我想要一种方法让我的客户写博客文章,更新 CMS(GraphCMS)
我无法访问 astro 文件的查询参数。 给定 url http://localhost:3000/example?hello=meow: 如何从 example.astro 文件中访问 {hello
我无法访问 astro 文件的查询参数。 给定 url http://localhost:3000/example?hello=meow: 如何从 example.astro 文件中访问 {hello
我是一名优秀的程序员,十分优秀!