iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >跨端开发框架avm组件如何封装
  • 231
分享到

跨端开发框架avm组件如何封装

2023-07-02 18:07:04 231人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“跨端开发框架avm组件如何封装”,内容详细,步骤清晰,细节处理妥当,希望这篇“跨端开发框架avm组件如何封装”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。引言avm.js 是一个跨端开发框

本文小编为大家详细介绍“跨端开发框架avm组件如何封装”,内容详细,步骤清晰,细节处理妥当,希望这篇“跨端开发框架avm组件如何封装”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    引言

    avm.js 是一个跨端开发框架,AVM(Application-View-Model)前端组件化开发模式基于标准WEB Components组件化思想,提供包含虚拟DOM和Runtime的编程框架avm.js以及多端统一编译工具,完全兼容Web Components标准,同时兼容VueReact语法糖编写代码,编译工具将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组件如何封装”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: 跨端开发框架avm组件如何封装

    本文链接: https://www.lsjlt.com/news/343629.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 跨端开发框架avm组件如何封装
      本文小编为大家详细介绍“跨端开发框架avm组件如何封装”,内容详细,步骤清晰,细节处理妥当,希望这篇“跨端开发框架avm组件如何封装”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。引言avm.js 是一个跨端开发框...
      99+
      2023-07-02
    • 跨端开发框架avm组件封装经验分享
      目录引言1. 组件的定义和引用:1.1 使用stml定义一个组件 / 页面1.2 组件引用:2. 向子组件传值2.1 在其它页面使用子组件时传递静态值:2.2 通...
      99+
      2024-04-02
    • 如何开发一个封装iframe的vue组件
      这篇文章给大家分享的是有关如何开发一个封装iframe的vue组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。VUE的基本组成单元,我看应该是组件。用VUE开发前端项目,就是开发一个个组件,然后搭积木一样,将项...
      99+
      2023-06-14
    • 前端框架之封装Vue第三方组件三个技巧
      目录引言一、使用第三方组件的属性二、使用第三方组件的自定义事件三、使用第三方组件的插槽四、使用第三方组件的方法引言 在封装第三方组件中,经常会遇到一个问题,如何通过封装的组件去使用第...
      99+
      2024-04-02
    • angular2如何封装material2对话框组件
      这篇文章主要介绍angular2如何封装material2对话框组件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 说明angular-material2自身文档不详,控件不齐,...
      99+
      2024-04-02
    • Flutter 如何封装文本输入框组件
      目录UI组件封装的考虑要点文本输入框接口定义代码实现组件使用踩坑记录总结UI组件封装的考虑要点 封装一个 UI 组件,通常需要考虑下面这三个点: 接口如何定义:即组件接收...
      99+
      2024-04-02
    • 开发一个封装iframe的vue组件
      目录一、组件介绍 二、组件内部结构及逻辑 1、代码组织结构2、地图组件三、iframe接口 四、外部接口 五、运行结果六、总结 VUE的基本组成单元,我看应该是组件。用VUE开发前端...
      99+
      2024-04-02
    • vue如何封装div框选时间的组件
      这篇文章主要为大家展示了“vue如何封装div框选时间的组件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何封装div框选时间的组件”这篇文章吧。div...
      99+
      2024-04-02
    • vue组件如何封装
      封装vue组件的方法:1.新建vue.js项目;2.使用Vue.extend()方法创建组件;3.使用Vue.component()方法注册组件;4.构建组件变量;5.使用组件名称标签调用组件;具体步骤如下:首先,在vue-cli中创建一个...
      99+
      2024-04-02
    • vue.js基于ElementUI如何封装CRUD的弹框组件
      本文小编为大家详细介绍“vue.js基于ElementUI如何封装CRUD的弹框组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue.js基于ElementUI如何封装CRUD的弹框组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
      99+
      2023-07-02
    • vue如何封装TabBar组件
      这篇文章主要为大家展示了“vue如何封装TabBar组件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何封装TabBar组件”这篇文章吧。实现思路:步骤一:TabBar和TabBarIt...
      99+
      2023-06-25
    • vue3如何封装Notification组件
      这篇文章给大家分享的是有关vue3如何封装Notification组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。弹窗组件的思路基本一致:向body插入一段HTML。我将从创建、插入、移除这三个方面来说我的做法...
      99+
      2023-06-29
    • JSBridge框架如何解决通信问题以及实现移动端跨平台开发
      这期内容当中小编将会给大家带来有关JSBridge框架如何解决通信问题以及实现移动端跨平台开发,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、跨平台开发是趋势目前主流的移动端平台主要是Android和i...
      99+
      2023-06-05
    • Python搭建插件式框架(基于组件开发
      Python搭建插件式框架(基于组件开发) 概念 基于组件的开发(Component-Based Development,简称CBD)是一种软件开发范型。它是现今软件复用理论实用化的研究热点,在组件对象模型的支持下,通过复用已有...
      99+
      2023-01-31
      组件 插件 框架
    • 如何封装vue日历组件
      这篇文章将为大家详细讲解有关如何封装vue日历组件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下图示封装的组件的代码如下<template>  <div&...
      99+
      2023-06-29
    • Vue分页组件如何封装
      今天小编给大家分享一下Vue分页组件如何封装的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。效果如图话不多说,直接上代码<...
      99+
      2023-07-02
    • Vue插件如何封装发布
      这篇文章将为大家详细讲解有关Vue插件如何封装发布,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。准备  Vue官网插件部分的介绍虽然很简单,但是还是好好刷一遍的。由于此插...
      99+
      2024-04-02
    • Nodejs如何封装类似express框架的路由
      这篇文章给大家分享的是有关Nodejs如何封装类似express框架的路由的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码如下var http=require(...
      99+
      2024-04-02
    • Vue如何封装全局toast组件
      本篇内容主要讲解“Vue如何封装全局toast组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue如何封装全局toast组件”吧!一. 借助 vue-cli...
      99+
      2024-04-02
    • 如何使用vue组件封装共用的组件
      这篇文章主要介绍了如何使用vue组件封装共用的组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用vue组件封装共用的组件文章都会有所收获,下面我们一起来看看吧。这里提供两种vue封装共用组件的方法方法一...
      99+
      2023-06-30
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作