検索
Vue実践まとめmvvm学習Mar 12, 2018 pm 04:37 PM
mvvm勉強

MVVMはModel-View-ViewModelの略称です。 Microsoft の WPF は、新しいテクノロジー エクスペリエンスをもたらします。この記事は主に vue の実践と mvvm の学習についてまとめたもので、皆様のお役に立てれば幸いです。

1 mvvm の学習

1.1 実装原理

mvvm クラス フレームワークの実装原理は複雑ではなく、おおよそ次のとおりです:

  • 依存属性を取得するためのテンプレート分析

  • 何らかの変更を通じてこれらの依存属性を監視する監視メソッド

  • 属性が変更されたとき、対応するディレクティブ処理ロジックをトリガーするだけです

実際、ディレクティブ処理ロジックはレポートなどのビューを操作する必要はありません。ただし、mv の考え方では、ビューに対するすべての操作をディレクティブに集中することが推奨されます

コアの観点から見ると、mv の考え方は、オブザーバー パターンの特定のアプリケーション拡張にすぎません

1.2 主要な技術ポイント

1.2.1 テンプレート分析

ビューに関連するすべての作業には、基本的にテンプレートが含まれます。実際、ここで重要なのは、テンプレートのソースです。任意の文字列である必要があります

これは、パーサーが複雑か単純かに関係なく、フレームワークが [入力 –> テンプレート エンジン –> 出力] のモードにあることを意味します。 mvvmのテンプレートパーサーの特徴は以下の通りです :

    入力:ルールに従った任意の文字列
  • 出力:監視が必要なdata.attr、ディレクティブ、フィルター
  • フレームワークを設計する際に、より優れたスケーラビリティが必要な場合は、

入力が十分に柔軟である必要があります。ソースに関しては、エンジンがより高度なものを認識できる場合、テンプレートは someDomHere.html() または動的入力にすることができます。構文を使用すると、より機能的になります

出力は十分に収束する必要があります。収束とは、mvvm フレームワークと同様に、最後に現れるのはディレクティブとフィルターのみです。これら 2 つの概念は拡張され、概念を使用してシステムを拡張できます

1.2.2 変更監視

多くの mvvm クラス フレームワークでは、次の 3 種類の変更監視があります:

    Facade メソッド setter、getter: などノックアウト、Q.変更できる出入り口を限定し、出入り口の使い方はユーザーに決めてもらいます。
  1. defineProperty: vue、avalon などを使用します。本質的には、セッターとゲッターでもありますが、入り口を使用する権利はユーザーの決定に委ねられません。
  2. ダーティチェック:角度など。 Angular については十分な研究があるため、ここでは詳しく説明しません。
1

1.2.3 概要と拡張

ある種の複雑で一般的な問題が、実際に広く認識されると、モデルが形成されます。これは、必ずしも mvvm モードと呼ばれるものではありません。このモードの核心については、システムが設定に従って特定のデータ ソースに対して特定の処理ルールを取得し、データ ソースが変更されるとそれがトリガーされるということを作成者は理解しています。対応する処理ルール。スキーマの拡張は双方向であり、これはシステム実装によって決定され、特定のルールが満たされると、データ ソースを更新できます。

ビューの概念から脱却し、Lenovo の監視システムを実装しました。実際、このモデルは監視システムでの使用に非常に適しています。

一般的な監視システムの処理ロジックは、収集元が監視データを収集・整理し、データベースに格納する監視システムがデータソースをリアルタイムで監視し、リアルタイムのグラフを描画します(フィードバック)。データ ソースが特定のルールを満たした場合、これらのルールが変更されると、アラームなどの対応するアクションがトリガーされます。

このシステムを実装し、システムをよりスケーラブルにする方法は? mvvm モードを参照すると、次のようになります。

収集システムは監視システムから独立しており、異なるため、今のところ心配する必要はありません。監視システムは、特定の構成ファイルを通じて監視する必要のあるデータ ソースと対応する処理ロジック ルールを取得し、データ ソースが変更されたときに対応する処理をトリガーします。

