基于 Delphi 的前后端分离:之三,使用 HTMX

# 前请提要

基于 Delphi 的前后端分离:之一_delphi 后台+vue-CSDN博客

基于 Delphi 的前后端分离:之二_后端 框架 delphi-CSDN博客

# 发现一个非常好的前端框架 - HTMX

这里仍然使用之二里面提到的页面模板,但采用 HTMX 来和后端交互,做到前端显示的内容来自后端服务器的动态代码。

首先,整个页面的完整代码,是基于 BootStrap 框架的一个现成的页面。在这个页面里面,某个位置显示了价格 $12 是写死在页面里面的。
价格显然应该是动态的,价格数据由服务器端输出。因此,前端的页面里面需要加上代码,从服务器端获得最新的价格,呈现到页面上。

如果是最传统的 WEB 编程方式,就是在服务器端把包含价格信息在内的整个页面从 <html> 开始彻底重新构造一遍,全部输出给客户端。


### 页面代码:

#### 要使用 HTMLX
页面的头部,加上这行引用:

```

<script src="https://unpkg.com/htmx.org@1.9.12"></script>


```

#### 页面代码片段
```

<h2 class="amount" hx-get="/price?No=1" hx-target="#price_1" hx-trigger="load delay:0.1s hx-swap="innerHTML"><span id="price_1">$12</span><span class="duration">/mo</span></h2>


```

### 解释:
这里,和 HTMLX 有关的部分:

1. 必须写齐以下几个,差一个都不行。
2. hx-get="/price?No=1"  -- 请求的是服务器端的路径 "/price"。访问的页面是 http://localhost:8080,这里就会变成 http://locaohost:8080/price
3. hx-trigger="load delay:0.1s  -- 这个 get 动作如何触发。这里写 load delay 就是页面加载后延迟一下触发。后面的 0.1s 是指延迟 0.1 秒。如果写成 1s 就是延迟 1 秒。如果没有这一句,不会触发 get 动作。
4. hx-swap="innerHTML"  -- 替换目标的 innerHTML 还是 outerHTML;没有这一句,也不会触发 get 动作;
5. hx-target="#price_1"  -- 这里的 "#price_1" 里面的 price_1 就是页面代码里面的那个  id="price_1" 所指的页面元素。target 的意思就是从服务器端获得的字符串,替换掉这个页面元素。

因此,上述代码,在页面加载完成后,就会自动执行 http get 方法,路径是 price,然后把从服务器端获得的字符串,替换掉 $12 这个字符串。页面上就显示出了服务器端给出来的价格。

对应的服务器端代码:

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  No: string;
begin
  No := Request.QueryFields.Values['No'];

  if No = '1' then
    Response.Content := '$99'
  else
  if No = '2' then
    Response.Content := '$88';
end;

程序运行的页面

其中,99 和 88 是由后端代码输出的。另外两个是页面里面静态写死的,没有改为后端服务器输出。

## 对比使用 ajax 的 javasctipt

```

  <script>

      axios.get('http://127.0.0.1:8080/price?Id=1')
    .then(function(response){
        //请求成功
        document.getElementById("price_1").innerHTML = "$" + response.data;
    }).catch(function(erroe){
        //请求失败
    });
  </script>


```

使用 axios 库,调用 get 方法,然后将从服务器端获取的字符串,替换掉页面里面 id 为 "price_1" 的元素的值。显然这段代码,比前面 HTMLX 的代码,麻烦多了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/692195.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目-基于LangChain的ChatPDF系统

问答系统需求文档 一、项目概述 本项目旨在开发一个能够上传 PDF 文件&#xff0c;并基于 PDF 内容进行问答互动的系统。用户可以上传 PDF 文件&#xff0c;系统将解析 PDF 内容&#xff0c;并允许用户通过对话框进行问答互动&#xff0c;获取有关 PDF 文件内容的信息。 二、…

python中的函数递归

函数递归&#xff0c;就是一个函数&#xff0c;自己调用自己。 如上图所示&#xff0c;是一段通过定义函数&#xff0c;编写函数体来实现for循环。实现的是从1到n的累乘。即求n的阶乘&#xff0c; 如上图所示&#xff0c;是一段函数的递归来实现1到n的累乘操作&#xff0c;将1*…

思维,CF1575K - Knitting Batik

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1575K - Knitting Batik 二、解题报告 1、思路分析 诈骗题&#xff0c;上面…

变声器软件免费版有哪些?国内外12大热门变声器大盘点!(新)

变声软件是一种人工智能AI音频处理工具&#xff0c;允许用户实时修改自己的声音或改变预先录制的音频。这些软件解决方案可提供不同的效果&#xff0c;如改变声音的音调或速度&#xff0c;或将我们的声音转换成其他人或其他东西的声音&#xff0c;如名人、卡通人物、机器人或不…

C++开源项目:pathcopycopyV20源码及运行程序

PathCopyCopy 是一个开源的 Windows 资源管理器扩展项目&#xff0c;旨在为用户提供一个更加高效、便捷的文件路径复制和管理工具。以下是关于 PathCopyCopy 开源项目的详细介绍&#xff1a; 1. 项目概述 2. 项目技术分析 3. 项目功能 4. 项目特点 5. 项目应用场景 6. 项目…

记一次源码部分丢失后补救过程

