vue3父子组件传值,子组件暴漏方法

1.父传子 defineProps

父组件直接通过属性绑定的方式给子组件绑定数据,子组件通过defineProps接收函数接收


其中v-model是完成事件绑定和事件监听的语法糖。v-model算是v-bindv-on的简洁写法,等价于

<c-input ref="inputRef" :modelValue="inputValue" @input="inputValue = $event.target.value"></c-input>

子组件接收:

子组件使用:props.modelValue

2.子传父 defineEmits

子组件通过defineEmits注册一个自定义事件,而后触发emit去调用该自定义事件,并传递参数给父组件。

在父组件中调用子组件时,通过v-on绑定一个函数,通过该函数获取传过来的值。

父组件传值:

子组件接收:

3.子组件暴漏方法,父组件调用 defineExpose

(1)在父组件中获取在子组件的实例

(2)在子组件中通过defineExpose暴漏方法

子组件:

父组件:

4.完整代码

复制代码
//父:
<template>
  <h2>父组件:{{ inputValue }}</h2>
  <CInput ref="inputRef"  v-model:modelValue="inputValue"></CInput>
  <!-- <c-input ref="inputRef" :modelValue="inputValue" @input="inputValue = $event.target.value"></c-input> -->
  <button @click="submitForm">提交</button>
  <span v-if="errorMessage" style="color:red">{{ errorMessage }}</span>
</template>
<script setup>
//在vue3中如何将子组件的方法暴漏
//1.在父组件中获取在子组件的实例
//2.在子组件中通过defineExpose暴漏方法
import { ref } from 'vue'
import CInput from '@/views/CInput.vue'

const inputValue = ref('')
const errorMessage = ref('')
const inputRef = ref(null)
const submitForm = () => {
  if(inputRef.value.validate(inputValue.value)){
    errorMessage.value=''
  } else {
    errorMessage.value='输入不能为空'
  }
}
</script>
子:
<template>
  <!-- @input是一个常用的指令,用于监听原生input事件。当输入框的值发生变化时,@input指令绑定的方法会被触发。 -->
  <input 
    type="text" 
    :value="modelValue" 
    @input="updateValue"/>

</template>
<script setup>
import { defineProps,defineEmits,defineExpose } from 'vue'

const props= defineProps({
  modelValue:{
    type:Number
    //require:true
  }
})
const emit = defineEmits(['update:modelValue'])
//const emit = defineEmits([modelValue'])
const updateValue = (event) =>{
  emit('update:modelValue',event.target.value)
}
const validate = (value)=>{
//简单校验规则,输入不能为空
  return value.trim()!==''
}
//暴漏方法
defineExpose({
  validate 
})
</script>
相关推荐
y***86692 分钟前
JavaScript在Node.js中的Electron
javascript·electron·node.js
烛阴6 分钟前
从`new`关键字开始:精通C#类与对象
前端·c#
天若有情67311 分钟前
笑喷!乌鸦哥版demo函数掀桌怒怼主函数:难办?那就别办了!
java·前端·servlet
记得记得就15111 分钟前
【Nginx 实战系列(一)—— Web 核心概念、HTTP/HTTPS协议 与 Nginx 安装】
前端·nginx·http
天蓝色的鱼鱼12 分钟前
mescroll老用户亲测z-paging:这些功能让我果断切换!
前端·uni-app
JarvanMo17 分钟前
适用于 iOS 开发者的 Flutter 3.38:Xcode 与 Swift 集成新技巧
前端
北极糊的狐29 分钟前
Vue 中 vue-awesome-swiper的使用笔记(适配 Vue2/Vue3)
前端·javascript·vue.js
anyup32 分钟前
🔥100+ 天,已全面支持鸿蒙!uView Pro 近期更新盘点及未来计划
前端·uni-app·harmonyos
m0_6265352040 分钟前
代码分析 长音频分割为短音频
javascript·python·音视频
2***574244 分钟前
前端数据可视化应用
前端·信息可视化