mvvm パターンに従い、いくつかの抽象化を作成します。

    データ ソースは必ずしもデータベースに限定されるわけではなく、どこでもかまいません。システムが特定の構成可能なルールを通じて取得する必要があるだけです
  • 処理ルールは、拡張を容易にするために抽象化されています。電子メールの送信、テキスト メッセージの送信、WeChat の送信、QQ メッセージの送信など。
  • はフロントエンドの mvvm フレームワークに対応し、テンプレートは設定ファイル、ディレクティブは処理ルール、データはデータに対応しますソース。

    システムが新しいデータソースを追加する必要がある場合、構成ファイルを更新し、システムがそれを読み取ってデータ監視を開始するだけです
  • 処理ルールを追加する必要がある場合は、ホットプラグ 処理ルールプラグインシステムで、新しい処理ルールを展開し、構成ファイルを更新すると、システムは新しい処理ルールを受け入れることができます
  • 2 vue の練習

vue 導入は必要ありません、多すぎますリソース。 vue の実践から得られる利点をいくつか挙げます

2.1 組織構造

2

3

4

5

6

7

8

9

10

11

りー


1+src

2

3

4

5

6

7

8

9

10

11

12

13

14

coms

;

                 +-- index.js

                 +-- vue.ext.js

                 +-- xxx.mixin.js

2.2 Vue扩展

vue的扩展非常方便,与vue相关的资源都放置在src/common/vue/下面,比如coms(组件),directive,filter

src/common/vue/vue.ext.js是对vue进行全局公共的扩展,对于所有页面共有的扩展放在这个文件下面,内容如下:

可以看到,扩展vue库本身有4个扩展点:

  • 扩展Vue库的全局方法/属性,方式:Vue.xxx = …

  • 扩展Vue实例的方法/属性,方式:Vue.prototype = …

  • 扩展directive,方式:Vue.directive(‘directiveName’, options);

  • 扩展filter,方式:Vue.filter(‘filterName’, function(){});

对于页面单独需要的扩展,集中在src/pages/pageName/vue.ext.js里面,形式与全局的vue.ext.js一样

在实例化Vue的过程中也有许多可以扩展与优化的地方,在实践过程中只是应用了mixin功能,其他的可以慢慢深入

mixin的作用是在实例化Vue的时候混入一些功能,它可以混入许多特性,格式与实例化Vue时用到的option格式一样,比如index页面的mixin.js的内容如下:

这个mixin混入了两个方法,多个Vue实例共享的options可以放置到mixin中,从而避免了代码重,比如在实例化Vue的时候这样使用mixin:

可以看到mixin是个数组,因此可以同时使用多个mixin

实际上这里的mixin主要不是为了避免代码重复(实践的时候只是这样用),mixin是一种模式,一个mixin内聚了实现一项功能的方法/属性集合,在定义/生成实例的时候,通过混入mixin就可以让该实例拥有某项功能,归根结底是组合vs继承问题的产物

2.3 vue组件插入问题

2.3.1 首屏

对于首屏的vue组件,直接把模板放在主页面中即可,初始化的时候只需要把el参数传入,Vue就会用el的html作为模板来初始化Vue实例:

这里需要注意的是在模板中不能使用{{}},否则在还没初始化之前,页面会显示奇怪的东西,比如:

1

2

3

4

5

6

7

<p>hello, {{name}}</p>      <!--初始化前,页面会直接展示hello, {{name}}-->
<img src=<span class="s
tring">"{{imgSrc}}"</span> />    <!--初始化前,会报错,can not find http:<span class="comment">//xxx.com/{{imgSrc}}--></span>
 
<!--正确的写法:-->
<p v-text=<span class="string">"&#39;hello, &#39;+name"</span>>hello</p>
<img  v-attr=<span class="string" alt="Vue実践まとめmvvm学習" >"src: imgSrc"</span> />

 

{{}} 只是一个语法糖,不建议使用

2.3.2 非首屏

对于非首屏的组件,使用vue的方式和原始方式差不多,先生成节点,然后append,譬如:

