vue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-model

目录

setup函数

props参数

案例

第一种写法(用setup函数的方式):

 第二种方法(语法糖形式即setup写入script标签中)也可以传值,

 context (attrs,emit,slots)

vue3中的双向数据绑定自定义事件emit和v-model

emit自定义事件

v-model


setup函数

有两个参数分别是props,context

 setup(props,context){
		  console.log(props,context)
	  }

props参数

props参数是一个对象,里面存有外部传入的属性

案例

第一种写法(用setup函数的方式):

父组件(这种写法父组件必须写components命名)

	
		

这是父组件的name:{{obj.name}}

import Box from "./Box.vue" //引入子组件 import { reactive } from 'vue'; export default{ components:{ //这种写法必须命名 Box }, setup(){ let obj=reactive({name:"小狮子",age:18}) return {obj} } }

子组件

	
		

33

这是子组件的age:{{age}}

这是子组件的name:{{name}}

export default{ props:["age",'name'], setup(props,context) { console.log(props,666) //打印props属性 } }

此时效果图为:

vue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-model说明传值成功

 且控制台打印:

vue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-model说明props参数为一个proxy对象,里面存有父组件传入的属性值

 第二种方法(语法糖形式即setup写入script标签中)也可以传值,

父组件:

	
		

这是父组件的name:{{obj.name}}

import Box from "./Box.vue" import { reactive } from 'vue'; let obj=reactive({name:"小狮子",age:18})

子组件(此时需要自己在script标签中将值传进来用 defineProps([ ])  )

	
		

33

这是子组件的age:{{obj.age}}

这是子组件的name:{{obj.name}}

let obj=defineProps(["age","name"]) // console.log(props,222)

效果一样

vue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-model

 context (attrs,emit,slots)

context:上下文对象

  • attrs: 值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性

  • slots: 写入插槽的内容

  • emit: 自定义事件函数

	  setup(props,context){
		  console.log(context.attrs,context.emit,context.slots)
	  }

vue3中的双向数据绑定自定义事件emit和v-model

emit自定义事件

下面只阐述语法糖形式的内容即setup写入script标签中的写法

注意:

    defineEmit  是vue3.2版本之前的用法

    useContext 3.2 但是废弃了 useContext函数的返回值有{emit,attr,}

    vue3.2版本之后用defineEmits

案例:子组件向父组件传值

父组件代码

	
		

这是父组件的name:{{obj.name}}

import Box from "./Box.vue" import { reactive } from 'vue'; let obj=reactive({name:"小狮子",age:18}) let fn=(arg1,arg2)=>{ obj.age=arg1 console.log("这是父组件的自定义事件","这是传入的值:",arg1,arg2) }

子组件(defineEmits可以不引入,3.2版本之后自带)

如果不用setup语法糖,用的setup函数中的参数context使用emit,即cotext.emit去使用

	
		

33

这是子组件的age:{{obj.age}}

这是子组件的name:{{obj.name}}

import {defineEmits} from "vue" //可以不引入 let obj=defineProps(["age","name"]) let emit=defineEmits() //如果用的setup函数则是用cotext.emit去使用 let fn1=()=>{ emit("mychange",11,22) //可以传参 //用setup函数则为context.emit("mychange",11,22) }

效果图

vue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-model

 点击按钮后界面后控制台的内容为

vue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-modelvue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-model

成功触发了自定义事件,还可以得出子组件向父组件传值可以用自定义事件

v-model

由上边的emit得知,v-model也是大致一样

//父组件

//子组件

1.接收参数:props:[“title”] (在语法糖中则是用defineProps([“title”]))

2.定义事件:emits: [‘update:title’] 必须写update

3.触发事件:this.$emit(“update:title”,”子组件传递给父组件的值”)

重点举例:多个 v-model 绑定

如:

 

案例:

父组件

	
		

这是父组件的msg:{{msg1}}--{{msg2}}--{{msg3}}

import Box from "./Box.vue" import { reactive,ref} from 'vue'; let obj=reactive({name:"小狮子",age:18}) let msg1=ref("大牛") let msg2=ref("大狮") let msg3=ref("大羊")

子组件

	

		

这是子组件的age:{{obj.age}}

这是子组件的name:{{obj.name}}

这是v-model传入的值:{{obj.msg1}}--{{obj.msg2}}--{{obj.msg3}}

import {defineEmits} from "vue" let obj=defineProps(["age","name","msg1","msg2","msg3"]) let emits=defineEmits() let fn1=()=>{ emits("update:msg1","小牛") //写多个传参,只生效第一个 } let fn2=()=>{ emits("update:msg2","小狮") //写多个传参,只生效第一个 }

效果图

vue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-model

 当我们分别点击两个按钮时:

vue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-model

 vue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-model

 说明双向数据绑定成功

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/cc66ae71b2.html