”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 新的前端框架?

新的前端框架?

发布于2024-08-28
浏览:252

New Frontend Framework?

或者带有两个辅助函数的普通 JavaScript?

在本文中,我将讨论如何使用 Fusor 库开发可重用的 Web 组件以及这样做的好处。

这些组件可以组合成成熟的 Web 应用程序,与使用 React、Angular、Vue、Solid、Svelte 等创建的应用程序相当。

Fusor API 仅由两个主要函数组成:

  • 创建一个包裹在特殊对象中的 DOM 元素。
  • 更新包装在特殊对象中的 DOM 元素。

加上一些很少使用的功能,例如:

  • 从特殊对象获取一个 DOM 元素。

您不需要了解这个特殊物体的任何信息。

创建 DOM 元素

通过 JSX 创建

import { getElement } from "@fusorjs/dom";

const count = 0;

// Create via JSX
const message = 
Seconds {count} elapsed
; document.body.append(getElement(message)); // Get

我们使用了createget API函数。

替代性非 JSX 创建

import { div } from "@fusorjs/dom/html";
const message = div("Seconds ", count, " elapsed"); // Create

更新 DOM 元素

import { getElement, update } from "@fusorjs/dom";

let count = 0;
const message = 
Seconds {() => count} elapsed
; // Create document.body.append(getElement(message)); // Get setInterval(() => { count = 1; update(message); // Update }, 1000);

我们使用了更新 API函数。它以递归方式更新 DOM 元素及其所有子元素。它从函数结果中检索新值,使它们成为动态 子项、属性和属性都可以是动态的。


(切换?“开”:“关”)} />
(toggle ? "on" : "off")} /> 与当前值不同

时,才会发生 DOM 更新。 设置参数

大多数时候,您会照常设置参数:


属性

属性。要指定它们的类型,您可以在它们的名称中添加_a或_p后缀:

事件处理程序

,您必须始终使用 _e 后缀:

"事件处理程序"} />
"event handler"} /> 选项

以确保完全W3C标准兼容性:

"事件处理程序"} />
"event handler"} />

使用 Fusor 的特殊对象组成您的组件。将状态和参数封装在函数内。将您的组件名称大写。

以下是计数按钮组件的示例:


从“@fusorjs/dom”导入{ getElement, update }; const CountingButton = (props) => { 让计数 = props.count ?? 0; // 初始化状态 常量自我 = ( { 计数 = 1; 更新(自我); }} > 点击 {() => count} 次 按钮> ); 返回自我; }; 常量应用程序 = () => (

三个计数按钮

); document.body.append(getElement(App()));
import { getElement, update } from "@fusorjs/dom";

const CountingButton = (props) => {
  let count = props.count ?? 0; // Init State

  const self = (
    
  );

  return self;
};

const App = () => (
  

Three counting buttons

); document.body.append(getElement(App()));
部分

,而不影响应用程序的其余部分。 一旦您完全理解了上述组件的工作原理,您就可以以稍微

更短

的方式重写它,同时获得相同的结果:
const 计数按钮 = ({ count = 0 }) => ( { 计数 = 1; 更新(自我); }} > 点击 {() => count} 次 按钮> );

const CountingButton = ({ count = 0 }) => (
  
);

再一次,如果您理解上面的示例,请查看同一组件的

最短

版本:
const 计数按钮 = ({ count = 0 }) => ( (count = 1)}> 点击 {() => count} 次 按钮> );

const CountingButton = ({ count = 0 }) => (
  
);

生命周期

在深入开发实际应用程序之前,我们需要了解的最后一个方面是组件生命周期。

它仅由四个阶段组成:

    创建
  1. 组件
  2. 连接
  3. 到 DOM
  4. 更新
  5. DOM
  6. 从 DOM 断开
  7. 从“@fusorjs/dom”导入{ getElement, update }; const IntervalCounter = ({ 计数 = 0 }) => { console.log("1.创建组件"); 返回 (
    { console.log("2.连接DOM"); const timeId = setInterval(() => { 数数 ; 更新(自我); console.log("3.更新DOM"); }, 1000); 返回()=> { 清除间隔(timerId); console.log("4. 断开与 DOM 的连接"); }; }} > 自安装 {() => count} 秒以来已过去
    ); }; const 实例 = ; const 元素 = getElement(实例); document.body.append(元素); setTimeout(() => element.remove(), 15000);
import { getElement, update } from "@fusorjs/dom";

const IntervalCounter = ({ count = 0 }) => {
  console.log("1. Create the component");

  return (
    
{ console.log("2. Connect to the DOM"); const timerId = setInterval(() => { count ; update(self); console.log("3. Update the DOM"); }, 1000); return () => { clearInterval(timerId); console.log("4. Disconnect from the DOM"); }; }} > Since mounted {() => count} seconds elapsed
); }; const instance = ; const element = getElement(instance); document.body.append(element); setTimeout(() => element.remove(), 15000);

我们完全控制生命周期的这四个阶段。这让我们可以使用自定义的

异步

并发方法创建、更新和比较组件,并考虑不同的策略和动画帧。 教程到此结束

正如您从本教程中看到的,Fusor 简单、简洁、明确。大多数时候,您只会使用它的

两个

API函数。然而,它还在需要时提供了很多控制和灵活性。 所以,回答标题中的问题,Fusor是一个小型JavaScript库,不是一个框架,但它可以达到与其他框架相同的结果。

开始编码

以上所有示例均可在 CodeSandbox 上找到。

另外,请查看 SVG 模拟时钟示例。

这是一个真实世界的应用程序。

样板启动项目:

    JavaScript 入门
  • TypeScript Starter
  • 谢谢

版本声明 本文转载于:https://dev.to/isumix/new-frontend-framework-5ain?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在JavaScript中如何并发运行异步操作并正确处理错误?
    在JavaScript中如何并发运行异步操作并正确处理错误?
    同意操作execution 在执行asynchronous操作时,相关的代码段落会遇到一个问题,当执行asynchronous操作:此实现在启动下一个操作之前依次等待每个操作的完成。要启用并发执行,需要进行修改的方法。 第一个解决方案试图通过获得每个操作的承诺来解决此问题,然后单独等待它们: co...
    编程 发布于2025-06-27
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-06-27
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-06-27
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将其...
    编程 发布于2025-06-27
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在银光应用程序中,尝试使用LINQ建立错误的数据库连接的尝试,无法找到以查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中,tblpersoon可能需...
    编程 发布于2025-06-27
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-06-27
  • PHP SimpleXML解析带命名空间冒号的XML方法
    PHP SimpleXML解析带命名空间冒号的XML方法
    在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
    编程 发布于2025-06-27
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] 剩余_size- = buf_size lines = buffer.split('\ n'....
    编程 发布于2025-06-27
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-06-27
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-06-27
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-06-27
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的python功能eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
    编程 发布于2025-06-27
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-06-27
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-06-27
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-06-27

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3