uniapp で renderjs を使用する

序文

renderjs はビュー レイヤーで実行される js であり、app-vue と h5 のみをサポートし、主に APP を提供します。

UNI APP側の開発については、Webサイトにドキュメントがないため、関連するDOM操作ができず、DOMレンダリングに関連するサードパーティのライブラリ(echart、openlayer、canvasなど)を有効に活用できないため、上記の問題を解決するために、公式の renderjs ソリューションが開始されました。


1. renderjs の機能:

  • ロジック レイヤーとビュー レイヤーの通信損失を大幅に削減し、高性能のビュー インタラクション機能を提供し、通信損失を削減し、パフォーマンスを向上させます。

  • ビュー層でdomを操作し、web用のjsライブラリを実行する(domを操作できるということは、app-vueのサービス層では利用できないウィンドウやドキュメントなどのグローバル変数を持つことを意味します)


2. renderjs とサービスレイヤー間の通信

具体的には、次の 3 つの部分に分けられます。

1. テンプレートでの手動ユーザー操作によるイベントのトリガー

2. サービス層でメソッドを呼び出す

3. renderjs でメソッドを呼び出す

renderjs からサービス レイヤーへ: サービス内のメソッドは this.$ownerInstance.callMethod() メソッドを介して呼び出すことができます。最初のパラメーターはメソッド名で、2 番目のパラメーターは渡されたパラメーターです。


3. renderjs の使用

概要:

  1. ネイティブ レイヤーのデータは、監視を通じて renderjs レイヤーに渡されます (ネイティブ レイヤーのメソッドを呼び出すことでトリガーできます)。

  1. renderjs レイヤーメソッドによって送信されたデータを直接呼び出す


知らせ:

スクリプト ノードの lang を renderjs に設定します。

スクリプトのモジュールの名前は自由に選択できます。module=(値は任意で、名前空間に相当し、後でこの名前に従ってメソッドが呼び出されます)、変更: パラメータ名は次のように一致する必要があります。 renderjs の動作をブロックすることはありませんが、エラーが報告され、データの変更をキャプチャできなくなります。

<template>
      <view class="page-body">
         <!-- prop是一个名字,可以随意修改,注意:change:[name]这两个名字需要相同就行了
          从service层到renderjs:首先在template中绑定一个service中定义的值,然后在同样的位置
          增加:change:(属性名)=(renderjs的module名,触发的方法)来实现通信。
          简单来说就是service负责数据的更改,通过template监听数据的变化来通知renderjs
          this.$ownerInstance.callMethod方法必须通过点击事件执行 -->
          <!-- msg是要向renderjs发送的数据,testRenderjs为renderjs模块名称,onChange是renderjs中的监听方法 -->
          <view :prop="msg" :change:prop="testRenderjs.onChange" id="renderjs-view">{
    
    {msg}}
          </view>
          <button @tap="changeMsgFn">点击修改options</button>
          <button @tap="testRenderjs.emitData">直接调用renderjs中的emitData方法</button>
        </view>
      </view>
</template>
<script>
    //原先的script,这里被称为service层
    export default{
        data(){
            return{
                //这里存放准备传递给renderjs的数据
                msg:'我是service层原来的msg'
            }
        },
        methods:{
            //触发servuce层出入renderjs数据改变
            changeMsgFn(){
                //修改msg 触发change
                this.msg='msg的值变了'
            },
            //接收renderjs发回的数据
            acceptDataFromRenderjs(data){
                console.log('从renderjs中接收到的数据',data)
                this.msg=data.content;
            }
        }
    }
</script>
<script module="testRenderjs" lang="renderjs">
    export default{
        data(){
            return{
                content:'我是来自renderjs的数据'
            }
        },
        created(){
            console.log('renderjs初始化完毕')
        },
        mounted(){
            const view=document.getElementById('renderjs-view');
            const button=document.createElement('button');
            button.innerText='一个按钮';
            view.appendChild(button);
        },
        methods:{
            //接收逻辑层service发送到数据
            onChange(newValue,oldValue,ownerInstance,instance){
                console.log('service层中的options发生变化');
                console.log('新值newValue',newValue);
                console.log('旧值oldValue',oldValue);
                //ownerInstance和this.$ownerInstance一样,可用来向service通信
                //instance和ownerInstance的区别是:
                //instance.$el指向的是触发事件的那个节点;ownerInstance.$el指向当前vue文件中的根节点
                //instance的作用目前尚不明确,官方没有给出用法
            },
            //发送数据到service层
            emitData(event,ownerInstance){
                //event是事件对象
                ownerInstance.callMethod('acceptDataFromRenderjs',{
                    content:this.content
                })
                //或者
                // this.$ownerInstance.callMethod('acceptDataFromRenderjs',{
                //     content:this.content
                // })
                // 需要注意的是:只有通过在template中用户手动操作触发renderjs的方法参数是这两个:event,ownerInstance;通过其他方法
                // 触发的函数参数不一样
            }
        }
    }
</script>

予防:

現在、インライン使用のみをサポートしています

大きなクラス ライブラリを直接インポートしないでください。スクリプト メソッドを作成してインポートすることをお勧めします

vue コンポーネントのライフサイクルは使用できますが、App Page のライフサイクルは使用できません

ビュー層とロジック層の間の通信モードは WXS と一致しています.また、現在のコンポーネントの ComponentDescriptor インスタンスは、this.$ownerInstance を通じて取得できます。

ビューレイヤで観測更新データに直接アクセス可能

APP ビュー レイヤーのページ参照リソース パスは、ルート ディレクトリからの相対パスです (例: ./static/test.js)。

The APP side can use the dom bom API, and cannot directly access logic layer data. Renderjs は uni または他のフレームワーク API (例: uni.request) を使用できません. ネイティブ レイヤーが呼び出された後にデータを渡すためにモニタリングをトリガーする必要があります. .

H5エンドのロジックベースレイヤーとビューレイヤーは実際には同じ環境で動作しており、これはロジックレイヤーのデータに直接アクセスできるmixinを使用することと同等です。

アプリ側の renderjs レイヤーのデータは、ネイティブ レイヤーのデータとは無関係です

this.$ownerInstance.callMethod メソッドは、クリック イベントを通じて実行する必要があります。

Map メソッドは renderjs レイヤーに記述する必要があり、サブコンポーネントは使用できません

おすすめ

転載: blog.csdn.net/Primary_Insist/article/details/129029201