vue3的props与emit在语法糖与非语法糖中的使用

vue3的props与emit的使用(包含语法糖方式)

一、非语法糖中props

用于父组件接收(或触发)子组件利用组件属性传过来的数据(或方法),
触发(接收)子组件的方法(或数据)

1、父组件模板中是:

@click ="method"

2、而子组件模板中是:

method="method"

3、props的使用:在父组件中,setup之前。

多个需要以字符串形式被使用数组接收

props: ['title', 'likes', 'isPublished', 'commentIds', 'author']

校验类型需要被使用对象接收,

 props: {
    // 基础的类型检查 (`null` 和 `undefined` 值会通过任何类型验证)
    propA: Number,
    // 多个可能的类型
    propB: [String, Number],
    // 必填的字符串
    propC: {
      type: String,
      required: true
    },
    // 带有默认值的数字
    propD: {
      type: Number,
      default: 100
    },
    // 带有默认值的对象
    propE: {
      type: Object,
      // 对象或数组的默认值必须从一个工厂函数返回
      default() {
        return { message: 'hello' }
      }
    },
    // 自定义验证函数
    propF: {
      validator(value) {
        // 这个值必须与下列字符串中的其中一个相匹配
        return ['success', 'warning', 'danger'].includes(value)
      }
    },
    // 具有默认值的函数
    propG: {
      type: Function,
      // 与对象或数组的默认值不同,这不是一个工厂函数——这是一个用作默认值的函数
      default() {
        return 'Default function'
      }
    }

二、非语法糖中emit

用于子组件触发父组件的方法,此时父组件是@method1 = “method1”

1、子组件是:

1、常用用法:
setup(props,{emit}){

​	emit('method1',number1);//method1为自定义事件,触发父组件的方法,

//number为给父组件传递的参数,可有可无

}
2、数组用法:
export default {
    emits:['on-changeOne', 'on-changeTwo'],
    setup() {...}
}
3、对象用法
export default {
    emits:{
        click: null,
        'on-changeOne': payload => {
            if(...) {
                return true; // 验证通过
            }
            console.warn('验证失败!')
            return false; // 验证失败,控制台打印vue警告及“验证失败!”警告
        },
        'on-changeTwo': payload => {...}
    },
    setup() {...}

三、语法糖中导入组件

1、组件注册:语法糖中,导入组件不用注册,直接使用。

在 script setup> 语法糖中必须使用 definePropsdefineEmits API 来声明 props 和 emits

四、定义组件的 props

通过defineProps指定当前 props 类型,获得上下文的 props 对象。示例:

父组件:

:num=123

子组件:

	
	<script setup lang="ts">
	const props = defineProps({
	// 基础的类型检查 (`null``undefined` 值会通过任何类型验证)
	propA: Number,
	// 多个可能的类型
	propB: [String, Number],
	// 必填的字符串
	propC: {
	  type: String,
	  required: true
	},
	// 带有默认值的数字
	propD: {
	  type: Number,
	  default: 100
	},
	// 带有默认值的对象
	propE: {
	  type: Object,
	  // 对象或数组的默认值必须从一个工厂函数返回
	  default() {
	    return { message: 'hello' }
	  }
	},
	// 自定义验证函数
	propF: {
	  validator(value) {
	    // 这个值必须与下列字符串中的其中一个相匹配
	    return ['success', 'warning', 'danger'].includes(value)
	  }
	},
	// 具有默认值的函数
	propG: {
	  type: Function,
	  // 与对象或数组的默认值不同,这不是一个工厂函数——这是一个用作默认值的函数
	  default() {
	    return 'Default function'
	  }
	})

或

const props = defineProps({

​	props: ['title', 'likes', 'isPublished', 'commentIds', 'author']

})

</script>

五、语法糖中定义组件的 emits(自定义事件)

使用defineEmit定义当前组件含有的事件,并通过返回的上下文去执行 emit。示例:

子组件:

1、@click= "emitAddNum"

2<script setup lang="ts">

const emits = defineEmits(['add-num'])

3、function emitAddNum(){

​	emit("addNum")// 发出消息

}

</script>

父组件:

3、@add-num = "addNum"

4<script setup lang="ts">

function addNum(){

​	console.log("dfadf");

}

</script>
  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 的 emit 是一个语法糖,用于在子组件触发父组件的自定义事件。在 Vue 2 ,我们需要使用 $emit 方法手动触发事件,而在 Vue 3 ,我们可以通过 setup 函数的 emit 属性来简化这个过程。 首先,在父组件,你需要在模板使用 v-on 指令来监听自定义事件,并在事件处理程序定义相应的逻辑。例如: ```html <template> <button @click="handleClick">点击触发事件</button> <child-component @customEvent="handleCustomEvent"></child-component> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, methods: { handleClick() { // 处理点击事件逻辑 }, handleCustomEvent(payload) { // 处理自定义事件逻辑,payload 是子组件传递的参数 } } } </script> ``` 接下来,在子组件,你可以通过 `context.emit` 来触发父组件的自定义事件。例如: ```html <template> <button @click="emitCustomEvent">点击触发自定义事件</button> </template> <script> export default { setup(props, context) { const emitCustomEvent = () => { context.emit('customEvent', payload); }; return { emitCustomEvent }; } } </script> ``` 注意,在子组件,`context.emit` 是一个函数,它的第一个参数是要触发的事件名称,第二个参数是要传递给父组件的数据。 通过这种方式,你可以在 Vue 3 更方便地使用 emit 来触发父组件的自定义事件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值