很多人不知道 Vue 中的组件就是一个函数!

news/2024/7/10 2:42:10 标签: 编程语言, js, vue, javascript, html
htmledit_views">
html" title=js>js_content">

在所有组件之下,组件只是返回一些HTML的函数。

这是一个强大的简化,如果你曾研究过Vue代码库的复杂性,那么你就会知道这实际上不是事实。但是从根本上讲,这就是Vue为我们所做的事情。

看一下这个组件:

<template>
  <div>
    <h1>{{ title }}</h1>
    <p>Some words that describe this thing</p>
    <button>Clickity click!</button>
  </div>
</template>

下面是用 Javascript 实现,它做了同样的事情:

function component(title) {
  let html = '';

  html += '<div>';
  html += `<h1>${title}</h1>`;
  html += '<p>Some words that describe this thing</p>';
  html += '<button>Clickity click!</button>';
  html += '</div>';

  return html;
}

该代码与Vue组件构造HTML 方式基本相同。当然,这里没有响应性,事件处理或其它一系列功能,但是获取输出的 HTML 是同一回事。

如果你从未想过以这种方式考虑组件,那很正常,很多人也没有。

当你开始学习Vue时,会看到新的语法和所有这些神奇的东西,它们看起来与我们以前接触过的任何东西都不太一样。

依靠编程基础

一旦真正意识到 Vue 组件实际上只是函数,那么我们就可以发现一些隐藏的知识点。

我们可以从学习 Javascript 或任何其他html" title=编程语言>编程语言中学到的知识应用到 Vue 中。

例如,假设我们想学习如何编写优雅和简洁的Vue组件。我们可以将所学到的编写干净 Javascript 的知识应用到Vue组件中。比如保持函数简小,使用描述性名称,等等

即使是学习类似的框架,如React或Angular,也是非常有用的练习。

现在让我们看一个更详细的例子。

以新的视角进行重构

假设有以下的一个组件:

<template>
  <div>
    <h1>{{ title }}</h2>
    <div class="navigation">
      <!-- ... -->
    </div>

    <div v-for="item in list">
      <h2 class="item-title">
        {{ item.title }}
      </h2>
      <p class="item-description">
        {{ item.description }}
      </p>
    </div>

    <footer>
      <!-- ... -->
    </footer>
  </div>
</template>

为简化,我们将v-for内部的内容变成了一个新的组件,如下所示:

<template>
  <div>
    <h2 class="item-title">
      {{ item.title }}
    </h2>
    <p class="item-description">
      {{ item.description }}
    </p>
  </div>
</template>

完成此操作后,我们将其替换为父组件,这使我们摆脱了多余的嵌套:

<template>
  <div>
    <h1>{{ title }}</h2>
    <div class="navigation">
      <!-- ... -->
    </div>

    <ListItem
      v-for="item in list"
      :item="item"
    />

    <footer>
      <!-- ... -->
    </footer>
  </div>
</template>

如果我们在写Javascript,我们会用几乎完全相同的方式来做这些。

下面是一个使用循环的例子

function goingLoopy() {
  const elements = document.querySelectorAll('.item');

  for (const el of elements) {
    const { width } = el.getBoundingClientRect();
    if (width > 500) {
      el.classList.add('large');
    }
  }
}

在这里,我们使用 DOM 方法获取了类为 item 的所有元素,如果它们大于500px,则将large类添加其中。

这已经很好了,但是如果还要优化代码,应该怎么做呢

我的猜测是,你可能会把for..of的内容带入一个新函数中:

function updateElement(el) {
  const { width } = el.getBoundingClientRect();
  if (width > 500) {
    el.classList.add('large');
  }
}

function goingLoopy() {
  const elements = document.querySelectorAll('.item');

  for (const el of elements) {
    updateElement(el);
  }
}

如果你将组件看作是一个函数,那么对于我们的优化会有更深入的了解。

他们一直在你脑海中,你只是没有意识到。

