• 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

    1. setup(props,context){
    2. console.log(props,context)
    3. }

    props参数

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

    案例

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

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

    1. <script>
    2. import Box from "./Box.vue" //引入子组件
    3. import { reactive } from 'vue';
    4. export default{
    5. components:{ //这种写法必须命名
    6. Box
    7. },
    8. setup(){
    9. let obj=reactive({name:"小狮子",age:18})
    10. return {obj}
    11. }
    12. }
    13. script>

    子组件

    1. <script>
    2. export default{
    3. props:["age",'name'],
    4. setup(props,context) {
    5. console.log(props,666) //打印props属性
    6. }
    7. }
    8. script>

    此时效果图为:

    说明传值成功

     且控制台打印:

    说明props参数为一个proxy对象,里面存有父组件传入的属性值

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

    父组件:

    1. <script setup>
    2. import Box from "./Box.vue"
    3. import { reactive } from 'vue';
    4. let obj=reactive({name:"小狮子",age:18})
    5. script>

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

    1. <script setup>
    2. let obj=defineProps(["age","name"])
    3. // console.log(props,222)
    4. script>

    效果一样

     context (attrs,emit,slots)

    context:上下文对象

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

    • slots: 写入插槽的内容

    • emit: 自定义事件函数

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

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

    emit自定义事件

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

    注意:

        defineEmit  是vue3.2版本之前的用法
        useContext 3.2 但是废弃了 useContext函数的返回值有{emit,attr,}
        vue3.2版本之后用defineEmits

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

    父组件代码

    1. <script setup>
    2. import Box from "./Box.vue"
    3. import { reactive } from 'vue';
    4. let obj=reactive({name:"小狮子",age:18})
    5. let fn=(arg1,arg2)=>{
    6. obj.age=arg1
    7. console.log("这是父组件的自定义事件","这是传入的值:",arg1,arg2)
    8. }
    9. script>

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

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

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

    效果图

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

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

    v-model

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

    //父组件

    //子组件
    1.接收参数:props:["title"] (在语法糖中则是用defineProps(["title"]))
    2.定义事件:emits: ['update:title'] 必须写update
    3.触发事件:this.$emit("update:title","子组件传递给父组件的值")

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

    如:

     

    案例:

    父组件

    1. <script setup>
    2. import Box from "./Box.vue"
    3. import { reactive,ref} from 'vue';
    4. let obj=reactive({name:"小狮子",age:18})
    5. let msg1=ref("大牛")
    6. let msg2=ref("大狮")
    7. let msg3=ref("大羊")
    8. script>

    子组件

    1. <script setup>
    2. import {defineEmits} from "vue"
    3. let obj=defineProps(["age","name","msg1","msg2","msg3"])
    4. let emits=defineEmits()
    5. let fn1=()=>{
    6. emits("update:msg1","小牛") //写多个传参,只生效第一个
    7. }
    8. let fn2=()=>{
    9. emits("update:msg2","小狮") //写多个传参,只生效第一个
    10. }
    11. script>

    效果图

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

     

     说明双向数据绑定成功

  • 相关阅读:
    VMware 中 Centos7 安装 Hyperledge Fabric v2.4.4 测试网络
    uCOSii系统的中断管理
    探索Python的文本转换魔法:html2text库的奥秘
    C#应用处理传入参数 - 开源研究系列文章
    【Linux】UDP协议
    深入理解和把握数字经济的基本特征
    【C语言经典100题#4】判断三角形
    springboot专利申请服务平台毕业设计源码260839
    Appium 点击操作梳理
    解决Spring Boot 2.7.16 在服务器显示启动成功无法访问问题:从本地到服务器的部署坑
  • 原文地址:https://blog.csdn.net/m0_63470734/article/details/126959167