跳到主要内容

与 Svelte 集成

DHTMLX Booking 通过单文件组件与 Svelte 集成,将 widget 挂载到绑定的容器中。本指南将引导您完成 Svelte 项目的脚手架搭建、Booking 的安装以及带有数据和事件的 widget 渲染。完整的参考实现请参见 GitHub 上的 Svelte 示例

提示

本指南假设您已熟悉 Svelte 的核心概念。如需入门介绍,请参阅 Svelte 文档

创建项目

在添加 Booking 集成之前,先搭建一个 Svelte 项目脚手架。

信息

开始之前,请先安装 Vite(可选)和 Node.js

以下命令运行 Vite 脚手架工具:

npm create vite@latest

在提示时将项目命名为 my-svelte-booking-app

安装依赖

切换到项目目录。

以下命令打开新创建的应用文件夹:

cd my-svelte-booking-app

使用您的包管理器安装依赖并启动开发服务器。

以下命令使用 yarn

yarn
yarn dev

以下命令使用 npm

npm install
npm run dev

应用将在本地运行,例如 http://localhost:5173

将 Booking 添加到应用

在安装 Booking 包之前先停止开发服务器,然后创建一个包装 widget 的 Svelte 组件。

第一步:安装包

下载 Booking 试用包 并按照包中 README 的步骤操作。试用版本有效期为 30 天。

第二步:创建 Booking 组件

src/ 目录中创建 Booking.svelte 文件,并按照以下步骤连接 widget。

导入源文件

使用与您的发行版匹配的路径导入 Booking 类和样式表:

  • dhx-booking-package — 从本地文件夹安装的 PRO 版本
  • @dhx/trial-booking — 试用版本

以下代码片段从 PRO 包导入 Booking:

Booking.svelte
<script>
import { Booking } from 'dhx-booking-package';
import 'dhx-booking-package/dist/booking.css';
</script>

如果您的 PRO 包附带压缩资源,请将 CSS 文件导入为 booking.min.css

以下代码片段从试用包导入 Booking:

Booking.svelte
<script>
import { Booking } from '@dhx/trial-booking';
import '@dhx/trial-booking/dist/booking.css';
</script>
信息

本教程使用 Booking 的试用版本。

设置容器并初始化 Booking

使用 bind:this 绑定宿主容器,并在 onMount() 内实例化 Booking。在 onDestroy() 中调用 destructor(),以便在 Svelte 移除组件时卸载 widget。

以下代码片段声明了一个带有绑定容器和生命周期钩子的 Booking 组件:

Booking.svelte
<script>
import { onMount, onDestroy } from "svelte";
import { Booking } from "@dhx/trial-booking";
import "@dhx/trial-booking/dist/booking.css";

let container; // Booking 的宿主容器
let booking;

onMount(() => {
// 创建 Booking 实例
booking = new Booking(container, {})
});

onDestroy(() => {
booking.destructor(); // 卸载 Booking
});
</script>

<div bind:this={container} class="widget"></div>

添加样式

Booking 需要 widget 样式表(已在上方导入)和一个有尺寸的容器。在项目的主 CSS 文件中为页面和 widget 容器设置全高。

以下代码片段为页面和 Booking 容器设置全高:

main.css
/* 页面样式;使用 #app 根容器 */
html,
body,
#app {
height: 100%;
padding: 0;
margin: 0;
}

/* Booking 容器 */
.widget {
height: 100%;
}

加载数据

要将卡片数据加载到 Booking 中,请准备一个匹配 data 属性的数据集。有关完整的数据格式和加载场景,请参阅加载数据指南。

src/ 目录中创建 data.js 文件。

以下代码片段定义了一个返回示例数据集的 getData() 辅助函数:

data.js
export function getData() {
function getDate(addDays, hoursValue = 0, minutesValue = 0) {
const date = new Date();
const secondsValue = 0; // 取整到分钟
const msValue = 0;

date.setDate(date.getDate() + addDays);
date.setHours(hoursValue, minutesValue, secondsValue, msValue);

return date.getTime();
}

return [
{
id: "ee828b5d-a034-420c-889b-978840015d6a",
title: "Natalie Tyson",
category: "Therapist",
subtitle: "2 years of experience",
details: "Cleveland Clinic\n9500 Euclid Ave",
preview: "https://snippet.dhtmlx.com/codebase/data/booking/01/img/01.jpg",
price: "$35",
review: {
stars: 4,
count: 120
},
slots: [
{
from: 9,
to: 20,
days: [1, 2, 3, 4, 5]
},
{
from: 10,
to: 18,
days: [6, 0]
}
]
},
{
id: "9b037564-77be-429f-b719-eebbe499027a",
title: "Emma Johnson",
category: "Cardiologist",
subtitle: "2 years of experience",
details: "Stanford Health Care\n1468 Madison Ave",
preview: "https://snippet.dhtmlx.com/codebase/data/booking/01/img/03.jpg",
price: "$25",
review: {
stars: 5,
count: 10
},
slots: [
{
from: 14,
to: 17,
size: 30,
gap: 10
},
{
from: 12,
to: 19,
size: 50,
gap: 20,
days: [2],
dates: [getDate(0)]
},
{
from: "18:30",
to: 20,
size: 20,
gap: 20,
days: [3, 4, 5]
}
],
usedSlots: [getDate(0, 12), getDate(0, 18)]
},
// ...
];
}

打开 App.svelte,导入数据集,并将数据集作为 prop 传递给 <Booking/> 组件。

以下代码片段渲染带有 data prop 的 Booking 组件:

App.svelte
<script>
import Booking from "./Booking.svelte";
import { getData } from "./data.js";

const dataset = getData();
</script>

<Booking data={dataset} />

打开 Booking.svelte,将 data prop 传入 Booking 配置。

以下代码片段将 prop 连接到 Booking 构造函数:

Booking.svelte
<script>
import { onMount, onDestroy } from "svelte";
import { Booking } from "@dhx/trial-booking";
import "@dhx/trial-booking/dist/booking.css";

export let data;

let container;
let booking;

onMount(() => {
booking = new Booking(container, {
data
})
});

onDestroy(() => {
booking.destructor();
});
</script>

<div bind:this={container} class="widget"></div>

Booking 组件现在将以加载的数据渲染。如需进一步自定义 widget,可传入额外的配置属性——完整列表请参见 Properties 概览

处理事件

用户在 widget 中的操作会触发一个事件。使用 booking.api.on(eventName, handler) 订阅事件以响应该操作。完整的事件列表请参见 Events 概览

打开 Booking.svelte,在 onMount() 中添加事件订阅。

以下代码片段在用户选择时间段时打印时间段 ID:

Booking.svelte
<script>
// ...
let booking;

onMount(() => {
booking = new Booking(container, {})

// 打印选中的时间段 id
booking.api.on("select-slot", (obj) => {
console.log(obj.id);
});
});

onDestroy(() => {
booking.destructor();
});
</script>

// ...

启动应用,即可在页面上看到加载了数据的 Booking。

在 Svelte 应用中加载数据的 DHTMLX Booking 小部件

根据您的项目需求自定义代码。完整的参考实现可在 GitHub 上获取。