目次
詳細
Vue2.x## の Ref 操作 Dom の違い#ref="xx" 属性を対応する Dom 要素またはコンポーネントに追加し、Vue オブジェクトで this.$refs.xx を使用して Dom を直接取得し、そのメソッド属性を操作するだけです。
Vue3.2 バージョンで使用されているメソッド
defineExpose
ホームページ ウェブフロントエンド Vue.js Vue2.x と Vue3.x の Ref 演算 Dom の違いの簡単な分析

Vue2.x と Vue3.x の Ref 演算 Dom の違いの簡単な分析

Jan 27, 2023 am 05:30 AM
フロントエンド vue.js

なぜ Ref は Dom を操作するのに使いやすく効率的なのでしょうか?次の記事では、Ref の操作について説明し、Ref による Dom 取得の本質、Vue2.x と Vue3.x の違いなどを紹介します。皆さんの参考になれば幸いです。

Vue2.x と Vue3.x の Ref 演算 Dom の違いの簡単な分析

プロジェクトを開発する前に、最初にニーズ分析を行うことがよくありますが、フロントエンドについては、作業効率を向上させるために基本的なコンポーネント ライブラリを調査または選択できます。結局のところ、時間コストを気にする企業にとって、カレンダーのようなコンポーネントを開発するためにテレビシリーズを見たりゲームをしたりする時間は得られません。ただし、市販されているすべてのコンポーネント ライブラリがニーズを満たすことができるわけではありません。現時点では、コンポーネントをプロジェクトに適用するには自分でコンポーネントを手書きする必要があります。

そして、これが私が言いたいことです: スケーラビリティを向上させ、需要の変化とその後のメンテナンスを容易にしながら、適用しやすいように (またはコードの量を減らして) コンポーネントを設計するにはどうすればよいでしょうか?

色々な方法があり、Refを使ってDomを操作するのもその一つですが、この方法だとModalやPopupの維持・操作、Domの表示やインタラクティブ非表示時の頻繁な操作が可能になります。コンポーネントに大きな利点をもたらします。 [関連する推奨事項: vuejs ビデオ チュートリアル Web フロントエンド開発 ]

Ref を操作する Dom の関連知識ポイントとアプリケーション例がいくつかに分かれています。分析してみましょう

  • Ref は Dom の本質を取得します
  • Ref が Vue2.x で Dom を操作する場合と Vue3.x で Dom を操作する場合の違いxx
  • Ref がコンポーネント Dom を操作する場合と親子コンポーネントの単一転送比較

詳細

Ref は Dom

Vue オブジェクトの本質を取得しますVue2.x では、属性 $refs は実際には登録されているすべての ref のコレクションであり、ref はテンプレート内のさまざまなコンポーネントまたは通常の Dom 要素に関連付けられた ref="xx" に対応します。ソース コードで ref を取得する実際の方法は次のとおりです。また、ネイティブ メソッド getElementById を使用して取得した Dom ノード; は、document.getElementById の糖衣構文であると言えます。 vue3 の ref は vue2 の使用を継続し、レスポンシブ データを作成する機能も追加します。

ref と getElementById の両方で Dom を取得できるため、プロジェクト内で疑問に思う人もいるかもしれません。開発の場合、どちらの方法を選択しても違いはありませんか?

この問題に関しては、$refs を使用すると、document.getElementById メソッドと比較して dom ノードの取得の消費量が削減されることがデータで示されています。具体的な理由については、次の記事で詳しく説明します。

#Vue2.x と Vue3.x

Vue2.x## の Ref 操作 Dom の違い#ref="xx" 属性を対応する Dom 要素またはコンポーネントに追加し、Vue オブジェクトで this.$refs.xx を使用して Dom を直接取得し、そのメソッド属性を操作するだけです。

<user-and-dep-tree-select-modal
  ref="avaUserTreeSelect"
  title="選擇可見範圍"
  :project-id="currentProjectId"
  :visible.sync="avaUserModalVisible"
  @ok="editAvailableUser"
