defineExpose defineProps defineEmits三个在 <script setup> 方式中使用

defineProps

1、用于组件通信中父级组件给子级组件传值,其用来声明props,其接收值为props选项相同的值

2、默认支持常见的类型检查,在ts下,我们需要明确变量的类型,类型经常是我们的自定义类型

3、只能在<script setup>中使用

4、不需要被导入即可使用,它会在编译<script setup>语法块时一同编译掉

5、必须在<script setup>的顶层使用,不可以在<script setup>的局部变量中引用

6、不可以访问 <script setup> 中定义的其他变量,因为在编译时整个表达式都会被移到外部的函数中
用法:

//父组件
<template>


  <!-- :绑定的是子组件期待接收的  =等号后的是传递的参数 -->
  <Son2 :val="name" />
  
</template>

<script setup>
import Son2 from '@/components/son2.vue';
  let name = '张三'
</script>

<style lang="scss" scoped>

</style>
//子组件
<template>

  
<h1>姓名:{{val}}</h1>

</template>

<script setup>

//第一种
// 以数组的方式接收要传递的值
// const props = defineProps(["val"]);

// 第二种方式可以设置传来值的类型  
 const props = defineProps({
  val: {
    type: String,
    default: ""  //默认值
   }
  
 });

</script>

<style lang="scss" scoped>

</style>

defineEmits

1、用于组件通信中子级组件向父级组件传值,其用来声明emit,其接收内容于emit选项一致

2、只能在<script setup>中使用

3、不需要被导入即可使用,它会在编译<script setup>语法块时一同编译掉,

4、必须在<script setup>的顶层使用,不可以在<script setup>的局部变量中引用

1、用法:

与defineProps一样,无需引入,直接可以使用。使用 defineEmits 声明事件(也就是父级页面上添加的 @监听事件)

2、传参:
在 emits() 的第一个参数,是监听事件的字面量。第二个参数为事件传递的参数。如果该事件有多个参数,第二个参数建议用对象的形式传递

//子组件

<template>

 <!-- <button @click="handelClick">传递给父级</button> -->
</template>

<script setup>
import { onMounted } from 'vue';

/**
 * 在子组件中使用defineEmits来声明emits
 * 其接收值与emit选项一致
 * 传入的选项在全局变量
 * emits函数是defineEmits返回值
 * defineEmits函数参数是个数组,数组内容是自定义函数名称
 * emits函数第一个参数是自定义事件名称,第二个参数是需要传递的内容
 * defineEmits如果放在局部。不在全局。则报错
 * defineEmits is not defined

*/
//可以通过事件触发调用,也可以通过生命周期调用
onMounted(()=>{
  handelClick()
})
//定义一个自定义事件
const emits = defineEmits(['increase'])
const data  ={
  name:'张三',
  age:18,
  id:4546545465
}

function handelClick(){
  //第一个参数为自定义事件名  第二个参数为要传递的数据
  emits('increase',data)
}

</script>

<style lang="scss" scoped>

</style>
//父组件
<template>

  <Son3  @increase='handleIncrease' />

</template>

<script setup>
import Son3 from '@/components/son3.vue';

/**
 * 在父级组件中,使用子级的自定义事件,
 * 在html中去写@自定义事件名称=事件名称
 * 函数中value是个形参,为子级传递过来的数据
 */
//使用自定义事件   value是自定义事件传递过来的参数
function handleIncrease(value) {
  console.log(value);       //{name:'张三', age:18,id:4546545465}
}
</script>

<style lang="scss" scoped>

</style>

defineExpose

1、组件暴露自己的属性以及方法,去供外部使用,常用于父子组件关系

2、在vue3.2中setup 挂载到 script (ref默认是关闭的) 是不能直接使用ref 取到子组件的方法和变量,需要使用defineExpose

用法:

//子组件
<template>

</template>

<script setup >
import { ref } from 'vue'

const count = ref(123456)

function add() {
  console.log('子组件的方法被调用了');
  return 10
}

//暴露当前组件的属性和方法  只需要父级通过ref去获取就可以
defineExpose({
  count,
  add
})
</script>

<style scoped lang="less">

</style>
//父组件
<template>

  <h1>{{number_age}}</h1>
    <!-- 使用ref拿取到子组件 -->
  <Son4 ref="hello" />

</template>

<script setup>
import Son4 from '@/components/son4.vue';
import { onMounted, ref } from 'vue'

onMounted(() => {
  helloClick()
})

  // 父级通常使用ref来定义虚拟dom,用来操作子组件
const hello = ref(null)
const number_age = ref(null)

const helloClick = () => {

  console.log(hello.value.count) // 123456

  const age = hello.value.add()  //子组件的方法被调用了

  number_age.value = age

  console.log(hello.value.add())  //10
}


</script>

<style lang="scss" scoped>

</style>
Logo

前往低代码交流专区

更多推荐