当前位置:首页 > 文章列表 > 文章 > 前端 > JavaScript 中临时视图状态的概念

JavaScript 中临时视图状态的概念

来源:dev.to 2024-09-22 08:10:01 0浏览 收藏
推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

今天golang学习网给大家带来了《JavaScript 中临时视图状态的概念》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

大家好!在本文中,我们将讨论一个相当不寻常的主题,由于某种原因我没有找到有关该主题的信息,尽管它在现代 javascript 框架和用于创建用户界面的库中非常有用,因为在某些情况下,应用该概念可以帮助将 dom 的处理速度提高数倍。

名称是有条件的,但本质很重要。

平时状态的问题

术语“通常状态”是指由于状态管理器或框架或库的内部功能而直接保存的数据。 vue.js 中状态的示例:

createapp({
  setup() {
    return {
      count:ref(0);
    };
  },
  template: `<div>
        <button @click="count++">click!</button>
        <div>clicks: {{ count }}</div>
    </div>`,
}).mount("#app");

在这种情况下,状态直接存储在对象中,该对象在框架的预定义方法中返回。

因此,dom 节点可以通过不同的语法结构依赖于给定的状态。在示例中,这样的构造是字符串 {{ clicks }} ,它由于字符串插值而更改为当前数据。

此外,常用的语法结构是“循环”。循环是一个关键字,可以是属性,也可以是显式定义 dom 节点创建的方法,具体取决于来自状态的元素数量和值本身。循环示例:

<template>
  <tr
    v-for="{ id, label } of rows"
    :key="id"
    :class="{ danger: id === selected }"
    :data-label="label"
    v-memo="[label, id === selected]"
  >
    <td class="col-md-1">{{ id }}</td>
    <td class="col-md-4">
      <a @click="select(id)">{{ label }}</a>
    </td>
    <td class="col-md-1">
      <a @click="remove(id)">
        <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
      </a>
    </td>
    <td class="col-md-6"></td>
  </tr>
</template>

假设我们想要更新一个元素的类。我们的数据以对象数组的形式出现。很明显,键必须在对象中显式指定:您可以通过键获取双大括号中的类的值,但这是主要问题,因为它很慢。

为了证实我的话,我将采用cample.js框架的基准测试(在开发过程中我刚刚注意到了类似的问题)。在那里可以清楚地看到,直接依赖于正常状态数据的类比使用临时 view 状态的类设置得慢。

让我们使用cample.js的两个版本:3.2.0-alpha.45和3.2.1-beta.0。其中有一行“select row”(4行),这正是主要区别:

JavaScript 中临时视图状态的概念

数据取自 126 和 128 基准测试版本。

从图中可以看出,一个结果与另一个结果相差几乎一倍半。我想了很久,为什么会这样呢?我曾经认为代码只是速度慢,但事实不同。 如果数据处于常规状态,那么即使我们只更改 n 序数对象中属性值中的一个字母,也有必要遍历所有数据。

const olddata = [
  {
    id: 1,
    label: "text 1",
  },
  { id: 2, label: "text 2" },
  {
    id: 3,
    label: "text 3",
  }
];

const newdata = [
  {
    id: 1, 
    label: "text 11", // 1 iteration, one letter has changed, but we're still looking further
  },
  { id: 2, label: "text 2" }, // 2 iteration
  {
    id: 3,
    label: "text 3", // 3 iteration
  }
];

因此,它总是很慢,但这是逻辑上正确的方法,也是所有用于创建用户界面的现代框架和库的主要笑话。但除了这种方法还有什么其他选择呢?

临时视图状态

特别是对于这样的问题,当需要引入与主状态分离的状态,以免多次遍历元素时,您可以在代码中使用某种概念,该概念将允许您不绑定对于一个对象,但是对于一个元素。这个概念是一个临时的 view 状态。

其本质如下:我们为每个元素创建一个单独的数组。它将位于模块本身的代码中,我们在回调函数中提供与该数组交互的用户方法。因此,该模块将存储大约以下代码:

{
  el:li,
  temporaryviewstate:[{class:"value"}]
}

在项目中是这样的:

setclass: [
  (setdata, event, eachtemporaryviewstate) => () => {
    const { settemporaryviewstate, cleartemporaryviewstate } = eachtemporaryviewstate;
    cleartemporaryviewstate();
    settemporaryviewstate(() => {
      return { class: "value" };
    });
  },
  "updateclass",
],

此外,这个数组只能在调用回调函数时创建,或者简单地为所有元素创建一个数组。这将允许我们不绑定到来自正常状态的数据,而是绑定到我们想要更新的特定元素。也就是说,我们创建一个可以清除和重写的临时状态。这非常适合我们想要处理不受控制的元素的情况:

<!-- Controlled -->
&lt;input type=&quot;text&quot; value=&quot;{{ value }}&quot; ::change=&quot;setValue()&quot; /&gt;

<!-- Uncontrolled -->
&lt;input type=&quot;text&quot; class=&quot;{{ temporaryViewState.class }}&quot; /&gt;

也就是说,它根本不直接依赖于平常的状态,所以在dom中,这个节点可以说是静态的(如果我们制作一个节点模板,那么这个元素就会跳过)。

因此,我们有一个仅依赖于特定元素和回调函数的状态。使用“循环”时,您不必遍历整个数据数组来更新一个元素中的一个字母。只需为特定元素调用特定函数并更新特定类就足够了。

这将使您能够在使用数据和 dom 时快速获得结果。很有可能在现代框架和库中应用这个概念并使用它。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

版本声明
本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
Java函数的参数传递机制是什么Java函数的参数传递机制是什么
上一篇
Java函数的参数传递机制是什么
PHP 函数单元测试的自动化流程
下一篇
PHP 函数单元测试的自动化流程
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    3206次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    3419次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    3448次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    4557次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    3827次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码