ホームページ >ウェブフロントエンド >Vue.js >Vue.js の高度な面接の質問 15 選
この記事では、Vue.js の高度な面接の質問を 15 個紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
key
属性を使用すると、項目リストをレンダリングするときに Vue が各 Vnode を追跡できるようになります。キーの値は一意である必要があります。
key 属性が使用されておらず、リストの内容が変更された場合 (リストの並べ替えなど)、仮想 DOM は要素を移動するのではなく、更新されたデータをノードにパッチして変更を反映します。上か下。これはデフォルトのモードであり、非常にうまく機能します。
一意のキー値 IS が指定されている場合、キーが削除された場合 (例: list )、対応する要素ノードも破棄または削除されます。
次の図に注目してください:
子コンポーネントのリストをレンダリングする親コンポーネントがあります。 3 つのリスト項目が 3 つの子コンポーネント ノードとしてレンダリングされていることがわかります。これらの各サブコンポーネントには、span タグと入力ボックスが含まれており、ローカル状態オブジェクト (オプション) も含まれる場合があります。ここで 2 つのケースを確認してみましょう:
key 属性が使用されていない場合: たとえば、リストが並べ替えられた場合、Vue はこれらのノードを移動せずに、並べ替えられたデータを既存の 3 つのノードにパッチするだけです。この方法は、ユーザーがこれらの 1 つ以上のサブコンポーネントのローカル状態を入力または変更しない限り、正常に機能します。したがって、ユーザーがコンポーネント番号 3 の入力ボックスに入力したと仮定すると、リストの順序を変更した後、コンポーネント番号 3 の Span タグの内容は変更されますが、入力ボックスは、ユーザーが入力した内容およびステータス データとともにここに残ります。これは、Vue がコンポーネント番号 3 を認識せず、表示された更新データ (span タグの内容) に再パッチを適用するだけであるためです。
子コンポーネントで key 属性を使用すると、Vue はコンポーネントの ID を認識し、リストの順序が変更されると、ノードはパッチされる代わりに移動されます。これにより、手動で編集した入力フィールドとコンポーネント全体が新しい場所に確実に移動されます。
コンポーネントまたは要素を条件付きでレンダリングする場合、key 属性を使用して要素の一意性を Vue に通知し、要素が新しいデータで再パッチされないようにすることもできます。
テンプレート内のコンテンツを出力する一般的な方法は、mustache 構文タグを使用して、メソッド、プロパティ、またはデータ変数からデータを出力することです。ただし、mustache タグはテキストをレンダリングします。 Mustache タグを使用して HTML をレンダリングしようとすると、テキスト文字列としてレンダリングされ、解析されません。コンテンツを HTML にレンダリングして解析するには、以下に示すように v-html ディレクティブを使用できます。
テンプレート
<p id="app" v-html=”title”></p>
アプリ
new Vue({ el: '#app', data: { title: '<h1 style="color: green;">Vue.js</h1>' } });
出力
Vue.js
上記の例に示すように、v-html ディレクティブはすべての HTML を解析し、その結果、上記のステートメントがオンデマンドで表示されます。開発者は、v-html を使用する前にそれを理解する必要があります。 v-html を不適切に使用すると、Web サイトがインジェクション攻撃にさらされる可能性があり、外部ソースから悪意のあるコードが挿入されて実行される可能性があります。
Vue-loader は Webpack のローダー モジュールで、これを使用すると .vue ファイル形式で単一ファイル コンポーネントを作成できます。単一ファイルのコンポーネント ファイルには、テンプレート、スクリプト、スタイルの 3 つの部分があります。 vue-loader モジュールを使用すると、webpack が個別のローダー モジュール (SASS ローダーや SCSS ローダーなど) を使用して各セクションを抽出して処理できるようになります。この設定により、.vue ファイルを使用してプログラムをシームレスに作成できるようになります。
vue-loader モジュールでは、静的リソースをモジュールの依存関係として扱い、webpack ローダーを使用して処理することもできます。開発中のホットリロードも可能です。
ミックスインを使用すると、Vue コンポーネントのプラグイン可能で再利用可能な機能を作成できます。ライフサイクル フックやメソッドなどのコンポーネント オプションのセットを複数のコンポーネント間で再利用したい場合は、それをミックスインとして記述し、コンポーネント内で単純に参照できます。その後、ミックスインの内容がコンポーネントにマージされます。ミックスインでライフサイクル フックを定義すると、実行時にコンポーネント自体のフックよりも優先されます。
localhost:4040 で Node.js バックエンド サーバーが実行されているとします。これがプロキシされ、コンポーネントからアクセスできるようにするには、vue.config.js ファイルを構成し、次のように devServer セクションを含めます。下に示された:###
假设我们有一个运行在 localhost:4040 上的 Node.js 后端服务器。为了确保代理并可以从组件中访问它,可以配置 vue.config.js 文件并包含 devServer 部分,如下所示:
在 vue.config.js 文件中:
module.exports: { devServer: { proxy: { '/api': { target: ‘http://localhost:4040/api’, changeOrigin: true } } } }
通过实现 prop 验证选项,可以为单个 prop 指定类型要求。这对生产没有影响,但是会在开发阶段发出警告,从而帮助开发人员识别传入数据和 prop 的特定类型要求的潜在问题。
配置三个 prop 的例子:
props: { accountNumber: { type: Number, required: true }, name: { type: String, required: true }, favoriteColors: Array }
文档对象模型或 DOM 定义了一个接口,该接口允许 JavaScript 之类的语言访问和操作 HTML 文档。元素由树中的节点表示,并且接口允许我们操纵它们。但是此接口需要付出代价,大量非常频繁的 DOM 操作会使页面速度变慢。
Vue 通过在内存中实现文档结构的虚拟表示来解决此问题,其中虚拟节点(VNode)表示 DOM 树中的节点。当需要操纵时,可以在虚拟 DOM的 内存中执行计算和操作,而不是在真实 DOM 上进行操纵。这自然会更快,并且允许虚拟 DOM 算法计算出最优化的方式来更新实际 DOM 结构。
一旦计算出,就将其应用于实际的 DOM 树,这就提高了性能,这就是为什么基于虚拟 DOM 的框架(例如 Vue 和 React)如此突出的原因。
Vue 插件允许开发人员构建全局级别的功能并将其添加到 Vue。用于向程序添加可以全局访问的方法和属性、资源,选项,mixin 以及其他自定义 API。 VueFire 是 Vue 插件的一个例子,该插件添加了 Firebase 特定的方法并将其绑定到整个程序。之后 firebase 函数可在程序结构中的任何位置的 this
上下文中使用。
Vue 允许我们以多种方式构建模板,其中最常见的方式是只把 HTML 与特殊指令和 mustache 标签一起用于响应功能。但是你也可以通过 JavaScript 使用特殊的函数类(称为渲染函数)来构建模板。这些函数与编译器非常接近,这意味着它们比其他模板类型更高效、快捷。由于你使用 JavaScript 编写渲染函数,因此可以在需要的地方自由使用该语言直接添加自定义函数。
对于标准 HTML 模板的高级方案非常有用。
这里是用 HTML 作为模板的 Vue 程序
new Vue({ el: '#app', data: { fruits: ['Apples', 'Oranges', 'Kiwi'] }, template: `<p> <h1>Fruit Basket</h1> <ol> <li v-for="fruit in fruits">{{ fruit }}</li> </ol> </p>` });
这里是用渲染函数开发的同一个程序:
new Vue({ el: '#app', data: { fruits: ['Apples', 'Oranges', 'Kiwi'] }, render: function(createElement) { return createElement('p', [ createElement('h1', 'Fruit Basket'), createElement('ol', this.fruits.map(function(fruit) { return createElement('li', fruit); })) ]); } });
输出:
Fruit Basket
在上面的例子中,我们用了一个函数,它返回一系列 createElement()
调用,每个调用负责生成一个元素。尽管 v-for 指令在基于 HTML 的模板中起作用,但是当使用渲染函数时,可以简单地用标准 .map()
函数遍历 fruits 数据数组。
尽管这取决于组件的用途及,但是创建的生命周期 hook 内通常非常适合放置 API 调用。这时可以使用组件的数据和响应性功能,但是该组件尚未渲染。
在更新响应性数据并重新渲染虚拟 DOM 之后,将调用更新的 hook。它可以用于执行与 DOM 相关的操作,但是(默认情况下)不能保证子组件会被渲染,尽管也可以通过在更新函数中使用 this.$nextTick
来确保。
箭头函数自己没有定义 this
上下文,而是绑定到其父函数的上下文中。当你在 Vue 程序中使用箭头函数(=>
)时,this
关键字病不会绑定到 Vue 实例,因此会引发错误。所以强烈建议改用标准函数声明。
当由于数据属性或其他某种响应状态而动态切换组件时,每次将它们切换到渲染状态时,都会被重新渲染。尽管你可能需要这种行为,但在某些情况下重新渲染可能是不合适的。例如在创建时从 API 调用中引入数据的组件。你可能不希望每次动态切换这个组件进行渲染时都调用此 API。这时你可以将组件包含在 keep-alive 元素中。keep-alive 元素缓存该组件并从那里获取它,而不是每次都重新渲染它。
当程序在功能和代码方面不断增长时,状态管理会变得困难,并且使用无穷无尽的下游网络 prop 和上游事件当然不是明智的决定。在这种情况下,有必要将状态管理转移到中央管理系统。 Vue 生态系统中提供了 Vuex,它是官方的状态管理库,也是推荐用于集中存储状态的模式。
Vuex 允许维护中央状态。组件将 Vuex 用作响应性数据存储,并在状态更新时进行更新。多个或者不相关的组件可以依赖于相同的中央存储。
在这种情况下,Vue 充当纯 View 层。要修改状态,视图层(例如按钮或交互式组件)需要发出 Vuex Action
,然后执行所需的任务。为了更新或修改状态,Vuex 提供了 Mutations
。
这个工作流程的目的是留下可用的操作痕迹。
当大型程序使用大量组件时,从服务器上同时加载所有组件可能是没有意义的。在这种情况下,Vue 允许我们在需要时定义从服务器异步加载的组件。在声明或注册组件时,Vue 接受提供 Promise 的工厂函数。然后可以在调用该组件时对其进行“解析”。
通过仅加载基本组件并把异步组件的加载推迟到未来的调用时间,可以节省带宽和程序加载时间。
这是一个异步组件的简单示例。
new Vue({ components: { ‘tweet-box’: () => import(‘./components/async/TweetBox’) } });
当以这种方式使用时,Webpack 的代码拆分将用于提供此功能。
原文地址:https://www.zeolearn.com/interview-questions/vue-js
相关推荐:
更多编程相关知识,请访问:编程入门!!
以上がVue.js の高度な面接の質問 15 選の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。