人才们的 【三连】 就是小智不断分享的最大动力,如果本篇博客有任何错误和建议,欢迎人才们留言,最后,谢谢大家的观看。


作者:Michael Thiessen  译者:前端小智  来源:medium

来源:https://medium.com/html" title=js>js-dojo/html" title=vue>vue-html" title=js>js-functional-components-what-why-and-when-439cfaa08713

相关热门推荐

ES6 中 module 备忘清单,你可能知道 module 还可以这样用!

很多人不知道可以使用这种 key 的方式来对 Vue 组件进行重新渲染!

前端如何提高用户体验:增强可点击区域的大小

周末学会了 10个超级实用 Javascript 技巧!

CSS Viewport 单位,很多人还不知道使用它来快速布局!

30 个纯 HTML5 实现的游戏

很多人不知道 v-for 可以这样解构

小智最近在学习正则,学习过程中发现这 6 个方便的正则表达式

详解 ES10 中 Object.fromEntries() 的缘起


http://www.niftyadmin.cn/n/554620.html

相关文章

博客搬家

用GIthubHexo搭了一个博客&#xff0c;将从博客园搬到422926799.github.io转载于:https://www.cnblogs.com/haq5201314/p/9376778.html

机器学习技法(林轩田)学习笔记:Lecture 3 Lecture 4

Lecture 3:Kernel Support Vector Machine Kernel Trick 回顾Lecture 2中SVM的拉格朗日对偶问题&#xff1a; 对偶问题中&#xff0c;有n个变量需要求解&#xff0c;n个不等式约束条件和1个等式约束条件 整个问题只有在计算\(q_{n,m}\)时与\(\tilde d\)有联系&#xff1a;计算\…

Web 技术:CSS最小和最大(宽度/高度)知识点及优缺点

通常&#xff0c;我们希望限制元素相对于其父元素的宽度&#xff0c;同时使其具有动态性。因此&#xff0c;有一个基础宽度或高度的能力&#xff0c;使其扩展的基础上&#xff0c;可用的空间。比如说&#xff0c;我们有一个按钮&#xff0c;它的宽度应该是最小的&#xff0c;不…

js解析queryString

js解析queryString 懂的都懂 function parseQueryString(url:string) {return [...new URL(url).searchParams].reduce((cur, [key, value]) > ((cur[key] value), cur),{}); }使用 // www.xxx.com?id1const { id } parseQueryString(window.location.href);

BZOJ4361 isn 【树状数组优化DP】*

BZOJ4361 isn Description 给出一个长度为n的序列A(A1,A2…AN)。如果序列A不是非降的&#xff0c;你必须从中删去一个数&#xff0c;这一操作&#xff0c;直到A非降为止。求有多少种不同的操作方案&#xff0c;答案模10^97。 Input 第一行一个整数n。 接下来一行n个整数&#…

60.如何在文字内放置视频

效果 (源码网盘地址在最后) 大家都说简历没项目写,我就帮大家找了一个项目,还附赠【搭建教程】。 视频演示 「前端编程实战 60」HTML+CSS3 实现如何在文字内放置视频 视频地址一:https://www.ixigua.com/6846310483146998275/ 视频地址二:https://www.bilibili.com/video/…

[效率提升]jsconfig.json常用配置

jsconfig.json常用配置 {"compilerOptions": {"baseUrl": ".","paths": {// 解决项目中使用作为路径别名&#xff0c;导致vscode无法跳转文件的问题"/*": ["src/*"]},// 解决prettier对于装饰器语法的警告"…

61.反射属性-webkit-box-reflect应用

效果 (源码网盘地址在最后) 视频演示 「前端编程实战 61」反射属性 -webkit-box-reflect 应用 视频地址一:https://www.ixigua.com/6847050168638898692/ 视频地址二:https://www.bilibili.com/video/BV1iA411e7Dr/ 源码 index.html <!DOCTYPE html> <html lang=…