/>
或者
<div class="user" ref="user">dd</div>
ログイン後にコピー
// $refs
showManagerModal () {
  this.$refs.avaUserTreeSelect.showModal(this.form.managers)
  console.log(this.$refs.user.text)
},
ログイン後にコピー

Vue3.2

Vue3.2 バージョンで使用されているメソッド

//普通Dom
<div class="user" ref="user"></div>
//组件
<batch-adjust-department-modal ref="batchAdjustDepartmentRef" />
ログイン後にコピー
<script setup>
import { ref } from &#39;vue&#39;;
// modal调整部门弹层Dom
const batchAdjustDepartmentRef = ref(null);
const user = ref(null);
</script>
ログイン後にコピー

おそらくここで、テンプレートの参照と同じ名前の定数がなぜ使用されるのかについて質問している人がいるかもしれません。が宣言されています 変数は対応する DOM にバインドされていますか? ここで少し追加説明します:

Vue3 の以前のバージョン (3.0.0-beta.21 より前) でのコンポジション API のサポートは、使用されるコンポーネント オプション
    setup
  • 関数でのみ実行できます。で。対応する変数はすべて setup() メソッドで返されます {テンプレートで使用する必要がある変数またはメソッドを記述します}
    <script>
    import { defineComponent, ref } from &#39;vue&#39;
    
    export default defineComponent({
      name: &#39;HelloWorld&#39;,
      setup(props, ctx) {
        const count = ref(0)
        function add() {
          count.value++
        }
        // 使用return {} 把变量、方法暴露给模板
        return {
          count,
          add,
        }
      },
    })
    </script>
    ログイン後にコピー
バージョン 3.0.0-beta.21 で追加
    <スクリプトセットアップ>
  • の実験的な機能。使用すると、<script setup> がまだ実験機能段階にあることを示すメッセージが表示されます。 バージョン 3.2.0 の
  • <script setup>
  • の実験ステータスを削除します。今後、<script setup> が正式にリリースされることが発表されています。常用化され安定したフレームワークとなるのも特徴の一つです。 コンポーネント オプションの setup 関数、<script setup> と比較すると、記述する必要があるコードは少なくなり、より簡潔になるだけであり、return {}## を使用する必要はありません。 # 変数とメソッドを公開するには、コンポーネントを使用するときに積極的に登録する必要はありません。自動的にバインドされます。したがって、
  • <script setup>## で変数が宣言されます。

<script setup>##const user = ref(null);
のように Vue オブジェクト自体がこの中に自動的に追加されます<script>
this.$ ref.user<p><strong><span style="font-size: 18px;">Ref操作组件Dom和父子组件单向传递</span></strong></p><p>props父传子,子通过emits传父,这样单方向传递,在控制弹层组件的显示和隐藏方面也可以实现,但是如此一来,我们就会像下面一样 父组件</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>&lt;template&gt; &lt;exchange-valid-modal-vue v-model:visible=&quot;visibleExchange&quot; /&gt; &lt;/template&gt; &lt;script setup&gt; // 转让管理员组件 import ExchangeValidModalVue from &amp;#39;./modal/ExchangeValidModal.vue&amp;#39;; // modal弹层 const visibleExchange = ref(false); // 转让管理员可视化 const onExchangeAdmin = () =&gt; { visibleExchange.value = true; }; &lt;/script&gt;</pre><div class="contentsignin">ログイン後にコピー</div></div><p>子组件<code>ExchangeValidModalVue.vue

<template>
    <t-dialog
      v-model:visible="visibleExchange"
      header="转让主管理员"
      attach="body"
      width="384px"
      :confirm-on-enter="true"
      :on-close="onCloseExchange"
    />
