Vue に基づくテンプレート構文の紹介

目次

1. Vueの概要

2.MVVMモデル

3. テンプレート構文

1. 補間構文 { {}}

2. v-html コマンド

3. v-bind コマンド

4. v-on コマンド

5. 条件付きレンダリング

6. リストレンダリング v-for

7. スタイルバインディングとクラスバインディング


1. Vueの概要

Vue は、ユーザー インターフェイスを構築するための進歩的なフレームワークです。他の大規模なフレームワークとは異なり、Vue はボトムアップでレイヤーごとに適用されるように設計されています。Vue のコア ライブラリは、使いやすいだけでなく、サードパーティのライブラリや既存のプロジェクトと簡単に統合できるビュー レイヤーにのみ焦点を当てています。一方、最新のツールチェーンやさまざまなサポート ライブラリと組み合わせると、Vue は複雑な単一ページ アプリケーションを完全に強化することもできます。これは単一ページのアプリケーションに使用され、vue プラグイン ルーティングはページ ジャンプに使用されてジャンプを実現します。

Vue公式サイト: https: //cn.vuejs.org/

vue の公式 Web サイトは vue3 に更新されましたが、引き続き vue2 から開始します。

vue を使用する前に、まず vue フレームワークを紹介し、公式 Web サイトに直接アクセスして script タグをコピーする必要があります。

学習 -> チュートリアル -> インストール:

 Vue の基本的な使用方法:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
	<!-- 引入vue框架 -->
	<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
</head>
<body>
	<!-- 模板 根组件只有一个模板-->
	<div  id="app">
		<!-- 文本插值 -->
		{
   
   {msg}}
		<br>----------------------------
		<my-info></my-info>
		<my-info></my-info>
		<my-info></my-info>
		{
   
   {qq}}
		<!-- 事件绑定 使用v-on:事件类型='函数名' -->
		<!-- @事件类型 绑定事件 -->
		<!-- <button v-on:click="handler">获取qq</button> -->
		<button @click="qq='111222333'">获取qq</button>
		{
   
   {time}}
	</div>
	<script>
		// 自己定义组件实例
		let Info={
			template:`
				<div>{
   
   {msg}}</div>
			`,
			// data:{
			// 	msg:"hello world"
			// }
			data(){
				return {
					msg:"hello world"
				}
			}
		};
		// 创建vue实例 Vue构造函数方式
		let vm=new Vue({
			// 局部注册组件实例
			components:{
				'my-info':Info
			},
			// 将模板与实例进行绑定
			el:"#app",
			// 数据模型 存放vue变量
			data:{
				msg:'hello Vue2',
				qq:'获取qq',
				time:new Date()
			},
			// 声明函数 
			methods:{
				handler(){
					this.qq='111222333'
				}
			}
		});
		setInterval(()=>{
			vm.time=new Date()
		},1000);
	</script>
</body>
</html>

2.MVVMモデル

MVVMモデル:

  • M : モデル データ内のデータに対応するモデル
  • V : ビュー ビュー、vue のテンプレートに対応
  • VM : ビュー モデル ViewModel、Vue インスタンス オブジェクトに対応

上の図の と は、双方向のデータ バインディングを実現するための鍵となる 2 つのツールと考えるDOM Listeners(dom监听器)ことができます。Data Bindings(数据绑定)

  • ビュー側から見ると、ViewModel のツールはDOM Listenersページ上の DOM 要素の変更を監視するのに役立ち、変更がある場合はモデル内のデータを変更します。
  • モデル側から見ると、モデル内のデータを更新すると、Data Bindingsツールはページ内の DOM 要素を更新するのに役立ちます。

簡単に言うと、ViewModel はビューとデータ モデルの間のリンクです。データ モデルが変更されると、vm はビューに変更を通知し、ビューが変更されると、vm はデータ モデルに対応する変更を行うように通知します。

Vue は MVVM モデルを使用します。

3. テンプレート構文

Vue は HTML ベースのテンプレート構文を使用して、開発者が DOM を基礎となる Vue インスタンスのデータに宣言的にバインドできるようにします。すべての Vue テンプレートは有効な HTML であるため、仕様に準拠したブラウザーと HTML パーサーで解析できます。基礎となる実装では、Vue はテンプレートを仮想 DOM レンダリング関数にコンパイルします。レスポンシブ システムと組み合わせることで、Vue は少なくとも再レンダリングが必要なコンポーネントの数をインテリジェントに計算し、DOM 操作の数を最小限に抑えることができます。

