如何使用JavaScript 将数据网格绑定到 GraphQL 服务

news2024/11/26 12:51:11

前言

作为一名前端开发人员,GraphQL对于我们来说是令人难以置信的好用。它可以用来简化数据访问,这让我们的工作变得更加容易。

什么是 GraphQL?它是一个抽象层,位于任意数量的数据源之上,并为您提供一个简单的 API 来访问所有数据。

GraphQL 的美妙之处在于您可以准确定义要从服务器返回的数据以及您希望其格式化的方式。它还允许您通过单个请求从多个来源获取数据。 GraphQL 还使用类型系统来提供更好的错误检查和消息传递。

简单尝试

我们可以用一个demo网址来尝试感受一下GraphQL的魅力所在:https://demodata.grapecity.com/northwind/ui/graphql

我们用 Microsoft 的经典 Northwind 数据库进行测试。假设我们想要获取产品列表,但我们只需要产品 ID 和名称字段。我们的查询如下所示:

{
  products {
    productId
    productName
  }
}

这是我们的查询测试器中的结果:

GraphQL 就是这么简单!

实际使用

日常开发过程中我们可以用我们常用的JavaScript来直接操作GraphQL,并将自己想要的数据呈现在页面上,

我们可以参考这个简单的应用程序,我们将仅使用 fetch API 来调用 GraphQL 服务:https://stackblitz.com/edit/wijmo-with-graphql-lruhgx

当然我们也可以添加更多的字段,方便我们取获取其他自己想要的信息:

fetch("https://demodata.grapecity.com/northwind/graphql", {
 method: "POST",
 headers: {
 "Content-Type": "application/json",
 Accept: "application/json"
 },
 body: JSON.stringify({
 query:
 "{ products { productId, productName, unitPrice, unitsInStock, unitsOnOrder, reorderLevel, discontinued, categoryId }}"
 })
})

我们打开控制台可以看到返回的结果以及绑定的数据内容:

此时我们配合一些表格类的控件,便可以将这些数据很友好地渲染在页面上,这里我们以葡萄城公司的纯前端表格控件SpreadJS为例:

安装 Wijmo:

npm install @grapecity/spread-sheets

我们可以在app.Vue中添加以下模块

import Vue from "vue";
import '@grapecity/spread-sheets-resources-zh';
GC.Spread.Common.CultureManager.culture("zh-cn");
import '@grapecity/spread-sheets-vue'
import GC from '@grapecity/spread-sheets';
import './styles.css';

紧接着我们只需要建立数据的key和我们表格内区域的映射关系就能完美的展示需要的内容

var colInfos = [
    { name: "productId", displayName: "productId" },
    { name: "productName", displayName: "productName", size: 100 },
    { name: "unitPrice", displayName: "unitPrice", size: 80 },
    { name: "unitsInStock", displayName: "unitsInStock" },
    { name: "unitsOnOrder", displayName: "unitsOnOrder", size: 80 },
    { name: "reorderLevel", displayName: "reorderLevel", size: 80 },
    { name: "discontinued", displayName: "discontinued", cellType: new GC.Spread.Sheets.CellTypes.CheckBox(), size: 80 },
    { name: "categoryId", displayName: "categoryId", size: 100},
];
sheet.bindColumns(colInfos);

现在我们有了数据和展示的组件,我们可以将它们放在一起。在 fetch 调用之后,在 then()方法中转换为 JSON 并用结果填充我们的 sheet即可。

fetch("https://demodata.grapecity.com/northwind/graphql", {
 ...
})
 .then(r => r.json())
 .then(data => bindData(data));

function bindData(data) {
 sheet.setDataSource(data.data.products);
}

我们的数据已经绑定到了工作表上,且这是一种双向绑定关系,因此一旦数据有变动,页面的表格内渲染的数据也会相应的变动!

这是我们的网格渲染时的样子:

只需要一点点代码,我们就可以得到一个绑定到 GraphQL 源的功能齐全的在线表格!当然除了GraphQL的强大以外,也不得不佩服SpreadJS对于数据渲染的便捷和可靠性。

如果您想自己尝试这个应用程序,这里有一个实例:https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/data-binding/sheet-level-binding/vue

深入讨论

类别信息动态渲染

GraphQL 最有趣的功能之一是将许多不同的查询聚合到一个请求中。此功能可用于最大程度地减少与服务器的往返次数,从而提高应用程序的响应能力。当然,对服务器进行多次往返仍然是合适的,但这是一个非常实用的功能。

在我们的示例中,我们加载了产品。我们还获得了每个产品的类别ID,因为每个产品都与另一个数据集中的类别相关联。 而我们相应的信息中希望添加类别信息,并通过CategoryID 查找类别。 GraphQL 的一个很酷的事情是我们可以便可以在一个查询中加载产品和类别两类信息!

以下是一个查询扩展后的样子:

{
  products {
    productId
    productName
    unitPrice
    unitsInStock
    unitsOnOrder
    reorderLevel
    discontinued
    categoryId
  }
  categories {
    categoryId
    categoryName
  }
}

