Vue3中setup()的两个参数

本文介绍了Vue3中setup()函数的两个核心参数:props和context。详细解释了如何通过props接收父组件传递的属性,并展示了context对象如何帮助我们处理未声明的属性及如何使用emit触发自定义事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

setup()两个参数:

1.props:值为对象,包含:组件外部传递过来。切组件内部声明接收了的属性

2.context :上下文对象

  • attrs:值为对象,包含组件外部传递过来,但没有在props配置中声明的属性。相当于this.$attrs
  • slots:收到的插槽内容,相当于this.$slots
  • emit:分发自定义事件的函数,相当于this.$emit

props代码示例:

父组件代码:

<template>
  <div id="nav">
    <About :name="obj.name1" :age="obj.age1" ></About>
  </div>
</template>


<script>
  import About from './views/About'
  import Home from './views/Home'
    export default {
        name: 'App',
        setup(){
            let obj = {
                name1:'孙悟空',
                age1:11,
                name2:'沙和尚',
                age2:99,
            }

            return {
                obj
            }
        },



        components:{
            About,
            Home
        }
    }
</script>

<style lang="scss">

</style>

子组件代码:

<template>
    <div class="hello">
        <div>
            <h1>姓名:{{obj.name}}</h1>
            <h1>年龄:{{obj.age}}</h1>
            <h1>爱好:{{obj.hobby}}</h1>
        </div>
    </div>
</template>

<script>
    import {reactive} from  'vue'
    export default {
        name: 'About',
        props:['name','age'],
        setup(props) {
            console.log('---setup--- ',props)
            let obj = reactive({
                name:props.name,
                age:props.age,
                hobby:['游泳','音乐']
            });
            return {
                obj,
            }
        },

    }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

效果图:

context代码示例:

子组件代码:

<template>
    <div class="hello">
        <div>
            <h1>姓名:{{obj.name}}</h1>
            <h1>年龄:{{obj.age}}</h1>
            <h1>爱好:{{obj.hobby}}</h1>
            <button @click="test">点击传值</button>
        </div>
    </div>
</template>

<script>
    import {reactive} from  'vue'
    export default {
        name: 'About',
        props:['name','age'],
        setup(props,context) {
            // console.log('---setup--- ',props);
            console.log('---setup--- ',context);
            console.log('---setup--- ',context.emit);
            let obj = reactive({
                name:props.name,
                age:props.age,
                hobby:['游泳','音乐']
            });

            function test() {//通过context下面的emit进行事件传递
                context.emit('hello','子组件参数:哈哈哈')
            }

            return {
                obj,
                test
            }
        },

    }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

父组件代码:

<template>
  <div id="nav">
    <About :name="obj.name1" :age="obj.age1"  @hello="helloMsg"></About>
  </div>
</template>


<script>
  import About from './views/About'
  import Home from './views/Home'
    export default {
        name: 'App',
        setup(){
            let obj = {
                name1:'孙悟空',
                age1:11,
                name2:'沙和尚',
                age2:99,
            };
            
            function helloMsg(val) {//val就是子组件传递过来的参数
                alert(`触发了hello事件,我收到的参数是:${val}`)
            }
            
            return {
                obj,
                helloMsg
            }
        },



        components:{
            About,
            Home
        }
    }
</script>

<style lang="scss">

</style>

效果图:

以上就是setup参数的基本使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值