VUE 自定义控件的事件

1. 自定一个组件 TopBar
<template>
  <!-- 顶部工具栏组件 -->
  <div v-if="showNav" class="top-bar" :style="{ height: `${height}`, backgroundColor: `${backgroundColor}` }">
    <!-- 顶部返回图标 默认显示 -->
    <div v-if="showBack" class="icon icon-back" @click="handleBack"/>
    <!-- 顶部标题 -->
    <span class="title">{{ title }}</span>
    <!-- 顶部更多图标 默认不显示 -->
    <div v-if="showMore" class="icon icon-more" @click="handleMore"/>
    <!-- 顶部分享图标 默认不显示 -->
    <div v-if="showShare" class="icon icon-share" :class="[{ 'icon-share-adjusted': !showMore }]" @click="handleShare"/>
  </div>
</template>

<script setup lang="ts">

import { callNativeFunction, closeWebView } from '@/utils/clientBridge';
import { computed, defineProps, onMounted, ref, withDefaults } from 'vue';

interface Props {
  showNav?: boolean;
  title?: string;
  backgroundColor?: string;
  height?: string;
  showBack?: boolean;
  showShare?: boolean;
  showMore?: boolean;
}
// 使用 withDefaults 为 props 设置默认值
const props = withDefaults(defineProps<Props>(), {
  showNav: true,
  title: '',
  backgroundColor: '#000',
  height: '44px',
  showBack: true,
  showShare: false,
  showMore: false,
});

const emit = defineEmits<{
  (event: 'bar-icon-click',type:string): void;
}>();



function handleBack() {
  // 调用客户端返回协议
  closeWebView();
}

// TODO: 调用客户端更多协议
function handleMore() {
  window.console.log('调用客户端更多协议');
  emit("bar-icon-click","more")
}

// TODO: 调用客户端分享协议
function handleShare() {
  window.console.log('调用客户端分享协议');
  emit("bar-icon-click","share")
}

</script>

<style lang="less" scoped>
@import '~@/assets/styles/common.less';

.top-bar {
  width: 100vw;
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  position: relative;

  .icon {
    width: 24px;
    height: 24px;
    background-repeat: no-repeat;
    background-size: cover;
    background-position: center;
  }

  .icon-back {
    background-image: url('../../assets/images/df_icon_back.png');
    position: absolute;
    left: 16px;
  }

  .icon-more {
    background-image: url('../../assets/images/df_icon_more.png');
    position: absolute;
    right: 16px;
  }

  .icon-more-adjusted {
    right: 56px;
  }

  .icon-share {
    background-image: url('../../assets/images/df_icon_share.png');
    position: absolute;
    right: 56px;
  }

  .icon-share-adjusted {
    right: 16px;
  }

  .title {
    font-family: Poppins;
    text-align: center;
    color: #fff;
    font-size: 18px;
    font-weight: 500;
    line-height: normal;
    text-transform: capitalize;
    letter-spacing: 0px;
  }
}
</style>

其中,定义了一个事件回调

const emit = defineEmits<{
  (event: 'bar-icon-click',type:string): void;
}>();

触发回调的逻辑:

// TODO: 调用客户端更多协议
function handleMore() {
  window.console.log('调用客户端更多协议');
  emit("bar-icon-click","more")
}

// TODO: 调用客户端分享协议
function handleShare() {
  window.console.log('调用客户端分享协议');
  emit("bar-icon-click","share")
}
2. 父视图中调用子组件,对事件的实现
<template>
  <div class="video-preview no-select" @click.capture="handleCaptureClick">
    <TopBar title="" :showShare="true" :showNav="true" :show-more="true" backgroundColor="#03141A"
            @bar-icon-click="barClickHandle" id="top-bar-id"/>

  </div>
</template>

<script lang="ts" setup>

import TopBar from '@/components/TopBar/index.vue';

const {proxy} = getCurrentInstance()!;


const barClickHandle = (type) => {
  console.log("barClickHandle", type)
  if ("more" === type) {
    showMenuPop.value = true
  }
  if ("share" === type && selectedTemplate.value) {
    if (selectedTemplate.value.id) {
      let title = "Try the great template!"
      let templateId = selectedTemplate.value.id

      openLoadingIcon()
      getClientUserInfo().then(res => {
        closeLoadingIcon()
        if (res && res.userId) {
          let shareUrl = "https://dreamfaceapp.com/share/template?userId=" + res.userId + "&channel=system&tempId=" + templateId
            + "&apn=com.dreamapp.dubhe"
          if (getEnvStatus().isRelease) {
            apiPostRequest(config.api.shortUrlGet, {url: shareUrl}).then(res => {
              callShare(res.url || shareUrl, title)
            }).catch(e => {
              callShare(res.url || shareUrl, title)
            })
          } else {
            callShare(shareUrl, title)
          }
        }
      }).catch(e => {
        closeLoadingIcon()
      })
    }
  }
}

function callShare(url: string, title: string) {
  let shareParams = {
    title: title,
    description: url,
    remoteUrl: "",
    localPath: "",
    mimeType: "TEXT",
    channel: "system"
  }
  callNativeShare(shareParams)
}

</script>

类似于 iOS 中 Delegate / Block 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容