中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

跨端開發框架avm組件如何封裝

發布時間:2022-07-15 13:56:35 來源:億速云 閱讀:126 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“跨端開發框架avm組件如何封裝”,內容詳細,步驟清晰,細節處理妥當,希望這篇“跨端開發框架avm組件如何封裝”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    引言

    avm.js 是一個跨端開發框架,AVM(Application-View-Model)前端組件化開發模式基于標準Web Components組件化思想,提供包含虛擬DOM和Runtime的編程框架avm.js以及多端統一編譯工具,完全兼容Web Components標準,同時兼容Vue和React語法糖編寫代碼,編譯工具將Vue和React相關語法糖編譯轉換為avm.js代碼。

    有Vue和React 開發經驗的很容易上手。

    1. 組件的定義和引用:

    1.1 使用stml定義一個組件 / 頁面

    stml組件兼容Vue單文件組件(SFC)規范,使用語義化的Html模板及對象化js風格定義組件或頁面。stml最終被編譯為JS組件 / 頁面,渲染到不同終端。

    定義組件:

    // api-test.stml:
    <template>  
        <view class='header'>
            <text>{this.data.title}</text>
        </view>  
    </template>  
    <script>
        export default {  
            name: 'api-test',
            data(){
                return {
                    title: 'Hello APP'
                }
            }
        }
    </script>
    <style scoped>
        .header{
            height: 45px;
        }
    </style>

    1.2 組件引用:

    // app-index.stml:
    <template>  
        <view class="app">  
            <img src="./assets/logo.png" />  
            <api-test></api-test> 
        </view>  
    </template>
    <script>
        import './components/api-test.stml'  
        export default {  
            name: 'app-index',  
            data: function () {  
                return {
                    title: 'Hello APP'
                }
            }  
        }  
    </script>  
    <style>  
        .app {   
            text-align: center;  
            margin-top: 60px;  
        }  
    </style>

    2. 向子組件傳值

    向子組件傳值采用 props 的方式,這里以一個示例來進行說明。

    定義子組件,在 props 里面注冊一個 title 屬性:

    // api-test.stml:
    <template>
        <text>{title}</text>
    </template>
    <script>
        export default {
            name:'api-test',
            props:{
                title: String
            }
        }
    </script>

    這里定義的title屬性類型為String,屬性類型包括 String、Number、Boolean、Array、Object、Function等。

    2.1 在其它頁面使用子組件時傳遞靜態值:

    // app-index.stml:
    <template>  
        <view>  
            <api-test title="Hello App!"></api-test> 
        </view>  
    </template>
    <script>
        import './components/api-test.stml'  
        export default {  
            name: 'app-index'
        }  
    </script>

    2.2 通過數據綁定傳遞動態值:

    // app-index.stml:
    <template>
        <view>
            <api-test v-bind:title="msg"></api-test>
        </view>
    </template>
    <script>
        import './components/api-test.stml'  
        export default {
            name: 'app-index',
            data() {
                return {
                  msg: 'Hello App!'
              }
            }
        }
    </script>

    傳遞靜態值時只能傳遞字符串類型數據,通過數據綁定的方式則可以傳遞任意類型的數據。

    3. 監聽子組件事件**

    監聽子組件事件和監聽普通事件類似,如:

    // api-index.stml:
    <template>
        <view>
            <api-test onresult="onGetResult"></api-test>
        </view>
    </template>
    <script>
        import './components/api-test.stml'  
        export default {
            name: 'app-index',
            methods: {
                onGetResult(e){
                    console.log(e.detail.msg);
                }
            }
        }
    </script>

    以上示例中監聽了子組件的result事件,子組件里面通過fire方法來觸發監聽的事件:

    // app-test.stml:
    <template>
        <text onclick="onclick">Hello App!</text>
    </template>
    <script>
        export default {
            name:'api-test',
            methods:{
                onclick(){
                    let detail = {msg:'Hi'};
                    this.fire('result', detail);
                }
            }
        }
    </script>

    fire方法有兩個參數,第一個參數為事件名稱,第二個參數為要傳遞的自定義數據,在父組件監聽方法里面通過e.detail獲取傳遞的數據。

    // api-index.stml:
    methods: {
      onGetResult(e){
          console.log(e.detail.msg);
      }
    }

    4.  聲網組件實例

    了解了以上組件的規則和用法,就可以封裝自己的組件了 。下面看一個基于agoraRtc聲網模塊,實現1對1語音通話的組件實例:

    <template>
        <view class="agorartc-call-voice_page">
            <safe-area></safe-area>
            <view class="agorartc-call-voice_list" v-for="(item,index) in userList">
                <view class="agorartc-call-voice_userinfo">
                    <image class="agorartc-call-voice_userinfo-image" thumbnail='false'
                         src={{item.userimg }}></image>
                    <text class="agorartc-call-voice_userinfo-text">{{item.username }}</text>
                </view>
                <view class="agorartc-call-voice_callimg">
                    <image @click="fnstart_voice_call(item.userid)" thumbnail='false' 
                        src="../../image/voice-call.png"></image>
                </view>
            </view>
            <view class="agorartc-call-voice_connected" v-if="connected">
                <image class="agorartc-call-voice_voice" thumbnail='false' 
                    src="../../image/video-voice.gif"></image>
                <image class="agorartc-call-voice_hangup" @click="fnhangup()" thumbnail='false'
                     src="../../image/video-hangup.png"></image>
            </view>
        </view>
    </template>
    <script>
    export default {
        name: 'agorartc-call-voice',
        props: {
            channel: String,
            userList: Array,
            rtcAppId: String
        },
        installed() {
            this.fnishasper_mic();
        },
        data() {
            return {
                connected: false
            };
        },
        methods: {
            fnishasper_mic(_userid) {
                var resultList = api.hasPermission({
                    list: ["microphone"]
                });
                if (resultList[0].granted) {
                } else {
                    api.toast({
                        msg: "需要啟用麥克風權限"
                    });
                    api.requestPermission({
                        list: ["microphone"]
                    }, res => {
                        if (res.list[0].granted) {
                        }
                    });
                }
            },
            fnstart_voice_call(_userid) {
                this.fnrtc_init();
                this.fnerr_listener();
                this.fnjoin_channel(_userid);
            },
            fnrtc_init() {
                console.log('初始化');
                var agoraRtc = api.require('agoraRtc');
                agoraRtc.init({
                    appId: this.props.rtcAppId
                });
            },
            fnjoin_channel(_userid) {
                console.log('121:---' + _userid);
                this.data.connected = true;
                var agoraRtc = api.require('agoraRtc');
                agoraRtc.joinChannelSuccessListener(function (ret) {
                    console.log(ret.uid + 'uid------');
                });
                agoraRtc.remoteUserJoinedListener((ret) => {
                    console.log(ret.uid + 'remoteUserJoinedListener------');
                    if (ret.uid) {
                        this.data.connected = true;
                    }
                });
                // 多人語音通話 ,需設置角色為主播 
                agoraRtc.setClientRole({
                    role: 1
                }, function (ret) {
                    if (ret.code == 0) {
                        //success
                        console.log('設置主播模式成功')
                    }
                });
                agoraRtc.enableAudio((ret) => {
                    if (ret.code == 0) {
                        //success
                        console.log('開啟音頻成功---' + this.props.channel);
                        agoraRtc.joinChannel({
                            channel: this.props.channel,
                            uid: _userid
                        }, function (ret) {
                            if (ret.code == 0) {
                                console.log('加入頻道成功');
                            }
                        });
                    }
                });
                agoraRtc.remoteUserOfflineListener((ret) => {
                    api.toast({
                        msg: '對方已掛斷'
                    })
                    this.fnhangup();
                });
            },
            fnerr_listener() {
                var agoraRtc = api.require('agoraRtc');
                agoraRtc.errorListener(function (ret) {
                    if (ret.errorCode == 0) {
                        var agoraRtc = api.require('agoraRtc');
                        agoraRtc.leaveChannel(function (ret) {
                            if (ret.code == 0) { //success
                            }
                        });
                        api.toast({
                            msg: '通話出錯!'
                        });
                    }
                });
            },
            fnhangup() {
                var agoraRtc = api.require('agoraRtc');
                agoraRtc.leaveChannel(function (ret) {
                    if (ret.code == 0) {
                        //success
                    }
                });
                this.data.connected = false;
            }
        }
    };
    </script>
    <style>
    .agorartc-call-voice_page {
        height: 100%;
        width: 100%;
        background-color: #fff;
    }
    .agorartc-call-voice_list {
        height: 64px;
        width: 100%;
        display: flex;
        flex-direction: row;
        flex-wrap: nowrap;
        justify-content: flex-start;
        margin-bottom: 10px;
    }
    .agorartc-call-voice_userinfo {
        display: flex;
        flex-direction: row;
        flex-wrap: nowrap;
        justify-content: flex-start;
        align-items: center;
        padding-left: 20px;
    }
    .agorartc-call-voice_callimg {
        display: flex;
        flex-direction: row;
        flex-wrap: nowrap;
        justify-content: flex-end;
        align-items: center;
        flex-grow: 2;
        padding-right: 20px;
    }
    .agorartc-call-voice_connected {
        position: absolute;
        top: 0;
        left: 0;
        background-color: #fff;
        width: 100%;
        height: 100%;
        display: flex;
        flex-direction: column;
        justify-content: space-around;
        align-items: center;
    }
    .agorartc-call-voice_hangup {
        margin-top: 30px;
    }
    </style>

    avm.js 默認使用 flex 彈性盒子布局,實現UI時,應充分利用 flex 彈性布局原理進行布局。而實現聲網語音通話的核心邏輯很簡單:兩個用戶加入同一個頻道即可 。

    讀到這里,這篇“跨端開發框架avm組件如何封裝”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    久治县| 郁南县| 万年县| 罗城| 绥江县| 阜新| 纳雍县| 高雄市| 贵阳市| 青田县| 郧西县| 黑山县| 观塘区| 宿州市| 炉霍县| 长海县| 荔波县| 永修县| 大邑县| 察哈| 徐水县| 贵溪市| 北流市| 澄城县| 宜兰县| 宁夏| 宁波市| 巴彦淖尔市| 共和县| 阿拉尔市| 海淀区| 轮台县| 达日县| 绥宁县| 阳江市| 安国市| 会泽县| 临颍县| 女性| 遂溪县| 西丰县|