十分钟掌握使用 SolidJS 构建全栈 CRUD 应用程序

news2024/11/24 16:34:06

我们可以开始讨论 SolidJS,说它比React更好,但没有必要做这种比较。SolidJS只是众多前端框架之一,旨在在Web上快速创建数据驱动。那么,我们为什么要突出这个新孩子呢?

首先,我们不能忽视SolidJS不使用虚拟DOM。是的,你没听错!SolidJS 不使用虚拟 DOM,而是从应用程序第一次运行开始就记住整个 DOM,然后在有更新时,它会继续更新该部分。此功能使框架非常快速和高性能。

在本文中,我们将介绍如何构建一个简单的 CRUD 应用程序来演示 SolidJS 的有效性。

构建 SolidJS 前端

为了构建我们的 Solid 应用程序,我们将使用 Solid JD App库[https://github.com/OrJDev/create-jd-app]。我们将设置项目,然后创建并渲染 SolidJS 组件。

安装Solid JD 应用程序库

要开始使用,请在终端上运行以下命令:

npm create jd-app@latest

系统将提示你键入 y(表示是)以继续,然后系统会要求你提供应用的名称。接下来,系统会询问您是否将使用 Vercel 来部署项目。这是一个偏好问题。您决定在哪里部署或托管项目完全取决于您;您甚至可以选择“无”作为选项。

我们使用的库还附带了额外的可选附加组件(AuthJSPrismatRPCpRPCTailwindCSSAuthJSUpstash Ratelimit)。您可以决定选择所需的内容或忽略它们。在本教程中,我们将通过仪表板部署到 Vercel,我们不会使用任何可选的附加组件:

Solid JD App Dashboard

做出选择后,单击 Enter。这将立即安装您需要的所有内容,包括包含 SolidJS 依赖的其他软件包的 node_modules 文件夹,以及您在安装过程中选择的任何软件包。

设置项目

在本教程中,我们将构建一个简单的博客应用。移动到托管应用程序的根目录,然后运行以下命令:

npm run dev

这将在端口 3000 上启动应用程序;http://localhost:3000,您将在这里看到它。

您的代码库将如下所示;注意 TypeScript 的使用:

SolidJS Codebase Using TypeScript

以下是您将在浏览器中看到的内容:

Creating Solid JD App Browser

接下来,清除 src/route/index.tsx 文件中的现有代码并粘贴以下内容: 

import  "../assets/css/style.css";
import { type VoidComponent } from "solid-js";
import { A } from "solid-start";
import Blog from '../components/Blog'
const Home: VoidComponent = () => {
  return (
    <main>
       <div class="container">
          <div class="row g-4">
            <div class="col-lg-8">
              <div class="bg-mode p-4">
                <h1 class="h4 mb-4">Latest blogs</h1>

                </div>
            </div>

          </div>
        </div>
    </main>
  );
};
export default Home;

创建 SolidJS 组件

组件是前端框架最好的东西之一,尽管组件的概念并不新鲜。组件只是一组一个或多个 HTML 元素,但它们使我们更容易动态管理和复用元素。

请在 src 名为 components的目录下开始制作组件;我们将在此处放置任何可重用的元素和文件。在 components 文件夹中,创建一个名为 Blog.jsx 并粘贴以下代码的文件:

import solidimage from '../assets/images/solid.jpg'
function Blog() {
  return (
    <>
      <div class="card bg-transparent border-0">
        <div class="row g-3">
          <div class="col-4">
            <img class="rounded" src={solidimage} alt="" />
          </div>
          <div class="col-8">
            <a
              href="#"
              class="badge bg-danger bg-opacity-10 text-danger mb-2 fw-bold"
            >
             Tech
            </a>
            <h5>
              <a
                href="blog-details.html"
                class="btn-link stretched-link text-reset fw-bold"
              >
                What is Solidjs? 
              </a>
            </h5>
            <div class="d-none d-sm-inline-block">
              <p class="mb-2">
              SolidJS is an exciting framework for web development that has been gaining traction in recent years. It has been created by Misko Hevery, the creator of Angular. 
.
              </p>
              <a class="small text-secondary" href="#!">
                {" "}
                <i class="bi bi-calendar-date pe-1"></i> Jan 22, 2022
              </a>
            </div>
          </div>
        </div>
      </div>
      <hr class="my-4" />
    </>
  );
}
export default Blog;

您还需要下载图像并在 src 该文件夹中创建子文件夹assets/images的文件。

接下来,assets/css在子文件夹中创建一个 style.css 文件并添加此代码。此代码中的 CSS 是 Bootstrap

渲染 SolidJS 组件

您可能会遇到问题,就像我一样,渲染SolidJS组件。如果是这样,最简单的解决方案是在位于项目根目录的 tsconfig.json 文件中添加以下内容:

"noImplicitAny": false

我们将在src/route文件夹中的文件内 index.tsx 渲染 SolidJS 组件,如下所示:

import "../assets/css/style.css";
import { type VoidComponent } from "solid-js";
import { A } from "solid-start";
import Blog from '../components/Blog'
const Home: VoidComponent = () => {
  return (
    <main>
      <div class="container">
        <div class="row g-4">
          <div class="col-lg-8">
            <div class="bg-mode p-4">
              <h1 class="h4 mb-4">Latest blogs</h1>
              <Blog />
              <Blog/>
              <Blog/>
            </div>
          </div>
        </div>
      </div>
    </main>
  );
};
export default Home;

唯一的区别是,在第 4 行,我们导入了三次 Blog 组件。以下是我们现在在 Web 浏览器中看到的内容:

SolidJS Component Browser

在后端创建动态渲染

我们刚刚在上一节中创建的是静态数据。但是,在现实世界中,数据将来自某种后端或API。所以,让我们让事情变得动态!

首先,我们需要有某种端点。在本教程中,我们将使用以下终结点 https://crudcrud.com/api/6a1613c7646f4a908158592cfdb448aa/blog,其中包含博客列表:

图片

要在 Blog 组件中动态呈现来自 API 的数据,请更新Blog.jsx文件,如下所示:

import { For, createResource } from "solid-js";
import solidimage from "../assets/images/solid.jpg";
const getBlogs = async () => {
  const response = await fetch(
    "https://crudcrud.com/api/6a1613c7646f4a908158592cfdb448aa/blog"
  );
  return response.json();
};
function Blog() {
  const [blog] = createResource(getBlogs);
  return (
    <Show when={blog()}>
      <For each={blog()}>
        {(eachblog) => (
          <>
            <div class="card bg-transparent border-0">
              <div class="row g-3">
                <div class="col-4">
                  <img class="rounded" src={solidimage} alt="" />
                </div>
                <div class="col-8">
                  <a
                    href="#"
                    class="badge bg-danger bg-opacity-10 text-danger mb-2 fw-bold"
                  >
                    {eachblog.tag}
                  </a>
                  <h5>
                    <a
                      href="blog-details.html"
                      class="btn-link stretched-link text-reset fw-bold"
                    >
                      {eachblog.title}
                    </a>
                  </h5>
                  <div class="d-none d-sm-inline-block">
                    <p class="mb-2">{eachblog.text}</p>
                    <a class="small text-secondary" href="#!">
                      {" "}
                      <i class="bi bi-calendar-date pe-1"></i> Jan 22, 2022
                    </a>
                  </div>
                </div>
              </div>
            </div>
            <hr class="my-4" />
          </>
        )}
      </For>
    </Show>
  );
}
export default Blog;

在这里,我们导入来自SolidJS的 <For/> 组件。此组件用于遍历 API 的内容(第 13 行和第 49 行)。

我们还导入了一个 SolidJS CreateResource 方法。这用于保存我们从 fetch 响应中获取的 JSON 响应(第 10 行)的内容(请参阅第 3-8 行)。

SolidJS 还为我们提供了另一个组件,<Show/>它可以帮助我们有条件地渲染东西。我们用来 <Show/> 包装整个 Blog 组件的内容。

该 <Show/> 组件提供了一个 when() 方法,这是我们实际定义条件的地方。我们指定 <Show/> 组件仅在存在数据或变量时有内容时呈现(请参阅第 12 行)。

以下是浏览器的外观:

图片

设置路由

路由是指我们如何从资源的一条路径移动到另一条路径。与其他现代Web技术类似,SolidJS使用Solid Router来管理客户端请求的处理方式以及处理请求的内容。固态路由器简单明了。

在撰写本文时,默认情况下未安装Solid Router包。但是,我们使用Solid JD App库来设置我们的项目,该库包括路由器。

要设置路由,请创建一个新组件 , BlogDetail.jsx 其中将显示博客正文。然后,粘贴以下代码:

import { useParams } from "@solidjs/router"
import { createResource } from "solid-js"
const getBlog = async (_id) => {
  const response = await fetch('https://crudcrud.com/api/64b773f6659a41b69d678369943f3c5f/blog/' + _id)
  return response.json()
}
export default function BlogDetail() {
  const params = useParams();
  const [blogdetail] = createResource(params._id, getBlog);
  console.log(blogdetail);
  return (
    <div class="my-7">
      <Show when={blogdetail()}>
        <div class="">
          <div class="">
            <h2 class="">{blogdetail.title}</h2>
            <h2>{blogdetail.body}</h2>

          </div>
        </div>tun
      </Show>
    </div>
  )
}

查看 API 响应,您会注意到有一个 _id 唯一的字段;这就是我们将用来定位每条内容的内容。

在此代码中,我们导入 useParams (第 1 行),该行用于从 URL 定位特定参数。然后,我们使用其唯一 _id 作为路径参数获取每篇博客文章,并以 JSON 形式返回(参见第 3-6 行)。

接下来,我们导出( BlogDetail 第 13-24 行)并在 params 变量(第 8 行)中启动 useParams() ,该变量用作CreateResource()方法中的参数(第 9 行)。然后,我们返回博客的title and body内容(第 11-23 行)。

现在,我们需要在 src/route/index.tsx 文件中定义此路由。更新代码,如下所示:

import "../assets/css/style.css";
import { type VoidComponent } from "solid-js";
import { A, Router, Route, Routes } from "@solidjs/router";
import Blog from '../components/Blog';
import BlogDetail from '../components/BlogDetail';

const Home: VoidComponent = () => {
  return (
    <main>
      <div class="container">
        <div class="row g-4">
          <div class="col-lg-8">
            <div class="bg-mode p-4">
              <h1 class="h4 mb-4">Latest blogs</h1>
              <Blog />
            </div>
          </div>
        </div>
      </div>
      <Router>
      <Routes>
        <Route path='/blog/:_id' component={BlogDetail}/>       
      </Routes>
      </Router>
    </main>
  );
};
export default Home;

这里的更改是我们从 solidjs/router 包中导入了<Router/>、 组件<Routes/> <Route/>(第 3 行)并使用它们来收集数据(第 20-24 行)。如果您仔细查看第 22 行,您会发现我们定义了尝试访问博客文章路径参数 /blog/_id .由于这必须是动态的,因此我们传递了组件以返回BlogDetail.

总结

在本文中,我们成功地演示了如何使用 SolidJS 构建博客。您可以将这些知识扩展到其他类型的应用程序。我们查看了一些 SolidJS 方法和组件,并研究了它们如何在项目中使用。

SolidJS 的一个杀手级特性是它在第一次加载时记住虚拟 DOM,随后,不同的部分将根据需要更新,而不会影响整个 DOM。

我希望你喜欢这篇文章。该项目的完整代码库可以在GitHub[https://github.com/bigpreshy/solid-crud]上访问。您可能还需要查看此部署:https://solid-crud-ten.vercel.app/。

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

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

相关文章

嗅探抓包工具,解决线上偶现问题来不及抓包的情况阅读目录

目录 背景 实现思路 具体实现 Python 抓包 总结 资料获取方法 背景 测试群里经常看到客户端的同学反馈发现了偶现Bug&#xff0c;但是来不及抓包&#xff0c;最后不了了之&#xff0c;最近出现得比较频繁&#xff0c;所以写个小脚本解决这个问题。 实现思路 之前写过一个…

免费实用的日记应用:Day One for Mac中文版

Day One for Mac是一款运行在Mac平台上的日记软件&#xff0c;你可以使用Day One for mac通过快速菜单栏条目、提醒系统和鼓舞人心的信息来编写更多内容&#xff0c;day one mac版还支持Dropbox同步功能&#xff0c;想要day one mac中文免费版的朋友赶紧来试试吧&#xff01; …

IPC之一:使用匿名管道进行父子进程间通信的例子

IPC 是 Linux 编程中一个重要的概念&#xff0c;IPC 有多种方式&#xff0c;本文主要介绍匿名管道(又称管道、半双工管道)&#xff0c;尽管很多人在编程中使用过管道&#xff0c;但一些特殊的用法还是鲜有文章涉及&#xff0c;本文给出了多个具体的实例&#xff0c;每个实例均附…

Leetcode.1316 不同的循环子字符串

题目链接 Leetcode.1316 不同的循环子字符串 rating : 1837 题目描述 给你一个字符串 text &#xff0c;请你返回满足下述条件的 不同 非空子字符串的数目&#xff1a; 可以写成某个字符串与其自身相连接的形式&#xff08;即&#xff0c;可以写为 a a&#xff0c;其中 a 是…

服务器感染了LockBit 3.0勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 在数字时代&#xff0c;恶意软件的威胁变得愈发严峻&#xff0c;而LockBit 3.0勒索病毒则是其中的顶尖恶势力之一。其先进的加密技术和毫不留情的勒索手段&#xff0c;使无数人蒙受损失。然而&#xff0c;我们不应束手无策。本文91数据恢复将带您深入了解Loc…

AndroidStudio通过Profiler查找内存泄漏

Fragment内存泄漏&#xff1a; AndroidStudio --> Profiler --> 勾选 show nearest Gc root only&#xff0c;然后查看非weakreference的引用&#xff08;weakreference是不会导致内存泄漏的&#xff09;&#xff0c;往下就能找自己项目里写的代码&#xff0c;一般此处…

旷视科技AIoT软硬一体化走向深处,生态和大模型成为“两翼”?

齐奏AI交响曲的当下&#xff0c;赛道玩家各自精彩。其中&#xff0c;被称作AI四小龙的商汤科技、云从科技、依图科技、旷视科技已成长为业内标杆&#xff0c;并积极追赶新浪潮。无论是涌向二级市场还是布局最新风口大模型&#xff0c;AI四小龙谁都不甘其后。 以深耕AIoT软硬一…

ASCP系列电气防火限流式保护器在养老院的应用-安科瑞黄安南

摘要&#xff1a;2020年&#xff0c;我国65岁及以上老年人口数量为1.91亿&#xff0c;老龄化率达到13.5%。总体来看&#xff0c;大部分省市的养老机构数量还较少。养老设施的建设与民生息息相关&#xff0c;养老院的电气安全也非常重要。如果发生电气火灾&#xff0c;对于行动不…

【多模态】24、开放词汇学习到底是什么?

文章目录 一、什么是开放词汇学习二、开放词汇学习的测评和数据集三、开放词汇目标检测3.1 Region-Aware Training3.2 Pseudo-Labeling3.3 Knowledge Distillation-Based3.4 Transfer Learning-Based3.5 总结3.6 效果 参考论文&#xff1a;A Survey on Open-Vocabulary Detecti…

Vue3 事件处理简单应用

去官网学习→事件处理 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 事件处理</h1><button v-on:click"numb 1">点击加1-----{{ numb }}</button><br/&…

独家揭秘Linux内核栈:内核态的奇妙之处和与用户态的差异

理解Linux内核栈可以从以下几个方面来考虑&#xff1a;内核态与用户态&#xff1a;在阅读Linux内核及相关资料时&#xff0c;需要明确它所描述的是内核态还是用户态的内容。这有助于理解所讨论的是在哪个执行环境下进行的操作。进程与线程的描述&#xff1a;用户态的进程和线程…

Yield Guild Games:社区更新 — 2023 年第二季度

本文重点介绍了 Yield Guild Games (YGG) 2023 年第二季度社区更新中涵盖的关键主题&#xff0c;包括公会发展计划 (GAP) 第 3 季的总结、YGG 领导团队的新成员以及 YGG 的最新消息地区公会网络和广泛的游戏合作伙伴生态系统。 在 YGG 品牌焕然一新的基础上&#xff0c;第二季…

ArcGIS Pro基础:【按顺序编号】工具实现属性字段的编号自动赋值

本次介绍一个字段的自动排序编号赋值工具&#xff0c;基于arcgis 的字段计算器工具也可以实现类似功能&#xff0c;但是需要自己写一段代码实现&#xff0c; 相对而言不是很方便。 如下所示&#xff0c;该工具就是【编辑】下的【属性】下的【按顺序编号】工具。 其操作方法是…

Openlayers实战:右键点击,弹出feature信息

鼠标作为一个重要的交互触发手段,不但有左点击,还有右点击。 Openlayers开发的项目中,我们取消鼠标右键默认菜单,右击后获取到的feature的信息值。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特所有,可…

Spring系列四:AOP切面编程

文章目录 &#x1f497;AOP-官方文档&#x1f35d;AOP 讲解&#x1f35d;AOP APIs &#x1f497;动态代理&#x1f35d;初始动态代理&#x1f35d;动态代理深入&#x1f35d;AOP问题提出&#x1f4d7;使用土方法解决&#x1f4d7; 对土方法解耦-开发最简单的AOP类&#x1f4d7;…

美国探亲签证怎样预约?

近年来&#xff0c;越来越多的人都对前往美国探亲感兴趣&#xff0c;然而在计划之初&#xff0c;签证预约却可能成为一个让人头疼的问题。那么&#xff0c;究竟如何预约美国探亲签证呢&#xff1f;下面知识人网小编就为大家详细介绍一下预约的流程和注意事项。 首先&#xff0c…

spring boot 集成mqtt

spring boot 集成mqtt 1.到官网下载软件 MQTT linux版本&#xff08;使用apt方式下载安装&#xff09; 执行 curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash再执行 sudo apt-get install emqx最后启动 emqx startWindows版 下载解压后进入bin…

【从零学习python 】05. Python中的输出和输入

文章目录 输出一、普通的输出二、格式化输出格式化操作的目的什么是格式化 三、换行输出四、练习五、python2与python3里的区别 输入input进阶案例 输出 简单来说&#xff0c;就是将程序的运行结果显示出来。 一、普通的输出 生活中的“输出” 软件中的图形化界面输出 py…

C语言----字符串操作函数汇总

在C的库函数中&#xff0c;有丰富的字符串操作函数&#xff0c;在平时的coding中灵活运用这些库函数会达到事半功倍的效果 一&#xff1a;str系列 char *strcpy(s, ct)将字符串ct(包括\0)复制到字符串s中&#xff0c;并返回s&#xff0c;需要注意s的长度是否容纳ct。char *st…

TikTok推出PrivacyGo,品牌可与平台共享部分用户数据

1.TikTok宣布允许用户关闭内容自动显示功能 TikTok近日宣布修改运营方式&#xff0c;即允许用户关闭内容自动显示功能&#xff0c;以遵守将于8月底生效的欧盟新规定&#xff08;欧盟数字服务法案DSA&#xff09;&#xff0c;该法案对平台提出了新的要求&#xff0c;以更好地保…