vue 封装组件时,优雅的将子组件属性和方法对父组件暴露

对 el-input 进行封装,封装为 my-input
<template>
  <!-- 使用 $attrs 传入已在父组件中声明但在子组件中未被声明的 props,从而达到当父组件传入的 prop 时,父组件能直接使用子组件的原生属性 -->
  <!-- 使用 $listeners 传入已在父组件中注册但在子组件中未注册的事件,将父组件中出发的事件直接传递给子组件,从而达到父组件中传入的事件直接在子组件的原生事件中触发 -->
  <el-input
    v-model="value"
    v-bind="$attrs"
    v-on="$listeners">
    <!-- 遍历子组件非作用域插槽,并对父组件暴露 -->
    <template v-for="(index, name) in $slots" v-slot:[name]>
      <slot :name="name" />
    </template>
    <!-- 遍历子组件作用域插槽,并对父组件暴露 -->
    <template v-for="(index, name) in $scopedSlots" v-slot:[name]="data">
      <slot :name="name" v-bind="data"></slot>
    </template>
  </el-input>
</template>

<script>
  export default {
    name: 'MyInput',
    inheritAttrs: false,  // 避免将未声明的 props 在 DOM 节点上注册
    data() {
      return {
        value:''
      }
    },
    props: {
      type: {
        default: 'a',
        // 使用 validator 抛出参数异常,如果返回为 false 则异常
        validator: prop => ['a','b','c'].includes(prop)
      }
    },
    created() {

    },
    methods: {
      myFunc() {
        console.log('myFunc')
      }
    }
  }
</script>

<style scoped>

</style>

在实际场景中使用 my-input

<template>
  <my-input $ref="myInput" clearable @clear="handleClear"/>
</template>

<script>
  import MyInput from './my-input'
  export default {
    name: 'test',
    components: { MyInput },
    data() {
      return {

      }
    },
    created() {

    },
    mounted() {
      // 使用 $ref 调用内部方法
      this.$refs.myInput.myFunc()
    },
    methods: {
      handleClear() {
        console.log('clear')
      }
    }
  }
</script>

<style scoped>

</style>
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中,子组件暴露方法有两种常用的方式。一种是通过使用`defineExpose`手动暴露属性方法,另一种是使用`ref`来绑定子组件,并通过访问`变量名.value`来获取子组件内的属性方法。 首先,通过使用`defineExpose`手动暴露属性方法。在子组件中,你可以将需要暴露属性方法定义在`defineExpose`内。例如,在子组件中定义一个属性`name`和一个方法`sayHello`,然后在`defineExpose`中将它们暴露出来,像这样: ``` // 子组件 defineExpose({ name: '子组件名称', sayHello() { console.log('Hello from 子组件'); } }); ``` 然后,在父组件中,你可以通过`ref`来引用子组件,并通过访问`变量名.value`来获取子组件暴露出来的属性方法。像这样: ``` // 父组件模板 <template> <子组件 ref="变量名"></子组件> </template> // 父组件逻辑 <script> import { ref } from 'vue'; export default { setup() { const 子组件引用 = ref(null); // 访问子组件暴露属性方法 const 子组件名称 = 子组件引用.value.name; 子组件引用.value.sayHello(); return { 子组件引用 }; } }; </script> ``` 另外一种方式是通过将子组件的实例赋值给一个变量,然后通过`变量名.子组件属性`来获取子组件内的属性方法。例如: <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Vue3/ 父组件 ref 获取子组件属性方法组件 defineExpose 暴露方法属性 总结、](https://blog.csdn.net/m0_64494670/article/details/128667877)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Vue 组件三种export暴露方式和import引入方式](https://blog.csdn.net/weixin_41987908/article/details/127490370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值