</template>
<script setup>
const visibleExchange = ref(false);
const props = defineProps({
  data: {
    type: Object,
    default: () => {},
  },
  visible: {
    type: Boolean,
    default: false,
  },
});
watch(
  () => props.visible,
  (cur, pre) => {
    visibleExchange.value = cur;
    if (cur) {
      firstTag.value = 1;
    }
  },
);
watch(
  () => visibleExchange.value,
  (cur, pre) => {
    emits(&#39;update:visible&#39;, cur);
  },
);
</script>
ログイン後にコピー

从代码里面我们就可以发现通过用父子组件单向传递的方式去实现一个组件的显示和隐藏功能,我们需要如此费劲地声明多个变量,还要做两次监听,万一后面不止一个这样的参数进行传递,那么代码量可想而知,而且也不易维护。

其实显示和隐藏的功能可以直接在内部中进行值的响应即可,并不需要在父级别中操作,如下将上面代码改变一下:

子组件ExchangeValidModalVue.vue

<template>
    <t-dialog
      v-model:visible="visible"
      header="转让主管理员"
      attach="body"
      width="384px"
      :confirm-on-enter="true"
      :on-close="onCloseExchange"
    />
</template>
<script setup>
import { ref } from &#39;vue&#39;;
const visible = ref(false);
const emits = defineEmits([&#39;call&#39;]);
const onEmitSelectSuperiod = () => { // 省略
  emits(&#39;call&#39;);
};
const onOpen = () => {
  visible.value = true;
};
const onClose = () => {
  visible.value = false;
};

defineExpose({
  onOpen,
  onClose,
});
</script>
ログイン後にコピー

那么在父组件中,我们只需要通过ref得到该组件Dom,然后操作Dom内部的方法即可;

如:父组件改写

<template>
  <exchange-valid-modal-vue ref="exchangeRef" />
</template>
<script setup>
// 转让管理员组件
import ExchangeValidModalVue from &#39;./modal/ExchangeValidModal.vue&#39;;
// modal弹层
const exchangeRef = ref(null); // 转让管理员可视化
const onExchangeOpen = () => {
   exchangeRef.onOpen() // 直接操作dom里defineExpose暴露出来的方法
};
</script>
ログイン後にコピー

如此,是不是比父子单向数据传递的方式更加高效易用?当然上面所说的只是我举的一个例子,当后续需要在组件内扩展功能也可按类似的方法代替单向数据流的方式扩展

但,请注意;这种操作dom方式,并不是什么场景下都是最佳的选择;我们可以分情况选择,比如当一些数据只需要在子组件的范畴中实现,而不需要父组件外加干涉的情况下,选择ref操作dom更为高效;

补充知识点:

defineExpose

在 Vue3.2 中,默认不会暴露任何在 <script setup> 中声明的绑定,即不能通过模板 ref 获取到组件实例声明的绑定。

Vue3.2 提供了 defineExpose 编译器宏,可以显式地暴露需要暴露的组件中声明的变量和方法

(学习视频分享:vuejs入门教程编程基础视频

以上がVue2.x と Vue3.x の Ref 演算 Dom の違いの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ Mar 16, 2024 pm 12:09 PM

PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ 今日のインターネットの急速な発展の時代において、フロントエンド開発はますます重要になっています。 Web サイトやアプリケーションのエクスペリエンスに対するユーザーの要求がますます高まっているため、フロントエンド開発者は、より効率的で柔軟なツールを使用して、応答性の高いインタラクティブなインターフェイスを作成する必要があります。フロントエンド開発の分野における 2 つの重要なテクノロジーである PHP と Vue.js は、組み合わせることで完璧なツールと見なされます。この記事では、PHP と Vue の組み合わせと、読者がこれら 2 つをよりよく理解し、適用できるようにするための詳細なコード例について説明します。

Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Jan 19, 2024 am 08:37 AM

Django は、迅速な開発とクリーンなメソッドを重視した Python で書かれた Web アプリケーション フレームワークです。 Django は Web フレームワークですが、Django がフロントエンドなのかバックエンドなのかという質問に答えるには、フロントエンドとバックエンドの概念を深く理解する必要があります。フロントエンドはユーザーが直接対話するインターフェイスを指し、バックエンドはサーバー側プログラムを指し、HTTP プロトコルを通じてデータと対話します。フロントエンドとバックエンドが分離されている場合、フロントエンドとバックエンドのプログラムをそれぞれ独立して開発して、ビジネス ロジックとインタラクティブ効果、およびデータ交換を実装できます。

Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Mar 28, 2024 pm 01:06 PM

Go 言語は、高速で効率的なプログラミング言語として、バックエンド開発の分野で広く普及しています。ただし、Go 言語をフロントエンド開発と結びつける人はほとんどいません。実際、フロントエンド開発に Go 言語を使用すると、効率が向上するだけでなく、開発者に新たな視野をもたらすことができます。この記事では、フロントエンド開発に Go 言語を使用する可能性を探り、読者がこの分野をよりよく理解できるように具体的なコード例を示します。従来のフロントエンド開発では、ユーザー インターフェイスの構築に JavaScript、HTML、CSS がよく使用されます。

C# 開発経験の共有: フロントエンドとバックエンドの共同開発スキル C# 開発経験の共有: フロントエンドとバックエンドの共同開発スキル Nov 23, 2023 am 10:13 AM

C# 開発者としての私たちの開発作業には、通常、フロントエンドとバックエンドの開発が含まれますが、テクノロジーが発展し、プロジェクトが複雑になるにつれて、フロントエンドとバックエンドの共同開発はますます重要かつ複雑になってきています。この記事では、C# 開発者が開発作業をより効率的に完了できるようにする、フロントエンドとバックエンドの共同開発テクニックをいくつか紹介します。インターフェイスの仕様を決定した後、フロントエンドとバックエンドの共同開発は API インターフェイスの相互作用から切り離せません。フロントエンドとバックエンドの共同開発をスムーズに進めるためには、適切なインターフェース仕様を定義することが最も重要です。インターフェイスの仕様にはインターフェイスの名前が含まれます

フロントエンドにインスタントメッセージングを実装する方法 フロントエンドにインスタントメッセージングを実装する方法 Oct 09, 2023 pm 02:47 PM

インスタント メッセージングを実装する方法には、WebSocket、ロング ポーリング、サーバー送信イベント、WebRTC などが含まれます。詳細な紹介: 1. クライアントとサーバーの間に永続的な接続を確立してリアルタイムの双方向通信を実現できる WebSocket フロントエンドは WebSocket API を使用して WebSocket 接続を作成し、送受信によるインスタント メッセージングを実現できます。 2. Long Polling(リアルタイム通信を模擬する技術)など

Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Jan 19, 2024 am 08:52 AM

Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Django は、効率的でスケーラブルな Web アプリケーション フレームワークです。 MVCやMTVなど複数のWeb開発モデルをサポートし、高品質なWebアプリケーションを簡単に開発できます。 Django はバックエンド開発をサポートするだけでなく、フロントエンド インターフェイスを迅速に構築し、テンプレート言語を通じて柔軟なビュー表示を実現します。 Django はフロントエンド開発とバックエンド開発をシームレスに統合するため、開発者は学習に特化する必要がありません。

フロントエンドの面接官からよく聞かれる質問 フロントエンドの面接官からよく聞かれる質問 Mar 19, 2024 pm 02:24 PM

フロントエンド開発のインタビューでは、HTML/CSS の基本、JavaScript の基本、フレームワークとライブラリ、プロジェクトの経験、アルゴリズムとデータ構造、パフォーマンスの最適化、クロスドメイン リクエスト、フロントエンド エンジニアリング、デザインパターン、新しいテクノロジーとトレンド。面接官の質問は、候補者の技術スキル、プロジェクトの経験、業界のトレンドの理解を評価するように設計されています。したがって、候補者はこれらの分野で自分の能力と専門知識を証明するために十分な準備をしておく必要があります。

Vue.js vs. React:プロジェクト固有の考慮事項 Vue.js vs. React:プロジェクト固有の考慮事項 Apr 09, 2025 am 12:01 AM

VUE.JSは、中小規模のプロジェクトや迅速な反復に適していますが、Reactは大規模で複雑なアプリケーションに適しています。 1)Vue.jsは使いやすく、チームが不十分な状況やプロジェクトスケールが小さい状況に適しています。 2)Reactにはより豊富なエコシステムがあり、高性能で複雑な機能的ニーズを持つプロジェクトに適しています。

See all articles