起因 最近植物大战僵尸杂交版玩的入迷&#xff0c;写了一个“神奇”小工具&#xff0c;来辅助游戏。用Git新建一个库&#xff0c;想把代码备份到GitHub&#xff0c;结果push错库了&#xff0c;无奈reset&#xff0c;结果把本地项目一起reset了&#xff0c;结果就是源代码丢失。…

服务器数据恢复—服务器raid5上层zfs文件系统数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台某品牌X3650M3服务器&#xff0c;服务器中有一组raid5磁盘阵列&#xff0c;上层采用zfs文件系统。 服务器未知原因崩溃&#xff0c;工作人员排查故障后发现服务器的raid5阵列中有两块硬盘离线导致该阵列不可用&#xff0c;服务器内…

springboot报错:Failed to start bean ‘documentationPluginsBootstrapper‘

项目场景&#xff1a; springboot项目启动时报错 问题描述 具体报错信息&#xff1a; 可能原因分析&#xff1a; 1、SpringFox的版本与Spring Boot的版本不兼容。解决这个问题&#xff0c;你可能需要检查你正在使用的SpringFox和Spring Boot的版本&#xff0c;确保它们是兼容…

Python01 -分解整包数据到各个变量操作和生成器

Python 的星号表达式可以用来解决这个问题。比如&#xff0c;你在学习一门课程&#xff0c;在学期末的时候&#xff0c;你想统计下家庭作业的平均成绩&#xff0c;但是排除掉第一个和最后一个分数。如果只有四个分数&#xff0c;你可能就直接去简单的手动赋值&#xff0c;但如果…

Java Web学习笔记24——Vue项目开发流程

import是引入文件。 export是将对象导出为模块。 new Vue({ router, router: h > h(App) }).$mount(#app) App.vue: vue的组成文件以.vue结尾&#xff0c;每个组件由三个部分组成&#xff1a;<template>、<script>、<style>。 <template><d…

【MMU】——页表映射示例

文章目录 页表映射示例一级页表二级页表二级页表的优势页表映射示例 一级页表 上图一级页表中假设以 4KB 物理页为映射单位,一个进程 4GB 的虚拟地址空间需要:4GB/4KB = 1MB 个页表项,每个页表项目占用 4 个字节所以每个一级页表需要 4MB 的存储空间,每个进程需要 4MB 的内…

【教学类-36-07】20240608动物面具(通义万相)-A4大小7图15手工纸1图

背景需求&#xff1a; 风变的AI对话大师一年到期了&#xff0c;也没有看到续费的按钮。不能使用它写代码了。 MJ早就用完了&#xff0c;最后480次&#xff0c;我担心信息课题会用到它生图&#xff0c;所以不敢用。 最近探索其他类似MJ的免费出图工具——找到了每天给50张免费图…

Django 连接mysql数据库配置

1&#xff0c;提前创建注册的app1应用 Test/Test/settings.py python manage.py startapp app1 2&#xff0c;配置mysql数据库连接 Test/Test/settings.py DATABASES {default: {ENGINE: django.db.backends.mysql,# 数据库名字NAME: db1,# 连接mysql数据库用户名USER: ro…

如何在Coze中实现Bot对工作流的精准调用(如何提高Coze工作流调用的准确性和成功率)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 工作流(workflow)📒📝 创建设计工作流📝 添加工作流📝 调用工作流⚓️ 相关链接 ⚓️📖 介绍 📖 在使用Coze平台创建智能Bot时,您可能会遇到一个常见问题:即便添加了正确的工作流,Bot却没有按照预期调用它们。…

国产操作系统上给virtualbox中win7虚拟机安装增强工具 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上给virtualbox中win7虚拟机安装增强工具 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上给win7虚拟机安装virtualbox增强工具的文章。VirtualBox增强工具&#xff08;Guest Additions&a…

45-2 waf绕过 - XSS 绕过WAF方法

环境准备: 43-5 waf绕过 - 安全狗简介及安装-CSDN博客然后安装pikachu靶场:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客打开pikachu靶场 http://127.0.0.1/pikachu-master/vul/xss/xss_reflected_get.php 使用常见payload被安全狗拦截…

【Python】解决Python报错:AttributeError: ‘list‘ object has no attribute ‘shape‘

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 使用列表代替NumPy数组2.2 错误的数据类型转换 3. 解决方案3.1 确保使用NumPy数组3.2 检查数据类型 4. 预防措施4.1 使用类型注解4.2 编写单元测试 结语 引言 在使用Python进行数据处理或科学计算时&#xff0c;可能会…

操作系统的启动过程和初始化

参考来源&#xff1a; Linux的启动过程&#xff0c;作者&#xff1a;阮一峰 第一步、加载内核 操作系统接管硬件以后&#xff0c;首先读入 /boot 目录下的内核文件。 rootub1804:/boot# ls -l 总用量 120636 -rw-r--r-- 1 root root 237767 5月 19 2023 config-5.4.0-15…

【C语言】冒泡排序(经典算法,干货满满!!!)

目录 前言1、原理2、冒泡排序的应用3、对冒泡排序的应用的优化4、冒泡排序适用于以下情况 前言 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单直观的排序算法&#xff0c;它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它…

嵌入式学习——4——C++中的动态内存分配和回收(堆区)

1、内存的分配与回收 C语言中使用的是malloc和free函数进行动态内存分配和回收的。 C中依然可以使用上述的两个函数来完成动态内存分配和回收的。 C也给用户提供了两个关键字new、delete来完成动态内存分配和回收的 单个分配、回收 //在堆区申请了int类型的大小空间&#xff0c…