1. 補間構文 { {}}

Vue インスタンスが作成されると、データ オブジェクトのすべてのプロパティが Vue のリアクティブ システムに追加されます。これらのプロパティの値が変更されると、ビューは「応答」します。つまり、マッチングは新しい値で更新されます。

  • レンダリングの最も一般的な形式は、"Mustache" 構文 (二重中かっこ) を使用したテキスト補間です。
  • 任意の js 式を二重中括弧内に記述できます
  • v-once コマンドを使用して、1 回の補間を実行します。データが変更されると、補間時の内容は更新されません。
<body>
  <div id="app">
    <!-- 1.文本插值 mustache语法 {
   
   {}} -->
    {
   
   {msg}}
    <!-- 2.{
   
   {使用js表达式}} -->
	{
   
   {count * 100}}
	{
   
   {Number(msg)}}
	{
   
   {Boolean(msg)}}
    <!-- 3. v-once 使用v-once指令,执行一次性的插值,当数据发生改变,插值处的内容不会更新 -->
    <div v-once>{
   
   {msg}}</div>
  </div>
  <script>
    let vm = new Vue({
      el: '#app',
      data: {
        msg: 'hello Vue',
        count: 10
      }
    });
    //设置两秒后修改msg的值,使用v-once后插值处内容不会改变
    setTimeout(()=>{
			vm.msg='我被修改了'
		},2000)
  </script>
</body>

2. v-html コマンド

バックグラウンドで要求するデータが HTML コードの場合、 { {}} を介して直接出力すると、HTML コードも一緒に出力されます。二重中括弧は、データを HTML コードではなくプレーン テキストとして解析します。しかし、HTML 形式に従って解析し、対応するコンテンツを表示することが必要な場合があります。HTML 表示を解析したい場合は、v-html コマンドを使用できます。このコマンドの後には、多くの場合、文字列の HTML を解析してレンダリングする文字列型が続きます。

<body>
  <div id="app">
    <!-- 使用插值语法无法解析html代码片段 -->
    {
   
   {p}}
    <!-- 使用v-html指令可以解析代码片段 -->
    <div v-html="p"></div>
  </div>
  <script>
    let vm = new Vue({
      el: '#app',
      data: {
        p:'<a href="https://www.baidu.com">百度一下</a>'
      }
    });
  </script>
</body>

結果は次のとおりです。

 

3. v-bind コマンド

要素の属性に二重中括弧構文を適用することはできません. この場合、v-bind コマンドを使用する必要があります.

v-bind ディレクティブは、コロンとして省略できます。

<body>
  <div id="app">
    <!-- 绑定变量 v-bind 或者 简写成: -->
    <div v-bind:title="title">hello vue</div>
    <div :title="title">hello world</div>
  </div>
  <script>
    let vm = new Vue({
      el: '#app',
      data: {
        title: "我是一个标题"
      }
    });
  </script>
</body>

4. v-on コマンド

v-on を使用してイベントを現在の要素にバインドするか、短い形式の @ を使用できます。

<body>
  <div id="app">
    {
   
   {msg}}
    <!-- 绑定事件 v-on:事件名称="函数名(或者直接写js代码)"-->
    <button v-on:click="update">点击我</button>
    <!-- 简写 @ -->
    <button @click="msg='我又被修改了'">点击我</button>
  </div>
  <script>
    let vm = new Vue({
      el: '#app',
      data: {
        msg: "hello vue"
      },
      methods:{
        update(){
          this.msg = '我被修改了'
        }
      }
    });
  </script>
</body>

 

5. 条件付きレンダリング

v-if (単独で使用可能)、式が true の場合、v-if 属性を使用して要素をレンダリングし、それ以外の場合は v-else を使用してレンダリングします。

v-show (css スタイルで表示属性を切り替える)、頻繁に css スタイルを切り替える、v-show を使用します。

v-if と v-for を一緒に使用することはお勧めしません。v-if と v-for を併用すると、v-for が v-if よりも優先されます。

v-if と v-show の違い:

v-ifは遅延 dom オーバーヘッドです. dom ノードは条件が満たされた場合にのみロードされ、条件が満たされない場合は dom 要素は直接レンダリングされません. 使用シナリオ: dom オーバーヘッドが少ない場合に使用されます。

v-show は、条件が満たされたときに要素を表示し、条件が満たされていないときに display:none を呼び出して要素を非表示にしますが、条件が満たされているかどうかに関係なく dom 要素を読み込みます。使用シナリオ: CSS スタイルを頻繁に切り替える必要がある場合に使用します。

<body>
  <div id="app">
    <!-- 条件渲染 v-if v-else-if v-else v-show-->
    <div v-if="type==='email'">
      <form>
        <input type="text" placeholder="请输入邮箱">
      </form>
    </div>
    <div v-else-if="type==='telephone'">
      <form>
        <input type="text" placeholder="请输入电话">
      </form>
    </div>
    <div v-else>错误</div>
    <div v-show="isShow">我是一个div</div>
  </div>
  <script>
    new Vue({
      el: "#app",
      data: {
        type: "telephone",
        isShow: false
      }
    })
  </script>
</body>

6. リストレンダリング v-for

v-for は、リスト データをレンダリングするために使用されます。v-for ディレクティブには、items 内のフォーム item の特別な構文が必要です。ここで、items はソース データ配列であり、item は反復される配列要素のエイリアスです。

キー属性

v-for を使用する場合、対応する要素またはコンポーネントに :key 属性を追加する必要があります。

なぜこのキー属性が必要なのですか?

これは、実際には Vue の仮想 DOM の Diff アルゴリズムに関連しています。

レイヤー内に同じノード、つまりリストノードが多数ある場合、新しいノードを挿入したい

  • B と C の間に F を追加できるといいのですが、Diff アルゴリズムはデフォルトでこのように実行されます。

  • つまり、C を F に、D を C に、E を D に更新し、最後に E を挿入するというのは、非常に非効率的ではないでしょうか。

 

したがって、キーを使用して各ノードを一意に識別する必要があります

  • Diff アルゴリズムはこのノードを正しく識別できます

  • 新しいノードを挿入する正しいロケーション エリアを見つけます。

つまり、キーの機能は主に仮想 DOM を効率的に更新することです。

<body>
  <div id="app">
    <!-- 列表渲染数组 -->
    <ul>
      <li v-for="(item,index) in animal" :key="item">{
   
   {item}}--{
   
   {index}}</li>
    </ul>
    <!--列表渲染对象 -->
    <ul>
      <li v-for="(key,value,index) in obj" :key="index">{
   
   {key}}--{
   
   {value}}--{
   
   {index}}</li>
    </ul>
  </div>
  <script>
    new Vue({
      el: "#app",
      data: {
        animal: ['老虎', '猴子', '狮子'],
        obj: {
          name: 'zhangsan',
          age: 18
        }
      }
    })
  </script>
</body>

 

7. スタイルバインディングとクラスバインディング

要素のクラス リストとインライン スタイルを操作することは、データ バインディングの一般的な要件です。これらはすべて属性であるため、v-bind を使用してそれらを処理できます。式から文字列の結果を計算するだけです。ただし、文字列の連結は面倒で、エラーが発生しやすくなります。そのため、Vue はクラスとスタイルに v-bind を使用する際に特別な拡張を行いました。式の結果の型は、文字列に加えて、オブジェクトまたは配列にすることができます。

<style>
	.red{
		color:red;
	}
	.color{
		font-size: 18px;
		background-color: pink;
	}
</style>
<body>
	<div id="app">
        <!-- 动态绑定style -->
		<div :style="{color:currentColor}">我是一个div</div>
		<div :style="styleObj1">我是第二个div</div>
		<div :style="[styleObj1,styleObj2]"> 我是第三个div</div>
		<!-- 动态绑定类名 -->
		<div :class="{red:true}">我是第四个div</div>
		<div :class="{red:false,color:true}">我是第五个div</div>
		<div :class="[{red:true},{color:false}]">我是第六个div</div>
	</div>
	<script>
		new Vue({
			el:"#app",
			data:{
				currentColor:'red',
				styleObj1:{
					fontSize:'18px',
					backgroundColor:'blue'
				},
				styleObj2:{
					backgroundColor:'red'
				}
			}
		})
	</script>
</body>

おすすめ

転載: blog.csdn.net/lq313131/article/details/126997597