如果我们将其放入查询测试器中,我们可以看到现在得到两个数组(一个用于产品,另一个用于类别)

现在我们希望将产品的类别信息按照我们给定类别信息进行展示,我们可以借助SpreadJS的数据绑定功能中对列的单元格类型来实现这个需求:

var combo = new GC.Spread.Sheets.CellTypes.ComboBox();
combo
    .items(data.data.categories)
    .editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
var colInfos = [
    { name: "productId", displayName: "productId" },
    { name: "productName", displayName: "productName", size: 100 },
    { name: "unitPrice", displayName: "unitPrice", size: 80 },
    { name: "unitsInStock", displayName: "unitsInStock" },
    { name: "unitsOnOrder", displayName: "unitsOnOrder", size: 80 },
    { name: "reorderLevel", displayName: "reorderLevel", size: 80 },
    { name: "discontinued", displayName: "discontinued", cellType: new GC.Spread.Sheets.CellTypes.CheckBox(), size: 80 },
    { name: "Category", displayName: "categoryId", cellType: combo,  size: 100},
];
sheet.bindColumns(colInfos);

如此一来我们在页面上看到的就不是类别的ID了,而是类别的名称

格式化数据

对于测量计算行业的开发人员来说,对于数据的精确是有规定的,即使给的数据中不存在小数,但是页面上展示数据时也是需要格式化成规定的小数位,而对此我们只要在数据绑定时为列信息添加格式化的信息即可

这里我们可以将Price设置为两位小数为例,只要添加一条formatter参数即可:

var colInfos = [
    { name: "productId", displayName: "productId" },
    { name: "productName", displayName: "productName", size: 100 },
    { name: "Price", displayName: "unitPrice",formatter: "[$¥-804]#,##0.00", size: 80 },
    { name: "unitsInStock", displayName: "unitsInStock" },
    { name: "unitsOnOrder", displayName: "unitsOnOrder", size: 80 },
    { name: "reorderLevel", displayName: "reorderLevel", size: 80 },
    { name: "discontinued", displayName: "discontinued", cellType: new GC.Spread.Sheets.CellTypes.CheckBox(), size: 80 },
    { name: "categoryId", displayName: "categoryId", size: 100},
];
sheet.bindColumns(colInfos);

结果如下所示:

数据验证

我们要做的下一件事是向我们的应用程序添加验证。SpreadJS中数据验证是存在继承性的,上一行同一列的单元格存在数据验证,那么下一个行同一位置就会继承上一行的数据验证效果。

因此我们可以参考这篇学习指南来实现数据展示的同时按照我们设定的标准进行数据的验证:

spread.options.highlightInvalidData = true;
var dv = GC.Spread.Sheets.DataValidation.createNumberValidator(GC.Spread.Sheets.ConditionalFormatting.ComparisonOperators.greaterThan, "11");
dv.showInputMessage(true);
dv.inputMessage("Units too low and none on order!");
dv.inputTitle("tip");
activeSheet.setDataValidator(0, 4, 1,1,dv,GC.Spread.Sheets.SheetArea.viewport);

在此验证处理程序中,我们查看unitsInStock 以确定是否应订购新单位。我们确保该商品不会停产;如果unitsInStock低于reorderLevel(并且unitsOnOrder为0),我们会显示错误消息。

后记

GraphQL 是管理 JavaScript 应用程序中数据的优秀工具。它与SpreadJS配合得很好,尤其是我们的数据绑定功能组件。本教程展示了 GraphQL 和 SpreadJS如何简单地构建应用程序。 GraphQL 和 SpreadJS都有更多功能可供探索,因此您可以做的事情远远超出了这个示例。

扩展链接:

Redis从入门到实践

一节课带你搞懂数据库事务!

Chrome开发者工具使用教程

从表单驱动到模型驱动,解读低代码开发平台的发展趋势

低代码开发平台是什么?

基于分支的版本管理,帮助低代码从项目交付走向定制化产品开发

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】注意力机制(三)

本文介绍一些注意力机制的实现,包括EMHSA/SA/SGE/AFT/Outlook Attention。 【深度学习】注意力机制(一) 【深度学习】注意力机制(二) 【深度学习】注意力机制(四) 【深度学习】注意力机制&a…

PCB设计规则中的经验公式_笔记

PCB设计规则中的经验公式 规则1 - 临界长度规则2 - 信号带宽与上升时间规则3- 时钟信号带宽规则4-信号传输速度规则5- 集肤 (效应) 深度规则6 - 50Ω传输线电容规则7 - 50Ω传输线电感规则8 - 回流路径电感规则9 - 地弹噪声规则10- 串行传输比特率与信号带宽规则11- PCB走线直流…

HR人才测评,招聘企业中高层管理的岗位胜任力测评方案

不管是哪一个企业,中高层管理都是企业的核心层,在对这部分人才进行测评方案制定的时候,则要更加细致谨慎一些,避免出现人才录用失误的情况。 中高层管理人员是公司的支柱,需要具备的素质主要偏向于管理能力、综合素质…

CyclicBarrier学习一

一、定义 CyclicBarrier 字面意思回环栅栏(循环屏障),通过它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。 CyclicB…

vue写了这么久了您是否知道:为什么data属性是一个函数而不是一个对象?

一、实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象,也可以是一个函数 const app new Vue({el:"#app",// 对象格式data:{foo:"foo"},// 函数格式data(){return {foo:"foo"}} })组件中定义data属性&#xff…

信号与线性系统翻转课堂笔记4——连续LTI系统的微分方程模型与求解

信号与线性系统翻转课堂笔记4——连续LTI系统的微分方程模型与求解 The Flipped Classroom4 of Signals and Linear Systems 对应教材:《信号与线性系统分析(第五版)》高等教育出版社,吴大正著 一、要点 (1&#x…

Zotero攻略

给大家分享一下我对于Zotero的使用。 1、下载链接 Zotero | Your personal research assistant 进入后直接下载即可 2、一些好用的插件 (1)Zotero Connector 下载地址:Zotero | Connectors 超级好用!不用一篇一篇下PDF了&am…

geemap学习笔记028:Landsat8计算时间序列NDVI并导出

前言 本节则是以Landsat8影像数据为例,进行NDVI时间序列计算,并将得到的时间序列NDVI进行展示并导出。 1 导入库并显示地图 import ee import geemap import datetime import pandas as pd import os ee.Initialize()2 定义时间范围 # 定义日期范围 …

记录 | Visual Studio报错:const char*类型的值不能用于初始化char*类型

Visual Studio 报错: const char *”类型的值不能用于初始化“char *”类型的实体错误 解决办法: 1,强制类型转换,例如: char * Singer::pv[] {(char*)"other", (char*)"alto", (char*)"c…

【网络协议】网络运维管理神经-SNMP协议

文章目录 什么是SNMP?SNMP的组件SNMP的历史版本SNMP端口SNMP配置案例SNMP工作原理SNMP的基本工作原理SNMP的操作类型SNMP TrapsSNMP Inform SNMP的应用场景推荐阅读 什么是SNMP? SNMP(Simple Network Management Protocol,简单网…

学习黑马vue

项目分析 项目下载地址:vue-admin-template-master: 学习黑马vue 项目下载后没有环境可参考我的篇文章,算是比较详细:vue安装与配置-CSDN博客 安装这两个插件可格式化代码,vscode这个软件是免费的,官网:…

2023年OceanBase开发者大会-核心PPT资料下载

一、峰会简介 2023年OceanBase开发者大会主要涵盖了OceanBase的最新技术进展、产品更新以及开发者工具的发布。大会发布了OceanBase 4.1版本,公布了两大友好工具,升级了文档的易用性,并统一了企业版和社区版的代码分支。这些举措全面呈现了O…

2017年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

从战争中学习战争最有效。前几天,六分成长分析了2023年、2022年、2020、2019、2018年的AMC8的典型考题、考点和详细答案解析。 今天继续为大家分享2017年的AMC8的五道典型考题,所有的这些试题六分成长独家制作了在线版本,适合各种终端和设备…

Android Compose Transition 动画

Transition 是一种动画效果,用于在组件的状态之间进行平滑的过渡。它可以帮助我们在状态变化时,以一种流畅的方式更新 UI。通过使用 Compose 的 Transition API,您可以在应用中创建各种各样的动画效果,从而增强用户体验并提高应用…

智能五子棋1

*一、项目需求* 五子棋是一种简单的黑白棋,历史悠久,起源于中国,后传入日本,在日本被称为“连珠”,是一种老少皆宜的益智游戏。 人工智能五子棋系统的目标用户是一切想致力于研究人机对弈算法理论的相关研究者和一切…

I2C总线(一)核心

基于linux-3.14.16 一、简介 硬件上,i2c总线由,i2c控制器、i2c总线、i2c设备组成。 驱动代码将通过设置i2c寄存器,从而在总线上产生数据信息,来和i2c设备通信(读/写)。 i2c核心,主要的功能包…

spring boot 配置多数据源 踩坑 BindingException: Invalid bound statement (not found)

在上一篇:《【已解决】Spring Boot多数据源的时候,mybatis报错提示:Invalid bound statement (not found)》 凯哥(凯哥Java) 已经接受了,在Spring Boot配置多数据源时候,因为自己马虎,导致的一个坑。下面&a…

【操作系统】实验一 熟悉LINUX环境和命令

实验名称: 实验一 熟悉LINUX环境和命令 实验目的: 1. 了解UNIX/LINUX的命令及使用格式。 2.熟悉UNIX/LINUX的常用基本命令。 3. 练习并掌握LINUX提供的vi编辑器来编译C程序 4. 学会利用gcc、gdb编译、调试C程序 实验内容: 熟悉UNIX/LINUX的…

YOLOv5改进 | 卷积篇 | SPD-Conv空间深度转换卷积(高效空间编码技术)

一、本文介绍 本文给大家带来的改进内容是SPD-Conv(空间深度转换卷积)技术。SPD-Conv是一种创新的空间编码技术,它通过更有效地处理图像数据来改善深度学习模型的表现。SPD-Conv的基本概念:它是一种将图像空间信息转换为深度信息…