vue3中使用defineProps、defineEmits和defineExpose

一、defineProps

父组件通过 v-bind 绑定一个数据,然后子组件通过 defineProps 接受传过来的值。

父组件:

<template>
  <StudyDefineProps :title="title" />
</template>

<script setup lang="ts">
import { ref } from 'vue'
import StudyDefineProps from './views/components/studyDefineProps.vue'

const title = ref('题目')
</script>

1.子组件中接受父组件传过来的值 defineProps 

<template>
  <div>{{ title }}</div>
  <br />
  <div>{{ arr }}</div>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue'
// 接受父组件传过来的值defineProps
defineProps({
  title: {
    type: String,
    default: '标题'
  },
  arr: {
    type: Array,
    default: () => [1, 2, 3]
  }
})
</script>

结果:

2.结合 ts 使用:运行结果与上方相同

<template>
  <div>{{ title }}</div>
  <br />
  <div>{{ arr }}</div>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue'

// ts 特有定义默认值 withDefaults,第一个参数为props函数,第二个参数为一个对象设置默认值
withDefaults(
  defineProps<{
    title: string
    arr: number[]
  }>(),
  {
    arr: () => [1, 2, 3]
  }
)
</script>

这两种方法接收的值可以在模板中使用,但是不能用 js 调用,会报错。 

3.如果想要使用 js 调用,需要一个参数来接收

// 接受父组件传过来的值defineProps
const props = defineProps({
  title: {
    type: String,
    default: '标题'
  },
  arr: {
    type: Array,
    default: () => [1, 2, 3]
  }
})
console.log('props', props)

结合 ts 调用:

// ts 特有定义默认值 withDefaults,第一个参数为props函数,第二个参数为一个对象设置默认值
const props = withDefaults(
  defineProps<{
    title: string
    arr?: number[]
  }>(),
  {
    arr: () => [1, 2, 3]
  }
)
console.log('props', props)

结果:

二、defineEmits 

子组件给父组件传参,是通过 defineEmits 派发一个事件。

父组件:在父组件中通过 v-on 绑定一个事件。

<template>
  <StudyDefineProps :title="title" @handle-click="handleClick" />
</template>

<script setup lang="ts">
import { ref } from 'vue'
import StudyDefineProps from './views/components/studyDefineProps.vue'

const title = ref('题目')

const handleClick = (title: string) => {
  console.log('收到', title)
}
</script>

子组件:子组件中使用 defineEmits 注册了一个自定义事件,点击 click 触发 emit 去调用注册的事件,然后传递参数。父组件接受子组件的事件。

<template>
  <div>{{ title }}</div>
  <br />
  <button @click="changeParentData">修改父组件数据</button>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue'
const props = withDefaults(
  defineProps<{
    title: string
    arr?: number[]
  }>(),
  {
    arr: () => [1, 2, 3]
  }
)

const emit = defineEmits(['handleClick'])

const changeParentData = () => {
  emit('handleClick', '标题')
}
</script>

打印结果:

结合 ts 使用: 

const emit = defineEmits<{
  (e: 'handleClick', title: string): void
}>()

 三、defineExpose

父组件想要读到子组件的属性可以通过子组件 defineExpose 暴露。

子组件:

<template>
  <div>{{ title }}</div>
  <br />
  <button @click="changeParentData">修改父组件数据</button>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue'

// ts 特有定义默认值 withDefaults,第一个参数为props函数,第二个参数为一个对象设置默认值
const props = withDefaults(
  defineProps<{
    title: string
    arr?: number[]
  }>(),
  {
    arr: () => [1, 2, 3]
  }
)

const emit = defineEmits<{
  (e: 'handleClick', title: string): void
}>()

const changeParentData = () => {
  emit('handleClick', '标题')
}

defineExpose({
  name: '张三',
  age: () => console.log(18)
})
</script>

 父组件:这样父组件就可以读到了

<template>
  <StudyDefineProps ref="studyDefineProps" :title="title" @handle-click="handleClick" />
</template>