el参数可以接收query string,也可以直接是一个dom节点,如果是dom节点则直接编译dom的内容。如果dom节点不在文档树中,则利用vueObj.$appendTo方法将vue实例的根节点插入到文档树中

上面这种方式是在页面中没有组件的【坑】的情况下使用的,如果页面为组件留了【坑】,比如:

1

2

class="hotRecord" id="js-hotRecord">

 

那么,我们可以这样初始化vue实例:

利用template参数传入模板,并指定el,那么vue实例在初始化之后就会自动把内容插入到el中

通过vue实现组件的主要核心也就这些,更方便的组件写法也只是对这些进行封装

2.4 自定义 directive

在vue中自定义directive是非常简单明了的,要自定义一个directive,可以注册3个钩子函数:

  • bind:仅调用一次,当指令第一次绑定元素的时候。

  • update:第一次调用是在 bind之后,用的是初始值;以后每当绑定的值发生变化就会被调用,新值与旧值作为参数。

  • unbind:仅调用一次,当指令解绑元素的时候。

下面简单介绍一个自定义directive——lazyload:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

<span class="keyword">function</span> addSrc(){}
<span class="keyword">function</span> load(){}
 
module.exports = {
    bind: <span class="keyword">function</span>() {
        <span class="keyword">if</span> (!hasBind) { <span class="comment">//全局事件只绑定一次</span>
            hasBind = <span class="keyword">true</span>;
            (document.querySelector(<span class="string">&#39;.z-scroller&#39;</span>) || window).addEventListener(<span class="string">&#39;scroll&#39;</span>, T.debounce(load, <span class="number">100</span>), <span class="keyword">false</span>);
        }
        <span class="comment">//这里也可以使用data属性来获取</span>
        <span class="keyword">var</span> defaultSrc = <span class="keyword">this</span>.el.getAttribute(<span class="string">&#39;data-defaultsrc&#39;</span>);
        <span class="keyword">if</span> (defaultSrc) addSrc(<span class="keyword">this</span>.el, defaultSrc);    <span class="comment">//先使用默认图片</span>
    },
    update: <span class="keyword">function</span>(src) {
        <span class="comment">//directive初始化时,会调用一次bind和update,bind没有传入src,只有update才会传入src</span>
        <span class="comment">//因此只能在update这里拿到需要lazyload的src</span>
        <span class="comment">//lazyload不允许修改src,这里限制只会执行一次update,防止src被修改造成的影响</span>
        <span class="comment">//注:接受src改变可以实现,只是需要一些复杂的处理,这里为了简单起见不让src改变</span>
        <span class="keyword">if</span> (<span class="keyword">this</span>.init) <span class="keyword">return</span>;  
        <span class="keyword">this</span>.init = <span class="keyword">true</span>;
 
        <span class="comment">//如果图片已经加载了,就不需要注册了,这里也可以使用data属性来区分</span>
        <span class="keyword">var</span> isLoad = parseInt(<span class="keyword">this</span>.el.getAttribute(<span class="string">&#39;data-isload&#39;</span>));
        <span class="keyword">if</span> (isLoad) <span class="keyword">return</span>;
 
        <span class="comment">//注册需要lazyload的图片</span>
        <span class="keyword">list</span>[index++] = <span class="keyword">this</span>;
        <span class="keyword">list</span>[index++] = src;
    }
    <span class="comment">//这里有一个最大的问题:由于有local的存在,会创建两个一模一样的lazyload directive</span>
    <span class="comment">//按理说应该定义一个unbind,但是在unbind中找到并除掉local创建出来的lazyload directive会比较麻烦</span>
    <span class="comment">//因此在load函数里面做了一个处理:如果发现需要lazyload的节点不在文档树中,则剔除掉这个lazyload</span>
    <span class="comment">//通过这个直接省掉了unbind函数</span>
};

 

フィルターのカスタマイズも非常に簡単です。ここでは紹介しません。

2.5 実際の難点とヒント

2.5.1 イベントプロキシには慣れています。突然ですが、イベント プロキシがありません。少し聞き慣れないかもしれませんが、よく考えてみると、イベント エージェントは本当に重要ですか?それとも、単にイベント プロキシに慣れているだけなのでしょうか?

vue 経由で同じイベントを登録するのは簡単です。もう 1 つの問題は、イベントがそれほど多くない (50 または 100 を超えない) 限り、大量のメモリを消費しないため、実際にはイベント エージェントが必要ない場合があることです。本当に必要な場合は、containメソッドを実装してください

2.5.2 if-elseの奇妙さはありません

以下のコードを初めて見たときは、本当に奇妙です

1

if="hasTitle">xxx

> ; 2.5.3 単一値

2

3

if="!hasTitle">xxx

Vue にはディレクティブの値に式を使用できる構文パーサーがありますが、複雑な式が出現するとテンプレートが汚染され、コードが読みやすくなります。非常に悪い場合、または式がタスクを完了できない場合。

したがって、mvvm の実践中に、単一の値 (最大でも 1 つの ?: 式) を使用してテンプレートを作成すると、コードがより明確になり、読みやすくなり、コードの保守性が向上することを深く発見しました。これは、mvvm の中心となる概念である f(state) = view とより一致しています

一部のライブラリには、q などの文法パーサーさえありませんが、非常にうまく機能します。

それでは、複雑な操作をどこに配置するのでしょうか?

    変化しない値、つまり定数については、初期化前に処理が完了している必要があります
  • 変化する値については、フィルターに複雑な演算を入れることができるだけでなく。複雑な処理を他のフィールドに同時に適用することもできます。これは、jquery/zepto を使用する場合、$(document).on
  • の代わりに計算された属性

2.5.4 と完全に同等ではありません。 $(document).onの使用には慣れていますが、グローバルイベントプロキシとして機能するには、vueを使用する場合、zeptoを放棄する必要があるため、この問題を解決する必要があります

vueインスタンス自体にイベント機能があるため、解決策ここでは、グローバルな空の vue オブジェクトを作成し、それをグローバル イベント プロキシとして配置します:

1

2

3

4

5

6

7

8

9

Vue.noopVue = new Vue({});

//a.js

Vue.noopVue。 $on('someEvent', function> ;() {});

//b.js

Vue.noopVue.$emit span>( 'someEvent', [opts]);


3 まとめ

結局、コストと生産性のトレードオフの関係で既存プロジェクトの Vue 変換を断念しましたが、これによって mvvm クラス フレームワークの研究が妨げられるわけではありません

mvvm モードにはまだ価値があります

異なる種類の考え方や考え方で開発するという経験は、問題の見方や解決の仕方においても何かを得ることができます。

関連する推奨事項:

Angularjs で mvvm スタイルのタブを実装するにはどうすればよいですか? Case + code

シンプルな MVVM フレームワークの js 実装例の共有

MVVM アーキテクチャとデータ バインディングとは何ですか?

以上がVue実践まとめmvvm学習の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHP实现MVVM架构:基本原理及应用PHP实现MVVM架构:基本原理及应用Jun 18, 2023 am 08:54 AM

随着Web应用程序的快速发展,越来越多的开发者将目光投向了各种新兴的Web开发框架和架构设计模式。其中一个备受瞩目的设计模式就是MVVM(ModelViewViewModel)架构模式。MVVM采用了一种现代化的设计模式,通过将UI和业务逻辑相分离,使得开发人员能够更好地管理和维护应用程序。此外,MVVM减少了不必要的耦合,提高了代码的可重用性和灵活性,

从零开始学Spring Cloud从零开始学Spring CloudJun 22, 2023 am 08:11 AM

作为一名Java开发者,学习和使用Spring框架已经是一项必不可少的技能。而随着云计算和微服务的盛行,学习和使用SpringCloud成为了另一个必须要掌握的技能。SpringCloud是一个基于SpringBoot的用于快速构建分布式系统的开发工具集。它为开发者提供了一系列的组件,包括服务注册与发现、配置中心、负载均衡和断路器等,使得开发者在构建微

轻松学会win7怎么还原系统轻松学会win7怎么还原系统Jul 09, 2023 pm 07:25 PM

win7系统自带有备份还原系统的功能,如果之前有给win7系统备份的话,当电脑出现系统故障的时候,我们可以尝试通过win7还原系统修复。那么win7怎么还原系统呢?下面小编就教下大家如何还原win7系统。具体的步骤如下:1、开机在进入Windows系统启动画面之前按下F8键,然后出现系统启动菜单,选择安全模式登陆即可进入。2、进入安全模式之后,点击“开始”→“所有程序”→“附件”→“系统工具”→“系统还原”。3、最后只要选择最近手动设置过的还原点以及其他自动的还原点都可以,但是最好下一步之前点击

学习PHP中的PHPUNIT框架学习PHP中的PHPUNIT框架Jun 22, 2023 am 09:48 AM

随着Web应用程序的需求越来越高,PHP技术在开发领域中变得越来越重要。在PHP开发方面,测试是一个必要的步骤,它可以帮助开发者确保他们创建的代码在各种情况下都可靠和实用。在PHP中,一个流行的测试框架是PHPUnit。PHPUnit是一个基于Junit的测试框架,其目的是创建高质量、可维护和可重复的代码。下面是一些学习使用PHPUnit框架的基础知识和步骤

分割后门训练的后门防御方法:DBD分割后门训练的后门防御方法:DBDApr 25, 2023 pm 11:16 PM

香港中文大学(深圳)吴保元教授课题组和浙江大学秦湛教授课题组联合发表了一篇后门防御领域的文章,已顺利被ICLR2022接收。近年来,后门问题受到人们的广泛关注。随着后门攻击的不断提出,提出针对一般化后门攻击的防御方法变得愈加困难。该论文提出了一个基于分割后门训练过程的后门防御方法。本文揭示了后门攻击就是一个将后门投影到特征空间的端到端监督训练方法。在此基础上,本文分割训练过程来避免后门攻击。该方法与其他后门防御方法进行了对比实验,证明了该方法的有效性。收录会议:ICLR2022文章链接:http

我能学习Selenium而不了解Java吗?我能学习Selenium而不了解Java吗?Sep 11, 2023 pm 07:09 PM

这个问题涉及到许多实际上并不了解核心技术并希望在SeleniumAutomation领域发展职业生涯的专业人士。编码这个术语让非程序员有点害怕,甚至不敢从自动化之类的东西开始。人们认为非程序员无法在自动化方面表现出色,但这只是在头脑中。许多值得和有能力的手动测试人员回避Selenium,只是认为它需要一些特殊技能。Selenium脚本是用多种语言设计的,例如Python、Ruby、C#、JavaScript和Java就是其中之一他们当中就有这样的人。了解了Java的受欢迎程度和未来前景,现在更倾

如何学习PHP中的Laravel框架如何学习PHP中的Laravel框架Jun 22, 2023 am 11:15 AM

Laravel是一个基于PHP的开源Web应用程序框架,是当今最受欢迎的框架之一。它的设计思想是以简单、优雅的方式解决复杂的问题,为开发Web应用程序提供了丰富的工具和资源。如果你想在PHP中学习Laravel框架,下面是几个关键步骤:第一步:安装和配置Laravel在开始使用Laravel之前,您需要安装PHP和Composer。Composer是一个PH

轻松学会win7如何升级win10系统轻松学会win7如何升级win10系统Jul 15, 2023 am 09:37 AM

随着win10系统的成熟,微软停止win7的更新和支持,越来越多人选择win10系统使用,打算将自己的win7升级win10系统。不过很多小伙伴不知道win7如何升级win10系统,找不到升级的按键。下面小编教大家一个简单的win7升级win10系统的方法。我们可以借助工具轻松实现win7升级安装win10的方法,具体的操作步骤如下:1、先在电脑上下载安装小鱼一键重装系统工具并打开,关闭电脑的杀毒软件,备份c盘重要资料。然后选择需要安装的win10系统点击安装此系统。2、这个界面选择想要安装的软

See all articles

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン