Skip to content

Vue 自定义组件

子组件中调用父组件方法

js
<MyComponent @callback="callbackFunc" />

export default {
  // ...
  methods: {
    callbackFunc(arg1, arg2) {
      // ...
    }
  }
}
js
// 在需要的地方使用 $emit 来调用就行
this.$emit('callback', arg1, arg2)
  • 核心是使用 $emit 方法
  • 注意:在父组件中通过 v-on (缩写为 @) 来监听事件时,不要传入参数(无论方法是否有参数)
  • 当需要传参时,在子组件使用 $emit 时传参
  • 参考:vue 子组件调用父组件的方法并传参

自定义组件示例

文本复制组件

vue
<template>
  <el-text v-bind="$attrs" @mouseenter="mouseEnter" @mouseleave="mouseLeave" style="">
    <span v-if="isHidden">******</span>
    <span v-else-if="maxLen > 0 && $slots.default()[0].children.length > maxLen">{{ $slots.default()[0].children.slice(0, maxLen) }}...</span>
    <slot v-else />
    <el-icon v-if="show" v-copy="$slots.default()[0].children" @click="stop" style="margin-left: 3px; cursor: pointer;"><el-icon-copy-document /></el-icon>
  </el-text>
</template>

<script>
  export default {
    props: {
      isHidden: { type: Boolean, default: false },
      maxLen: {type: Number, default: 0},
    },
    data() {
      return {
        show: false,
      }
    },
    computed: {
    },
    mounted() {
      // console.log(this.$slots.default()[0])
    },
    methods: {
      mouseEnter() {
        this.show = true
      },
      mouseLeave() {
        this.show = false
      },
      stop(e) {
        e.preventDefault();
      }
    }
  }
</script>

<style scoped>
</style>
  • 功能1鼠标移动到文本上时,在文本右侧显示复制图标;点击可复制文本
  • 复制功能使用的是 SCUI 框架自带的复制指令
  • 如果不是在 SCUI 框架的基础上,也可以自己写复制功能,代码可参考《点击复制到剪切板》
  • 功能2密码字段可使用星号隐藏,不影响复制
  • 功能3还可以指定文本展示的最长长度,超过长度使用省略号代替