<script setup lang="ts">
import { ref } from 'vue'
import StudyDefineProps from './views/components/studyDefineProps.vue'

const studyDefineProps = ref<InstanceType<typeof StudyDefineProps>>()
const title = ref('题目')

const handleClick = (title: string) => {
  console.log('收到', studyDefineProps.value?.name, studyDefineProps.value?.age)
}
</script>

打印结果:

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Vue3defineProps用于定义组件的props属性,它接收一个对象作为参数,对象的属性即为props的名称,属性值为一个对象,用于指定props的类型、默认值、是否必传等信息。例如: ``` import { defineComponent } from 'vue' export default defineComponent({ props: { msg: { type: String, default: 'Hello World', required: true } }, setup(props) { // 使用props.msg } }) ``` 在上面的例子,我们定义了一个名为msg的props属性,它的类型为String,默认值为'Hello World',必传。在组件的setup函数,我们可以通过props.msg来访问这个属性的值。 ### 回答2: Vue3defineProps是用来定义props的新方式,相比于Vue2props,具有更多的优势。 使用defineProps,我们可以将props定义在组件的setup函数。在组件的props选项定义的props是在 beforeCreate 生命周期钩子函数被解析的,而使用defineProps定义的props是在组件的setup函数直接解析的。这意味着我们可以将props与组件的其余部分分开,并将其单独发布为可重用的函数。 使用defineProps方式非常简单,只需要在setup函数引入props对象即可: ``` import { defineComponent, defineProps } from 'vue'; const props = defineProps({ count: Number, message: String, }); export default defineComponent({ name: 'HelloWorld', props, setup(props) { console.log(props.count); console.log(props.message); return {} }, }); ``` 这里使用defineProps 方法来定义 props,它的参数是一个对象,对象属性名即 props 的名称、值是该 props 的数据类型。 我们还可以给 defineProps 传入一个第二个参数,来指定 props 验证失败时的默认值: ``` const props = defineProps( { count: Number, message: String, }, { count: 0, message: '', }, ); ``` 通过使用defineProps,我们可以更好地组织我们的代码,增加可重用性,并且在类型检查方面也更加强大。这是Vue3值得我们关注的新特性之一。 ### 回答3: Vue.js是一款流行的前端框架,而其最新版本,即Vue3,引入了一些新特性,其defineProps是最受欢迎的之一。这个特性的作用是使得父组件可以定义传递给子组件的props并限制其值的类型,从而增强了组件之间的通信。下面我将详细介绍在Vue3defineProps使用方法。 首先,我们需要知道defineProps是在子组件内部使用的一个函数,其基本语法如下: ``` import { defineProps } from 'vue' export default { props: defineProps({ //props的定义 }), //组件的其它定义 } ``` 接着,我们需要在defineProps函数定义props的类型、默认值和其他限制条件。下面是一些常见的props的定义示例: 1. 定义字符串类型的变量: ``` title: String, //可以为空 title: {type: String, default: 'Hello World'}, //指定默认值 title: {type: String, required: true} //必须传递 ``` 2. 定义数字类型的变量: ``` count: Number, count: {type: Number, default: 0}, count: {type: Number, required: true, validator: (value) => {return value > 0}} //自定义验证条件 ``` 3. 定义布尔类型的变量: ``` isOpen: Boolean, isOpen: {type: Boolean, default: false}, isOpen: {type: Boolean, required: true}, ``` 除了上面列出的几种数据类型外,Vue3还支持定义其他数据类型,如Object类型,Array类型等。 需要注意的是,在使用defineProps的过程,我们可以省略组件内的props分类定义,此时所有的props都应该在defineProps函数定义。 最后,我们需要在父组件以与以往相同的方式传递props,即使用v-bind指令将props值绑定到组件上。例如: ``` //父组件 <child-component :title="myTitle"></child-component> ``` 总而言之,definePropsVue3一个非常有用的特性。它可以增强组件之间的通信,并提高应用程序的可维护性和可扩展性。在实践,我们应该尽可能地使用defineProps来定义props,从而使代码更加具有可读性和可测试性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猛扇赵四那半好嘴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值